Про HTC (Android 4.4.2) и setWebContentsDebuggingEnabled

Обнаружил весьма странное поведение у HTC-устройств с Android 4.4.2 — невозможно провести удаленную отладку Android WebView.

Я уж начал грешить, что проблема в моих руках, хотя выполнил все условия, описанные в официальном мануале (раздел «Debugging Android WebViews»). Как я не старался, но заставить Chrome увидеть запущенный WebView из под приложения, мне не удалось. Потом решил попробовать запустить все это дело на Google Nexus 4 (Android 4.4.2) и… все заработало.

Вот так-то… Там работает, тут не работает…

[Android] Подключение к ADB через Wi-Fi (через TCP)

ADB умеет подключаться к устройствам не только через USB, но и через TCP. Порой, это бывает весьма полезным.

1. Подключаем устройство через USB, а в консоль вводим команду adb tcpip 5555. В ответ будет выведена фраза «restarting in TCP mode port: 5555».
2. Отключаем устройство от USB, в консоль вводим команду adb connect <ip>:<port>, где <ip> — это адрес устройства, а <port>  в нашем случае — 5555. В ответ должна появится фраза «connected to 192.168.1.10:5555».

Во многих случаях достаточно выполнить лишь пункт 2 (т.е. бе предварительного подключения устройства по USB).

Проверяем, что устройство видно:

# adb devices
List of devices attached
192.168.1.10:5555 device

Соединение по TCP автоматически завершится в тот момент, когда вы подключите это устройство через USB. Также можно вручную указать ADB слушать только USB:

# adb usb

[iOS] Как программно обнаружить Jailbreak

Задумался вопросом — а каким образом некоторые iOS-приложения обнаруживают, что в системе произведен Jailbreak? Мало того, что некоторые приложения, вроде Skype просто показывают предупреждающее сообщение об этом, так некоторые вообще отказываются работать (к примеру, DirectTV). Почему отказываются? Думаю, тут все понятно — разработчики просто не хотят брать на себя бремя технической поддержки, ломая голову над тем, почему у пользователя глючно работает их вроде бы тщательно протестированная программа. Сам-то пользователь редко скажет, что у него сделан Jailbreak, а если и скажет, то разработчики вправе отказаться от предоставления в помощи, т.к. нет смысла поддерживать такие окружения, в которых любой сторонний мод может привести к нестабильному поведению не только отдельно взятого приложения, но и всей системы.

Вернемся же к вопросу — как обнаружить, что был Jailbreak? Обычно вместе с Jailbreak ставятся дополнительные утилиты и приложения, вроде таких как Cydia, MobileSubstrate и WinterBoard. Таким образом, с помощью несложного условия if — else можно в своем приложении написать участок кода, который будет детектить Jailbreak. Вот так и решается этот, на первый взгляд, сложный вопрос довольно примитивным методом.

[Android] Как узнать название пакета и activity из apk-приложения

Задача: узнать название пакета Android-приложения в формате apk и запускаемого активити.

Решение:

Способ 1

Можно взять и открыть AndroidManifest.xml, чтобы посмотреть нужные данные, к примеру, через команду cat:

cat <path_to_apk>

Пример вывода:

versionCode
minSdkVersiontargetSdkVersionnameprotectionLevel versionName
allowBackuphardwareAcceleratediconlabelthemescreenOrientation
launchMode
permissionvalueandroid*http://schemas.android.com/apk/res/
androidpackagmanifestcom.mobileshop2.uses-sdkuses-permissionandroid.
permission.INTERNETandroid.permission.WAKE_LOCK)android.permission.
ACCESS_COARSE_LOCATIONandroid.permission.VIBRATE)com.mobileshop.
permission.C2D_MESSAGE*com.google.android.c2dm.permission.RECEIVE
applicatioactivitycom.intent-filteractionandroid.intent.action.
MAIcategory android.intent.category.LAUNCHEreceiver'com.mobileshop.
GcmBroadcastReceiver'com.google.android.c2dm.permission.SEND&com.
google.android.c2dm.intent.RECEIVEservice#com.mobileshop.
GcmIntentService meta-dataserver_addresshttp://mobileshop.com/D

Большая часть содержимого файла AndroidManifest.xml является нечитабельной, т.к. сам файл является двоичным, а то, что поддается чтению, имеет не самый удобный формат для восприятия. Мы видим, что имя пакета имеет название com.mobileshop, но мы не видим название запускаемого активити.

Способ 2

Можно воспользоваться услугами утилиты AAPT (Android Asset Packaging Tool), которая представляет из себя  упаковщик для сборки приложения, библиотек и ресурсов в единый apk-файл. Утилита входит в состав Android SDK и располагается в моем случае в директории /Applications/AndroidSDK/build-tools/17.0.0/.

Чтобы узнать название пакета apk-приложения:

./aapt dump badging <path_to_apk> | grep "package"

Пример вывода:

package: name='com.mobileshop' versionCode='13' versionName='2.0'

Чтобы узнать название запускаемого активити apk-приложения:

./aapt dump badging /User/Desktop/HTC_Market_v2.0.apk | grep "launchable-activity"

Пример вывода:

launchable-activity: name='com.mobileshop.MainActivity' label='Mobile Shop' icon=''

Google Play — ошибка 923

Столкнулся с проблемой, что попытка установить/обновить приложения из Google Play заканчивалась ошибкой 923. Оказывается, причиной тому являлось, что в то время, когда приложение загружалось, устройство переходило в неактивный режим и связь с Wi-Fi обрывалась (т.к. у меня была задействована соответствующая опция). Хотя, на месте Google, я бы все выводил более информирующие сообщения об ошибках, а не тупо их коды.

