вторник, 29 марта 2011 г.

Отладка Android-приложения на устройстве

Если отладки на эмуляторе в данном случае недостаточно или просто надоели тормоза эмулятора - выход есть: отладка непосредственно на смартфоне. Организация такой работы достаточно подробно описана и хорошо поддерживается платформой. Напишу тут только несколько особенностей, чтобы не забыть.
Во-первых: подключаем смартфон usb-кабелем.
Во-вторых: включаем в настройках вашего девайса возможность отладки (Настройки->Приложения->Разработка->Разрешить отладку по usb).
В-третьих: выполняем lsusb чтобы получить idVendor и idProduct вашего девайса. (он должен быть, естественно, подключен). 
В-четвёртых:
$ sudo gedit /etc/udev/rules.d/51-android.rules
и пишем туда строку:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0c01", MODE="0666"
В idVendor и idProduct подставляем ваши значения. 
Сохраняем. Выполняем:
/etc/init.d/udev reload
Переподключаем устройство и наслаждаемся отладкой ;)
Кстати, не забываем указать в AndroidManifest.xml android:debuggable="true" в теге application.
Более подробная инструкция здесь.

четверг, 17 марта 2011 г.

Готовим приложение к загрузке в AndroidMarket

Писать приложения под Andriod очень интересно. Но однажды наступает момент, когда приложение уже отлажено и протестировано под виртуальными и реальными устройствами. И хочется "подарить его миру". Регистрируемся в Market-е, готовим скриншоты и описания, трепетной рукой загружаем .apk... И получаем что-то вроде "The icon path specified by the manifest is not in the apk", или того хуже: "Market does not accept apks signed with the debug certificate".
Реальность как бы намекает, что написать приложение мало, надо его ещё и собрать правильно. 
Первая ошибка обескураживает: "Как же нет иконки? Я ж её вижу!". Переносим объявление android:icon из тега activity в тег application и всё становится на свои места. 
Вторая ошибка заставит нас пройти непростой но очень полезный путь...
Что нам понадобится?
  1. Java jdk - он у нас есть, иначе бы мы ничего не написали :)
  2. Android sdk - аналогично
  3. apkTool - очень полезная, как оказывается, утилита. Скачивается двумя архивами под соответствующую платформу. В одном jar, в другом запускающий скрипт и бинарник aapt, который требуется для сборки apk
Шаг 1. Делаем сертификат.
Идём в bin директорию вашего jdk. Выполняем команду:
./keytool -genkey -v -keystore <имя файла вашего нового хранилища ключей> -alias <имя вашего нового ключа> -keyalg RSA -keysize 2048 -validity 10000
Отвечаем на вопросы "личного характера" :) и получаем хранилище с ключом, который лучше не терять.

Шаг 2. "Разбираем" apk
Распаковываем apktool в любой каталог кроме домашнего. В домашнем каталоге apktool создаст каталог с таким же именем. Распаковываем своё приложение без декомпиляции исходников:
apktool d -s <ваш .apk>
В текущем каталоге будет создан каталог по имени apk-файла. В нём находим AndroidManifest.xml и проводим его инспекцию. В теге manifest должны обязательно присутствовать атрибуты:

android:versionCode = "1"
android:versionName = "1.0"
android:installLocation="auto"

Первые два служат для отображении версии в Market-е, третий позволит перенести приложение на CD-карту в версиях старше 2.
Для определения минимально допустимой версии Android обязательно должен присутствовать тег:

 <uses-sdk android:minSdkVersion="3" />


Версии sdk определяем по простой табличке, которую берём отсюда.

Platform VersionAPI Level
Android 3.011
Android 2.3.310
Android 2.39
Android 2.28
Android 2.17
Android 2.0.16
Android 2.05
Android 1.64
Android 1.53
В теге application должен быть атрибут android:label="<имя приложения>"  и не должно быть android:debuggable="true".
В теге activity должны присутствовать атрибуты:
android:label="<имя приложения>"  
android:icon="<иконка приложения>"  
android:name="<имя окна>"

Шаг 3: "Собираем" apk
Тут всё просто:
apktool b <каталог с разобранным .apk> <ваш новый .apk>


Шаг 4: Подписываем приложение
Тут кстати, вспоминаем про сгенерированный на первом шаге ключ, переходим в каталог bin вашего jdk и выполняем:
./jarsigner -verbose -keystore  <ваше хранилище ключей> <ваш .apk> <алиас ключа из хранилища>

Шаг 5: Упаковываем apk
Переходим в каталог tools Android sdk и выполняем команду:
./zipalign -v 4 <неупакованный .apk> <окончательный вариант .apk>