Android-разработка: как начать, лучшие практики и интересные фишки

Содержание

Слайд 2

Splash activity Uncaught exception handling + logging Кастомизация билд-системы android-проекта Автоматизированное

Splash activity
Uncaught exception handling + logging
Кастомизация билд-системы android-проекта
Автоматизированное UI-тестирование (Selenium like)
Декомпиляция

apk-файлов
Начинающим разработчикам

О чём сегодня расскажу

Слайд 3

Splash activity Задача при запуске приложения загрузить какие-либо данные с сервера,

Splash activity

Задача
при запуске приложения загрузить какие-либо данные с сервера, либо

синхронизироваться с сервером
Splash activity
входная точка приложения, выполняет эти операции, потом переходим на главный скрин приложения
Слайд 4

Splash activity public class Splash extends GenericActivity { @Override public void

Splash activity

public class Splash extends GenericActivity {
@Override public void onCreate() {
//

Можем показывать пользователю картинку либо progress bar пока идёт загрузка setContentView(R.layout.splash);
new AsyncTask () { @Override protected void doInBackground() {
synchronizeWithServer();
loadData();
// Из AsyncTask можно обновлять UI c помощью
// publishProgress(int progress);
} @Override protected void onPostExecute() { // После выполнения синхронизации запускаем
// главный скрин приложения
startActivity(MainActivity.class); } }.execute(); }
}
Слайд 5

Uncatched exception handling + logging Логирование в файл во время работы

Uncatched exception handling + logging

Логирование в файл во время работы приложения
Обработчик

для uncaught исключений. Отправка e-mail с логами при возникновении исключения. Удобно для отладки.

Thread.setDefaultUncaughtExceptionHandler(new DebugExceptionHandler());
public class DebugExceptionHandler implements UncaughtExceptionHandler { @Override
public void uncaughtException(Thread thread, Throwable throwable)
{
// Логируем ошибку, пишем в лог-файл
Logger.e(getClass(), getStackTrace(throwable));
// Отправляем отчёт на почту
Logger.sendReport(); // Удаляем log-файл Logger.clear(); } }

Слайд 6

Задача приложение с большим объёмом графики, нужна поддержка устройств с различными

Задача
приложение с большим объёмом графики, нужна поддержка устройств с различными разрешениями,

для которых много графики различается
Версии
320x240, 480x320, 800x480, 1024x600 (android 2 и 3), 1280х768 (android 2 и 3)
Объём графики: 4 Мб для каждой версии
Общая графика: 1.5 Мб
Графика для каждого разрешения: 2.5 Мб
Итого: 19 Mб!
в основном не нужная пользователю графика пользователь не захочет скачивать приложения из-за большого объёма
При добавлении новых разрешений устройств, объём приложения будет только расти

Кастомизация билд-системы андроид проекта

Слайд 7

Кастомизация билд-системы андроид проекта Решение отдельная apk для каждого разрешения только

Кастомизация билд-системы андроид проекта

Решение
отдельная apk для каждого разрешения только со своей

графикой
Реализация
Сборка приложения ant-скриптом с подставлением нужной графики,
bat-файл для сборки семи apk
Слайд 8

Apache Ant Утилита для автоматизации сборки приложений (аналог утилиты make в

Apache Ant

Утилита для автоматизации сборки приложений (аналог утилиты make в UNIX)
Процесс

сборки описывается в XML-файле build.xml
http://ant.apache.org/
Слайд 9

Apache Ant Targets (функции) Откомпилировать весь проект, очистить временные файлы, …

Apache Ant

Targets (функции)
Откомпилировать весь проект, очистить временные файлы, …
Между ними можно

устанавливать зависимости
Tasks (элементарные действия)
javac – откомпилировать java-код
copy – скопировать файлы
delete – удалить файлы
exec – вызвать программу и т.д.
Слайд 10

Пример Ant сценария

Пример Ant сценария


       

location="${basedir}/res"/>                                                                                                                            
Слайд 11

Сборка android-приложения http://asantoso.wordpress.com

Сборка android-приложения

http://asantoso.wordpress.com

Слайд 12

Дорабатываем стандартные скрипты Скрипты находятся в папке с SDK …/Android/android-sdk/tools/ant Типы

Дорабатываем стандартные скрипты

Скрипты находятся в папке с SDK
…/Android/android-sdk/tools/ant
Типы скриптов:
main_rules (приложения)
test_rules

(тестовые проекты)
lib_rules (библиотеки)
Targets, которые можно переопределить
-pre-build (перед началом сборки)
-pre-compile
-post-compile
Слайд 13

Структура файлов MyAndroidApplication /android2 /res_320x240 /drawable /values /res_480x320 /res_800x480 /res_1024x700 /res_1280x768

Структура файлов

MyAndroidApplication /android2 /res_320x240 /drawable /values /res_480x320 /res_800x480 /res_1024x700 /res_1280x768 /src
/assets /bin /build /gen /src /res /drawable /values /lib AndroidManifest.xml build.xml

Скрипт копирует содержимое res_320x240 в res и выполняет сборку

приложения
Слайд 14

Bat-файл сборки нескольких версий call ant release -Dresolution.current=320x240 -Dsdk.current=android2 call ant

Bat-файл сборки нескольких версий

call ant release -Dresolution.current=320x240 -Dsdk.current=android2 call ant release

-Dresolution.current=480x320 -Dsdk.current=android2 call ant release -Dresolution.current=800x480 -Dsdk.current=android2 call ant release -Dresolution.current=1024x600 -Dsdk.current=android2 call ant release -Dresolution.current=1280x768 -Dsdk.current=android2 call ant release -Dresolution.current=1024x600 -Dsdk.current=android3 call ant release -Dresolution.current=1280x768 -Dsdk.current=android3

Собираются семь apk-файлов за один запуск!

Слайд 15

Автоматизированное UI-тестирование андроид-приложений Robotium

Автоматизированное UI-тестирование андроид-приложений Robotium

Слайд 16

Robotium Как Selenium, только для Android Пишем тест-кейсы, фреймворк прокликивает приложение

Robotium

Как Selenium, только для Android
Пишем тест-кейсы, фреймворк прокликивает приложение
Не обязательно иметь

исходный код приложения, достаточно apk
http://code.google.com/p/robotium
Слайд 17

Пример использования Robotium public class MyApplicationUITest extends ActivityInstrumentationTestCase2 { private Solo

Пример использования Robotium

public class MyApplicationUITest extends ActivityInstrumentationTestCase2 { private Solo solo; public NotePadTest()

{ super("com.mycompany.myapp.activity", MyActivity.class); } public void setUp() throws Exception { solo = new Solo(getInstrumentation(), getActivity()); }
// Тут пишем тесовые методы
@Override public void tearDown() throws Exception { try { //Robotium will finish all the activities that have been opened solo.finalize(); } catch (Throwable e) { e.printStackTrace(); } getActivity().finish(); super.tearDown(); }
}
Слайд 18

Пример использования Robotium @Smoke public void testAddNote() throws Exception { //

Пример использования Robotium

@Smoke public void testAddNote() throws Exception { // Go to help

page ImageView navigation = (ImageView) solo.getView(R.id.view_navigation); // View about screen solo.clickOnView(navigation); solo.assertCurrentActivity("help", HelpActivity.class); // Return from help to main screen TextView title = (TextView) solo.getView(R.id.view_navigation_title); solo.clickOnView(title); solo.assertCurrentActivity("MyActivity", MyActivity.class); }

Пример тестового метода

Слайд 19

Robotium: Black box и White box Black box не знаем кода

Robotium: Black box и White box

Black box
не знаем кода приложения

и id элементов интерфейса
White box
есть исходный код, знаем id элементов пользовательского интерфейса
сложней, если id меняются
больше возможностей
Слайд 20

Robotium: основные методы assertCurrentActivity(String message, Class expected) clickLongOnScreen(int x, int y)

Robotium: основные методы

assertCurrentActivity(String message, Class expected)
clickLongOnScreen(int x, int y)
clickOnScreen(int x, int

y)
ArrayList getAllOpenedActivities()
sleep(int time)
clickOnView(View view)
enterText(EditText editText, String text)
В документации ещё много интересных штук!
drag(float fromX, float toX, float fromY, float toY, int stepCount)
Слайд 21

Декомпиляция APK-файлов Хочу посмотреть, как у них сделано… Распаковываем apk-файл обычным

Декомпиляция APK-файлов

Хочу посмотреть, как у них сделано…
Распаковываем apk-файл обычным winrar-ом classes.dex,

xml: binary, картинки
Декомпилируем classes.dex dex2jar (open source) http://code.google.com/p/dex2jar
Просмотр jar-файлов JDGui (open source) http://code.google.com/p/android-apktool/
Декомпиляция xml-файлов Apktool (open source) http://code.google.com/p/android-apktool/
Слайд 22

Начинающим разработчикам Enviroment Android SDK, Eclipse + ADT plug-in, драйвера на

Начинающим разработчикам

Enviroment Android SDK, Eclipse + ADT plug-in, драйвера на телефон
Что почитать developer.android.com

– туториалы, документация vogella.de/android.html – хорошие туториалы stackoverflow.com – часто пользуюсь этим сайтом
Базовые понятия Activity, Intent, layouts (LinearLayout, RelativeLayout) работа с ресурсами (string, dimen, images, layouts) AndroidManifest.xml
Core Java ООП, паттерны проектирования, unit-тестирование (JUnit 3,4)
Девайс или эмулятор