Про покупку iPad Air #2

Идет вторая неделя, как я с новым iPad Air.

Как уже писал в предыдущей заметке, заказ оформил через официальный App Store. Доставка заняла где-то 1,5 недели. Курьер позвонили на прошлой недели в понедельник, сказал, что готов привести посылочку, однако в тот день я ее принять не мог, о чем и сообщил курьеру. Он сказал, что для переноса дня доставки нужно позвонить в их службу доставки и дал номер телефона. Оказалось, что это курьерская служба TNT, на сайте которой как раз написано, что они занимаются доставками товаров Apple. Позвонил, сказал, что готов принять посылку уже завтра, во вторник. Во вторник вновь звонок от курьера. И вот я уже с iPad Air.

Упаковка полностью цела, хотя на задней крышке планшета мне сделали гравировку. Т.е. по идее, они должны были достать планшет из упаковки, сделать гравировку, и лишь затем вновь его упаковать. Хотя, возможно, эта процедура немного отличается от той, которую я описал. Кстати, в сети читал комментарии, что после вскрытия упаковки оказывалось, что экран iPad’а весь заляпан, и на поверхности видны остатки клея. Но я, к счастью, избежал такой участи.

Про покупку iPad Air

Общие впечатления: планшет стал легче и меньше в размерах — очень непривычно. Скошенные края по периметру выглядят, по-моему, ужасно. Мало того, что это просто не красиво, так эти срезы настолько отшлифованы, что всегда блестят. Производительность — в браузере Chrome (Safari не пользуюсь) страницы стали открываться очень быстро по сравнению с тем, что происходило на iPad 3. Но! Самопроизвольные падения браузера никуда не делись — все также при попытке открыть еще одну вкладку приложение аварийно завершает свою работу. Грешу на 1 ГБ памяти в планшете. Камера — не знаю что не так, но снимки получаются слишком зашумленными, а для меня это весьма критично, т.к. я часто делаю фотографии через камеру на планшете. Нужно тестить дальше…

[iOS] Просмотр системных логов

Существует несколько способов просмотреть логи с iOS-устройства.

1. Через само устройство — в этом случае посмотреть можно лишь только краш-репорты (crashlog), но ведь это самое то для тестировщика! Идем в «Settings» -> «General» -> «About» -> «Diagnostic & Usage» -> «Diagnostic & Usage Data» и смотрим все доступные отчеты о падении приложений. Единственная проблема заключается в том, что здесь нет удобного средства для экспорта этих самых отчетов. Тем не менее, при крайней необходимости можно скопировать нужный участок лога через стандартную функцию копирования текста.

2. Через XCode — к сожалению, среда разработки XCode доступна исключительно для MacOS. По этой и многим другим причинам было бы неплохо, если тестировщики iOS-приложений имели в своем распоряжении хотя бы Mac mini. Для просмотра краш-репортов нужно подключить iOS-устройство к компьютеру, нажать кнопку «Use for Development», после чего в разделе «Device Logs» уже можно непосредственно просматривать логи и, что не маловажно, импортировать их!

Просмотр системных логов с iPhone и iPad

3. Через программу «iPhone Configuration Utility» — хотя основная функция этой утилиты заключается в настройки профилей для iOS-устройств, в ней имеется консоль, куда выводятся все логи с подключенного устройства. Незаменимая вещь для тестировщика. К тому же, утилита доступна и для Windows.

Просмотр системных логов с iPhone и iPad

4. Через синхронизацию iTunes — каждый раз, когда вы синхронизируете свое iOS-устройство с iTunes на компьютере, логи сохраняются в следующие директории:

Mac OS X:
~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>

Windows XP
C:\Documents and Settings\<USERNAME>\Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>

Windows Vista or 7
C:\Users\<USERNAME>\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>

[Android] Waiting for device

Иногда бывает, что adb видит сразу несколько устройств — к примеру, эмулятор и реальное устройство, подключенное к компьютеру, из-за чего выполнять команды становится невозможным (будет писаться waiting for device).

# adb devices
List of devices attached
emulator-5554 device
HT9TWA12709 device

Допустим, вам нужно работать с реальным устройством, но подключенный эмулятор вроде как не позволяет это сделать.

Есть два выхода:

1. Указывать ключ -d, если хотим использовать реальное устройство (подключенное через USB) или ключ -e, если хотим использовать эмулятор
2. Выполнить команду adb -e reboot bootloader, которая в данном уберет эмулятор из списка

[Android] Изменение host-файла

Задача: добавить в host-файл свою запись

Элегантное решение на примере эмулятора:

1. Запустить эмулятор: emulator -avd <EmulatorName> -partition-size 256

2. Выполнить команду adb shell

3. И последний этап: echo 127.0.0.1 NewHost >> /etc/hosts

Возможные проблемы из-за отсутствия Google Play services

Наша команда сейчас работает над одним Android-приложением. Дали мне его на тестирование. Пробую запустить на своем телефоне -> приложение сразу же аварийно завершает работу. В логах:

E/AndroidRuntime(5342): at com.htc.mobileshop.MainActivity.checkPlayServices(MainActivity.java:215)

Запускаю на другом устройстве -> ошибки нет, все стартует нормально. Так что же это может быть? Оказывается, не так давно я удалил со своего телефона системное приложение «Google Play services» за ненадобностью. И вот, как оказалось, что если не обрабатывать исключения, связанные с невозможностью обнаружить Play services, мы можем получить ситуацию, что наше приложение сразу же будет крашиться. А вот, к примеру, приложение Foursquare при своем запуске сразу же оповещает пользователя о том, что для дальнейшей работы с приложением необходимо установить «Google Play services».