Установка Android Studio, настройка SDK. В диалоге выбираем новое устройство для запуска. Появляется вот такой диалог

Так как мы пишем под Android, то и для запуска приложений нам понадобиться смартфон под его управлением, но, конечно же, есть эмулятор и вы уже даже скачали его вместе с Android Studio. Правда, работает он не сразу из коробки и придётся немного настроить его. В этой статье мы это и сделаем.

Виртуальные Android-девайсы

Виртуальные Android-девайсы необходимы для тестирования приложений без установки их на реальные устройства, для сокращения их называют AVD (от английского Android Virtual Device). Они могут быть сконфигурированы для эмуляции различных аппаратных характеристик таких как разные размеры экрана, объемы памяти, наличие или отсутствие камер, поддержка GPS навигации или акселерометра. При стандартной установке Android Studio устанавливается набор шаблонов устройств по умолчанию, в основном, это телефоны Nexus, позволяющие на их основе создавать свои AVD. Можно также скачивать дополнительные шаблоны или создавать свои, чтобы они соответствовали каким-либо Android-девайсам по типу процессора, объему памяти, плотности пикселей и размеру экрана.

При запуске AVD выглядит как окно, эмулирующее устройство. Для примера фото ниже.

Создание AVD

Новые AVD создаются и управляются в Android Virtual Device Manager, с которым можно работать как в командной строчке, так и в удобном графическом интерфейсе. Запустить менеджер можно из Android Studio выбрав опцию меню Tools -> Android -> AVD Manager. В рамках данной статьи мы не будем рассматривать работу через командную строчку.

Запустив AVD Manager, нажмите кнопку "Create a virtual device", появится окно конфигурации виртуального устройства.


Для примера создадим эмулятор Nexus S. Мы выбираем его, потому что у него довольно маленький экран, а значит при запуске виртуального девайса процессор будет менее загружен. Нам совсем не нужен большой экран для Hello World, впоследствии вы, конечно, можете создать себе свой экземпляр и работать с более приближенными к реальности конфигурациями.

Как видите есть несколько вкладок для различных категорий устройств, нам нужна вторая под именем Phone. На ней выбираем первую же строчку, Nexus S, нажимаем Next и ждём окончания установки. После этого появится окно настроек:


Здесь можно задать название и разнообразные настройки. Давайте, ничего не будем трогать и просто нажмём Finish. На этом создание нового AVD закончено.

Запуск AVD

Чтобы запустить эмулятор просто нажмите на зелёный треугольник напротив его названия на главной странице AVD Manager. Запуск, особенно первый, занимает довольно много времени. Для ускорения последующих запусков уберите галочку "Use Host GPU" и поставьте напротив "Store a snapshot for faster startup".

Snapshot это что-то вроде снимка состояния эмулятора, который загружается при запуске виртуального устройства и позволяет сократить время запуска до нескольких секунд. Включить эту функцию можно только при отключении опции "Use Host GPU".

Также для ускорения разработки можно не выключать эмулятор при работе в Android Studio, чтобы при каждом запуске приложения не было бы необходимости ожидать его запуска, студия поймёт, что запускать необходимо уже в работающем эмуляторе.

Заключение

Теперь у нас есть всё необходимое для написания первого приложения под Android. В следующей статье мы уже запустим его.

Для того чтобы писать приложения для OS Android вам понадобится установить среду разработки Android Studio(далее в тексте AS). Вы спросите, почему именно AS а не Eclipse? Среда разработки Eclipse работает намного быстрее, и весит меньше, чем Android Studio,

но Google "рекомендует" использовать AS, так как в будущем он перестанет(вернее уже) перестал ее поддерживать. За Android Studio будущее, так сказать. У вас должен быть достаточно мощный компьютер, желательно x64 разрядный, так как AS использует около 3 ГБ оперативной памяти, добавьте сюда еще 3 ГБ на эмулятор андроид устройства... На моем ПК установлена win 8.1 pro x64, двуядерный процессор Intel 3.3 ГГц, с 8 ГБ оперативной памяти, и я чувствую себя вполне свободно...

Заходим на официальный сайт по ссылке https://developer.android.com/studio , качаем последнюю версию необходимой разрядности. На сегодня актуальная версия android-studio-2-1-2,

весить она будет примерно 1,2 Гб. Так что запаситесь терпением, если у вас медленный интернет.

После загрузки запустим программу установки android-studio-2-1-2.exe,

мастер установки пошагово предложит определить состав установки,

принять лицензию,

выбрать место установки,

Снова ждем окончания установки.

После этого запустим Android Studio с рабочего стола, или из меню,

и нажмем кнопку Configure для настройки SDK. Вы увидите список установленных версий android,

под которые можете создавать приложения, желательно чтоб они были все. Если какие то версии не установлены, то жмем на ссылку Launch Standalone SDK Manager для установки и обновления пакетов.

Откроется менеджер SDK,

поставьте галочки на те пункты, которые необходимо, как узнать на какие именно? Менеджер SDK вам в этом поможет, отметив необходимые пакеты версий. Затем нажмите на кнопку в правом нижнем углу с надписью Instal 1 (1..100) package..

В вашем случае количество пакетов будет другое. Если вы лично, или то место где вы проживаете, находится под "западными санкциями", то для обновления пакетов, зайдите в меню Tools->Options...,

где можно указать адрес и порт прокси сервера,

1. Необходимо установить JDK (Java Development Kit) и JRE (Java Runtime Environment).
Раньше Android SDK поддерживал только JDK версии 6, но теперь это в прошлом. Поддерживается 7 и даже 8 (по крайней мере, именно 8-ю версию я указал в качестве JAVA_HOME и в настройках Android Studio, и никаких проблем не испытал).
JRE же нужен для запуска самой студии. У меня она использует версию 7.
Скачать JDK и JRE версий больше 6 можно с сайта Oracle .

Переменную JAVA_HOME теперь, вроде бы, можно не устанавливать, так как в Android Studio мы будем в настройках прописывать путь к JDK. Но я ее установил. Для этого нужно:

  • Зайти в , выбрать слева , в открывшемся диалоге найти кнопку Переменные среды .
  • Создать системную или пользовательскую переменную JAVA_HOME и указать для нее путь к JDK. У меня указан вот такой путь: C:\Program Files\Java\jdk1.8.0_05 .
2. Если у вас установлен Android SDK.
В комплекте с Android Studio идет свой Android SDK. И, если вы хотите использовать именно его, то в некоторых случаях может случиться странное. Например, у меня при обновлении SDK через SDK Manager часть файлов записывалась в старую папку, и возникли проблемы, когда я эту папку удалил. Скорее всего это произошло из-за того, что в реестре хранился ключ с путем к старой папке. Поэтому имеет смысл почистить реестр. Для этого нужно запустить regedit.exe и найти HKEY_LOCAL_MACHINE\Software\Android SDK Tools для 32-битных машин либо HKEY_LOCAL_MACHINE\Software\Wow6432Node\Android SDK Tools для 64-битных машин и удалить Android SDK Tools . Если в реестре вашей системы таких ключей нет, то все в порядке.

Если у вас установлена переменная среды ANDROID_SDK_HOME и вы хотите, чтобы она указывала на старую установку, то, по идее, это не должно стать проблемой, так как при настройке Android Studio мы укажем ей путь к SDK. Проблемы могут возникнуть, если эту переменную использует какое-либо из приложений, входящих в состав Android SDK.

3. Теперь переходим к установке Android Studio.
Нужно скачать Android Studio для вашей системы с официальной страницы и установить ее. По умолчанию, если выбрать «Установить только для меня» ставится в \Users\\AppData\Local\Android\android-studio\ , иначе ставится в \Program FIles (x86)\Android\android-studio\ . Можно выбрать и другую папку.

После установки запускаем Android Studio.

Видим вот такой диалог


В нем делаем следующее:

Создание проекта

1. New Project
Жмем New Project .

Появляется вот такой диалог


В нем можно настроить:
  • Имя проекта (я оставил по умолчанию: My Application )
  • Домен компании, по умолчанию .example.com , в моем случае markedone.example.com
  • Имя пакета тоже можно отредактировать, нажав на Edit справа. По умолчанию генерируется из имени проекта и домена компании и выглядит как com.example..<имя проекта в lowercase без пробелов>, я его изменил на com.example.markedone.myapp .
  • Путь, куда будет сохранен проект. Я указал свою папку для всяких тестовых проектов.
Когда все введено, жмем Next .
2. Form Factors
В этом диалоге выбираем целевые платформы и API.

Диалог выглядит так


Здесь я все оставил по умолчанию: Phone and Tablet и 4.0.3 IceCreamSandwich. Если API для каких-то платформ не установлен, выдается сообщение Not Insatlled. Например, как видно на скриншоте, у меня не установлены библиотеки для Google Glass (сделать это можно через SDK Manager).

Также обратите внимание на Help me choose, прикольная штука

Если нажать Help me choose , то откроется вот такой интересный диалог


Он содержит информацию по охвату устройств при выборе той или иной версии API. Прямоугольники версий API кликабельны, справа будет выведен список доступного в них функционала. Например, для предлагаемого по умолчанию Ice Cream Sandwich"а:



Жмем Next .
3. Add Activity

На следующем экране нам предлагается выбрать Activity


Естественно, я не смог пройти мимо Fullscreen Activity и выбрал ее. Вы можете выбрать другую Activity, но в этом случае у нас будут отличаться исходники на Java, и вам придется самостоятельно добавлять вызов нативного метода из Java (впрочем, в этом нет ничего сложного).
Делаем выбор, нажимаем Next .

Появляется следующий диалог


Здесь нам предлагается настроить Activity.
  • Activity Name - имя класса, я оставил по умолчанию: FullscreenActivity .
  • Layout Name - имя layout, для редактора UI, также оставляем по умолчанию.
  • Title - по умолчанию предлагается FullscreenActivity, я поставил пробел: Fullscreen Activity .
Нажимаем Finish .

В итоге должен открыться проект

Сборка и запуск

1. Сборка проекта
Запускаем сборку через меню: Build->Make Project (для пунктов меню указаны иконки и горячие клавиши, так что с ними будет несложно разобраться).
У меня при первой сборке возникла ошибка:

Произошло это в файле MyApplication/app/build.gradle
Для того, чтобы понять в чем дело, достаточно навести курсор на подчеркнутую строку:


Все просто, здесь указана версия 19, а у нас установлена только 20, да и в настройках проекта мы указали 20 как целевую. Просто поменяем цифру:


Как видно, студия на этом не успокоилась, и предлагает установить еще более новую версию. Но нам сейчас это не нужно.

Снова запускаем Build->Make Project . На этот раз у меня все собралось. Надеюсь, у вас тоже.

2. Настройка виртуального устройства
Для того чтобы запустить программу в эмуляторе, нужно настроить виртуальное устройство. Заходим в Tools->Android->AVD Manager (это, как и SDK Manager, утилита из Android SDK). Нам нужна первая вкладка, Android Virtual Device , она и открыта по умолчанию. Справа находим кнопку Create... и нажимаем ее.

Появится диалог настройки виртуального устройства



Внизу диалога выводится, какую ошибку вы допустили при настройке. Например, в имени устройства нельзя вводить пробелы, а некоторые поля обязательны для заполнения. Когда внизу нет надписи - все введено верно. Жмем OK .

Устройство появилось в списке


Пара слов о вкладке Device Definitions


На ней заданы доступные устройства (те, которые потом отображаются в выпадающем списке Device при создании нового виртуального устройства). Чтобы создать новое устройство, нужно нажать на кнопку Create Device... и озаботиться заполнением следующего диалога:



Закрываем AVD Manager и возвращаемся в главное окно Android Studio.
3. Запуск на эмуляторе
Выполняем Run->Run "app" .
Придется подождать, пока произойдет сборка проекта для запуска.

В конце концов, появится окно выбора устройства


Здесь единственный доступный вариант для выбора - это наше виртуальное устройство. Он нам сразу предложен, так что просто жмем OK .

Запускается эмулятор, довольно долго


Можно открыть Tools->Android->Android Device Monitor (утилита из Android SDK), чтобы увидеть логи с эмулятора. Он должен автоматически подцепить виртуальное устройство и сразу начать выводить лог.

Android Device Monitor


А вот приложение после запуска эмулятора у меня с первого раза не открылось, пришлось еще раз нажать Run->Run "app" .

Появился немного изменившийся диалог

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

После этого дело пошло, и приложение довольно быстро установилось и запустилось.

Полноэкранный режим

А если на приложение тапнуть, то выглядит оно так

Это не поведение системы, обработка клика происходит в приложении (файл FullscreenActivity.java):
// Set up the user interaction to manually show or hide the system UI. contentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (TOGGLE_ON_CLICK) { mSystemUiHider.toggle(); } else { mSystemUiHider.show(); } } }); После запуска, Android Studio предложила мне выключить Android Device Monitor, для того чтобы интегрировать вывод прямо в IDE.

Вот как выглядит интеграция

4. Запуск в Debug-режиме
Run->Debug "app"

Снова уже знакомый нам диалог

Ждем, пока запустится приложение и приконнектится дебаггер. Я поставил точку останова при нажатии на кнопку Dummy Button.

Android Studio в дебаге


Немного раздражает отсутствие панельки со всякими Step Into, Step Out etc.

Все это находится в меню Run

5. Запуск на 4.0.3
В процессе создания и запуска проекта вы, наверное, заметили, что мы создали приложение, совместимое с версией 4.0.3, но запускали его только на самой последней версии Android. Сейчас мы это исправим. Для этого нужно установить версию 4.0.3 через Tools->Android->SDK Manager .

Необходимое отмечено галочками на скриншоте


Это SDK Platform , ARM EABI v7a System Image и Intel x86 Atom System Image . На самом деле, мы запускали эмулятор ARM, и Intel нам сейчас ставить не обязательно. Я его поставил сугубо потому, что он установлен и для Android L.
Теперь создадим еще одно устройство для новой старой версии Android (или же вы можете отредактировать старое).

Настройки нового устройства


Запускаем (Run->Run "app" ).

В диалоге выбираем новое устройство для запуска


И смотрим, как выглядит новый эмулятор - явно брутальнее.

Запуск

Полноэкранный режим

После нажатия

5. Запуск на устройстве
Перед тем как перейти к работе с NDK, давайте запустим проект на реальном устройстве. Я буду запускать на телефоне

Huawei Ascend G300 с Android 4.0.3


Первое, что нужно сделать, это установить adb-драйвер. У меня с этим все довольно просто, драйвер находится прямо на телефоне, единственное, что нужно сделать, это воткнуть шнур в компьютер, зайти в примонтировавшийся диск и запустить исполняемый файл, который и установит adb-драйвер. Для других устройств все может быть сложнее. Например, для планшета Prestigio мне в свое время пришлось прописывать Vendor ID в специальный файл (чтобы использовался стандартный драйвер от Google), для Samsung нужен их собственный Kies, был отдельный драйвер для HTC и так далее. В общем, вам придется самостоятельно разобраться, как установить драйвер для вашего устройства.

После того как драйвер был установлен, нужно на устройстве разрешить отладку по USB. У меня на телефоне для этого нужно зайти в Настройки->Для разработчиков->Отладка по USB . Но для разных устройств, а также сборок и версий Android, расположение этого пункта меню может отличаться.

Теперь телефон будет находиться Android SDK, а разрабатываемые приложения будут устанавливаться. Однако, для Huawei это еще не все: с телефона не идут логи, нужно их включить.

Как включить логи на Huawei

Набрать в качестве телефонного номера: *#*#2846579#*#*
Появится сервисное меню.
Перейти в ProjectMenu->Background Setting->Log Setting
Открыть Log switch и установить там ON .
Открыть Log level setting и установить необходимый вам уровень логирования (я поставил verbose ).
Перезагрузить телефон.


Теперь можно запускать приложение на устройстве: Run->Run "app"

В диалоге выбора устройства появилось реальное устройство


Запускаемся на телефоне.

Результат запуска.

Приложение в портрете:

Приложение в ландшафте:

Установка и настройка Android NDK

1. Установка NDK
Android SDK, как мы уже выяснили, входит в комплект Android Studio, а вот NDK - нет. Скачиваем NDK, подходящий для вашей системы, отсюда . Распаковываем архив и кладем в какую-нибудь папку, например, в D:\ndk , так, чтобы файл ndk-build.cmd лежал прямо в ней. Важно : необходимо, чтобы в пути к NDK не было пробелов.
2. Добавим переменную ANDROID_NDK_HOME
Заходим в Панель управления\Система и безопасность\Система , выбираем слева Дополнительные параметры системы , в открывшемся диалоге нажимаем кнопку Переменные среды . Создаем переменную с именем ANDROID_NDK_HOME и значением D:\ndk (путь к вашей NDK).

Альтернативно, вместо указания глобальной переменной можно прописать путь к ndk в файле local.properties вашего проекта (прямо в корневой папке: MyApplication\local.properties ). Содержимое файла будет выглядеть примерно так (обратите внимание на двойные бэкслеши, так как для Windows это критично):
## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file should *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. sdk.dir=C:\\Users\\\\AppData\\Local\\Android\\android-studio\\sdk ndk.dir=D:\\ndk
Не верьте дисклеймеру про «ваши изменения будут выкинуты», в данном случае это не так. Обратите внимание, что этот файл рекомендуется исключать из-под контроля версий, так как он содержит только локальную для пользователя информацию. Для разнообразия в этом нам не соврали. Ну и, само собой, это изменение никак не повлияет на другие Ваши проекты. При установленной ANDROID_NDK_HOME прописывать путь в local.properties необязательно.

3. Установим необходимую версию Android API
Зайдите в NDK\platforms (у меня это D:\ndk\platforms ) и посмотрите максимальную версию доступных API. В моем случае максимальная версия 19. Но при этом в SDK у нас установлены только версии 20 и 15. Так что заходим в SDK Manager и скачиваем SDK Platform версии 19, иначе ничего не соберется.

Что надо скачать

4. Настроим gradle для работы с NDK
Информацию я брал из сэмплов, скачать их можно . Я скачивал сэмплы для версии 0.11. В качестве основного примера я брал ndkSanAngeles.

Как запустить ndkSanAngeles

После того, как сэмплы скачаны, их нужно распаковать. Затем нужно открыть проект ndkSanAngeles. Для Android Studio проектом является папка, так что открывать надо именно ее. Для того этого выполняем File->Open , либо, если вы в Welcome диалоге, Open Project . Ищем папку ndkSanAngeles через диалог открытия файла.

После открытия проекта стоит обратить взор на файл build.gradle . Вот его оригинал:
buildscript { repositories { mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:0.11.0" } } apply plugin: "android" android { compileSdkVersion 19 buildToolsVersion "19.1.0" defaultConfig { ndk { moduleName "sanangeles" cFlags "-DANDROID_NDK -DDISABLE_IMPORTGL" ldLibs "GLESv1_CM", "dl", "log" stl "stlport_static" } // This actual the app version code. Giving ourselves 1,000,000 values versionCode = 123 } buildTypes.debug.jniDebugBuild true productFlavors { x86 { ndk { abiFilter "x86" } // this is the flavor part of the version code. // It must be higher than the arm one for devices supporting // both, as x86 is preferred. versionCode = 3 } arm { ndk { abiFilter "armeabi-v7a" } versionCode = 2 } mips { ndk { abiFilter "mips" } versionCode = 1 } fat { // fat binary, lowest version code to be // the last option versionCode = 0 } } // make per-variant version code applicationVariants.all { variant ->
А вот измененная версия, чтобы проект собирался у меня:
buildscript { repositories { mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:0.12.+" } } apply plugin: "android" android { compileSdkVersion 19 buildToolsVersion "20.0.0" defaultConfig { ndk { moduleName "sanangeles" cFlags "-DANDROID_NDK -DDISABLE_IMPORTGL" ldLibs "GLESv1_CM", "dl", "log" stl "stlport_static" } // This actual the app version code. Giving ourselves 1,000,000 values versionCode = 123 } buildTypes.debug.jniDebugBuild true productFlavors { x86 { ndk { abiFilter "x86" } // this is the flavor part of the version code. // It must be higher than the arm one for devices supporting // both, as x86 is preferred. versionCode = 3 } arm { ndk { abiFilter "armeabi-v7a" } versionCode = 2 } mips { ndk { abiFilter "mips" } versionCode = 1 } fat { // fat binary, lowest version code to be // the last option versionCode = 0 } } // make per-variant version code applicationVariants.all { variant -> // get the single flavor def flavorVersion = variant.productFlavors.get(0).versionCode // set the composite code variant.mergedFlavor.versionCode = flavorVersion * 1000000 + defaultConfig.versionCode } }
Изменения следующие:

  • О несовпадении версии плагина gradle (classpath "com.android.tools.build:gradle:0.11.0" ) будет сказано при попытке сборки и предложен правильный номер версии. У меня это 0.12.+.
  • compileSdkVersion 19 остается, так как это максимальная версия для текущего NDK.
  • buildToolsVersion изменился на 20. Установленные версии можно посмотреть в SDK Manager, там же можно установить другие.
После этого ndkSanAngeles должен собраться. Будьте внимательны, проверяйте версии, установленные у вас.

В нашем проекте нужно выбрать правильный файд build.gradle, так как здесь их два. Дело в том, что MyApplication - это проект, а app - это модуль проекта (или подпроект), и у них build.gradle для каждого свой. Сначала рассмотрим файл проекта

MyApplication->build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath "com.android.tools.build:gradle:0.12.+" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }


Из комментариев в коде явно следует, что нам нужен файл модуля

MyApplication->app->build.gradle

apply plugin: "com.android.application" android { compileSdkVersion 20 buildToolsVersion "20.0.0" defaultConfig { applicationId "com.example.markedone.myapp" minSdkVersion 15 targetSdkVersion 20 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } } dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) // You must install or update the Support Repository through the SDK manager to use this dependency. //compile "com.android.support:support-v4:19.+" compile "com.android.support:support-v4:20.+" }


Настроим его для работы с NDK, используя в качестве «донора» build.gradle из ndkSanAngeles.

Для начала, заменим
compileSdkVersion 20
на
compileSdkVersion 19
так как NDK ограничен версией 19.

В defaultConfig мы добавим настройки ndk , а также заменим targetSdkVersion на 19:
defaultConfig { applicationId "com.example.markedone.myapp" minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName "1.0" ndk { moduleName "myapp" cFlags "-DANDROID_NDK" ldLibs "log" stl "stlport_static" } } Настройки NDK включают в себя

  • moduleName - имя модуля, будет использовано для именования *.so файла
  • cFlags - флаги C
  • ldLibs - библиотеки, которые вы хотите подключить к нативному коду
  • stl - версия библиотеки STL
В buildTypes включим для debug дебажную сборку JNI:
buildTypes { release { runProguard false proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } debug.jniDebugBuild true }
Теперь добавим productFlavors . Здесь мы указываем, какие собранные *.so библиотеки включать в сборку под конкретную архитектуру. Таким образом, *.apk собранный для arm будет содержать версию библиотеки только для arm, под x86 - для x86 и так далее. Этот кусок полностью скопирован с ndkSanAngeles. Объяснение значений versionCode из комментариев: для x86 ставим максимальное значение versionCode , так как если устройство поддерживает и x86 и arm, то сборка x86 предпочтительнее (видимо, так как у нее большая версия, то установлена будет именно она), а минимальный versionCode прописывается для fat (по идее это должен быть «толстый» *.apk, содержащий сразу все возможные версии библиотек).
productFlavors { x86 { ndk { abiFilter "x86" } // this is the flavor part of the version code. // It must be higher than the arm one for devices supporting // both, as x86 is preferred. versionCode = 3 } arm { ndk { abiFilter "armeabi-v7a" } versionCode = 2 } mips { ndk { abiFilter "mips" } versionCode = 1 } fat { // fat binary, lowest version code to be // the last option versionCode = 0 } }
«Собираем» значение versionCode для каждого из вариантов сборки:
// make per-variant version code applicationVariants.all { variant -> // get the single flavor def flavorVersion = variant.productFlavors.get(0).versionCode // set the composite code variant.mergedFlavor.versionCode = flavorVersion * 1000000 + defaultConfig.versionCode }
Наконец, последняя секция, dependencies . Если помните, здесь мы меняли compile "com.android.support:support-v4:19.+" на compile "com.android.support:support-v4:20.+" , чтобы собирать с единственной установленной у нас версией библиотеки. Теперь придется поменять обратно на 19.
dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) // You must install or update the Support Repository through the SDK manager to use this dependency. compile "com.android.support:support-v4:19.+" }

Полный листинг измененного файла build.gradle

apply plugin: "com.android.application" android { compileSdkVersion 19 buildToolsVersion "20.0.0" defaultConfig { applicationId "com.example.markedone.myapp" minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName "1.0" ndk { moduleName "myapp" cFlags "-DANDROID_NDK" ldLibs "log" stl "stlport_static" } } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } debug.jniDebugBuild true } productFlavors { x86 { ndk { abiFilter "x86" } // this is the flavor part of the version code. // It must be higher than the arm one for devices supporting // both, as x86 is preferred. versionCode = 3 } arm { ndk { abiFilter "armeabi-v7a" } versionCode = 2 } mips { ndk { abiFilter "mips" } versionCode = 1 } fat { // fat binary, lowest version code to be // the last option versionCode = 0 } } // make per-variant version code applicationVariants.all { variant -> // get the single flavor def flavorVersion = variant.productFlavors.get(0).versionCode // set the composite code variant.mergedFlavor.versionCode = flavorVersion * 1000000 + defaultConfig.versionCode } sourceSets { main { jni.srcDirs = ["src/main/jni", "src/main/jni/"] } } } dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) // You must install or update the Support Repository through the SDK manager to use this dependency. compile "com.android.support:support-v4:19.+" }

5. Создаем папку jni
В папке jni мы будем сохранять C/C++ файлы. Этого от нас ожидает NDK. Папку нам нужно создать в MyApplication/app/src/main . Это можно сделать прямо из Android Studio, причем, двумя способами.
Во-первых, можно кликнуть правой кнопкой на main и просто создать папку через

New->Directory


Во вторых, можно воспользоваться специальным пунктом меню

New->Folder->JNI Folder

Он запускает визард создания папки




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

6. Добавим C++ файлы
Визарда для C++ файлов нет, поэтому для создания файла мы кликаем правой кнопкой на папке jni и выбираем

New->File


Для начала создадим заголовочный файл myapp.h :
#pragma once #include #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_com_example_markedone_myapp_FullscreenActivity_stringFromJNI(JNIEnv* env, jclass clazz); #ifdef __cplusplus } #endif

Описание

  • #pragma once - вместо стандартной (#ifndef/#define/#endif) защиты от повторного включения. Сейчас #pragma once понимается большинством C++ компиляторов.
  • #include - включаем заголовок JNI, чтобы можно было использовать типы, объявленные там.
  • #ifdef __cplusplus ... #endif - код внутри будет скомпилирован только в C++ (но не в C).
  • extern "C" { ... } - избавляемся от name mangling (что это и почему, ).
  • JNIEXPORT jstring JNICALL Java_com_example_markedone_myapp_FullscreenActivity_stringFromJNI(JNIEnv* env, jclass clazz); - объявление функции, которую будем реализовывать.
    Разберем это объявление подробнее.
    • JNIEXPORT необходимо для грамотной линковки.
    • JNICALL для правильного соглашения о вызове.
    • jstring - тип возвращаемого значения функции, в данном случае это строка, совместимая со строкой Java.
    • Java_com_example_markedone_myapp_FullscreenActivity_stringFromJNI - имя функции, состоит из:
      Java - язык, который вызывает.
      com_example_markedone_myapp - это id приложения (com.example.markedone.myapp ).
      FullscreenActivity - имя класса Java, который содержит объявление метода, представляющего нативную функцию.
      stringFromJNI - собственно, имя функции (таким оно будет в Java).
    • JNIEnv* env, jclass clazz - обязательные параметры, передающиеся из Java.
      JNIEnv* env - указатель на объект, представляющий из себя JNI-окружение.
      jclass clazz - класс, которому принадлежит объявление нативного метода в Java. Здесь нужно оговориться, что jclass clazz - это для статического нативного (static native ) метода. Для нестатического метода будет нужно писать jobject obj .

Теперь создадим файл реализации, myapp.cpp. В нем мы напишем следующий код:
#include #include #include "myapp.h" JNIEXPORT jstring JNICALL Java_com_example_markedone_myapp_FullscreenActivity_stringFromJNI(JNIEnv* env, jclass clazz) { std::string tag("GREETING"); std::string message("Hello from C++!"); __android_log_print(ANDROID_LOG_INFO, tag.c_str(), "%s", message.c_str()); std::string jniMessage("Hello from JNI!"); return env->NewStringUTF(jniMessage.c_str()); }

Описание

  • #include - подключаем лог, ради которого мы даже добавили библиотеку (ldLibs «log» )
  • #include - для std::string, который мы используем для проверки наличия STL.
    #include "myapp.h" - подключаем наш заголовочный файл.
    JNIEXPORT jstring JNICALL Java_com_example_markedone_myapp_FullscreenActivity_stringFromJNI(JNIEnv* env, jclass clazz) { ... } - реализуем функцию, объявленную в "myapp.h".
    std::string tag("GREETING"); std::string message("Hello from C++!"); - создаем строки для вывода в лог.
    __android_log_print(ANDROID_LOG_INFO, tag.c_str(), "%s", message.c_str()); - вывод в лог. Обратите внимание, что необходимо указывать 4 параметра: тип сообщения в логе, тэг, формат строки, и, наконец, само сообщение.
    std::string jniMessage("Hello from JNI!"); - строка, которую мы будем передавать в Java.
    return env->NewStringUTF(jniMessage.c_str()); - возвращаемое значение, при помощи JNIEnv создаем jstring из C-строки. Обратите внимание, что нам не нужна конструкция вида (*env)-> , так как мы пишем на C++, а не на C.
А теперь мы создадим еще один файл: stub.cpp, и оставим его пустым. Дело в том, что если оставить только один *.cpp файл в папке jni, то ndk-build будет выдавать ошибку «no rule to make target».
7. Добавим вызов нативной функции из Java
Открываем файл MyApplication/app/src/main/java/com.example.markedone.myapp.FullscreenActivity . На самом деле, у него расширение java, а com, example, markedone и myapp - это папки, но Android Studio это скрывает.

Содержимое файла

package com.example.markedone.myapp; import com.example.markedone.myapp.util.SystemUiHider; import android.annotation.TargetApi; import android.app.Activity; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.MotionEvent; import android.view.View; /** * An example full-screen activity that shows and hides the system UI (i.e. * status bar and navigation/system bar) with user interaction. * * @see SystemUiHider */ public class FullscreenActivity extends Activity { /** * Whether or not the system UI should be auto-hidden after * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. */ private static final boolean AUTO_HIDE = true; /** * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after * user interaction before hiding the system UI. */ private static final int AUTO_HIDE_DELAY_MILLIS = 3000; /** * If set, will toggle the system UI visibility upon interaction. Otherwise, * will show the system UI visibility upon interaction. */ private static final boolean TOGGLE_ON_CLICK = true; /** * The flags to pass to {@link SystemUiHider#getInstance}. */ private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION; /** * The instance of the {@link SystemUiHider} for this activity. */ private SystemUiHider mSystemUiHider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fullscreen); final View controlsView = findViewById(R.id.fullscreen_content_controls); final View contentView = findViewById(R.id.fullscreen_content); // Set up an instance of SystemUiHider to control the system UI for // this activity. mSystemUiHider = SystemUiHider.getInstance(this, contentView, HIDER_FLAGS); mSystemUiHider.setup(); mSystemUiHider .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() { // Cached values. int mControlsHeight; int mShortAnimTime; @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) public void onVisibilityChange(boolean visible) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { // If the ViewPropertyAnimator API is available // (Honeycomb MR2 and later), use it to animate the // in-layout UI controls at the bottom of the // screen. if (mControlsHeight == 0) { mControlsHeight = controlsView.getHeight(); } if (mShortAnimTime == 0) { mShortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); } controlsView.animate() .translationY(visible ? 0: mControlsHeight) .setDuration(mShortAnimTime); } else { // If the ViewPropertyAnimator APIs aren"t // available, simply show or hide the in-layout UI // controls. controlsView.setVisibility(visible ? View.VISIBLE: View.GONE); } if (visible && AUTO_HIDE) { // Schedule a hide(). delayedHide(AUTO_HIDE_DELAY_MILLIS); } } }); // Set up the user interaction to manually show or hide the system UI. contentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (TOGGLE_ON_CLICK) { mSystemUiHider.toggle(); } else { mSystemUiHider.show(); } } }); // Upon interacting with UI controls, delay any scheduled hide() // operations to prevent the jarring behavior of controls going away // while interacting with the UI. findViewById(R.id.dummy_button).setOnTouchListener(mDelayHideTouchListener); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Trigger the initial hide() shortly after the activity has been // created, to briefly hint to the user that UI controls // are available. delayedHide(100); } /** * Touch listener to use for in-layout UI controls to delay hiding the * system UI. This is to prevent the jarring behavior of controls going away * while interacting with activity UI. */ View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (AUTO_HIDE) { delayedHide(AUTO_HIDE_DELAY_MILLIS); } return false; } }; Handler mHideHandler = new Handler(); Runnable mHideRunnable = new Runnable() { @Override public void run() { mSystemUiHider.hide(); } }; /** * Schedules a call to hide() in milliseconds, canceling any * previously scheduled calls. */ private void delayedHide(int delayMillis) { mHideHandler.removeCallbacks(mHideRunnable); mHideHandler.postDelayed(mHideRunnable, delayMillis); } }


Добавим следующий код в класс FullscreenActivity:
static { System.loadLibrary("myapp"); } private static native String stringFromJNI(); Здесь сначала идет загрузка библиотеки, а затем объявление метода stringFromJNI , который соответствует нашей функции в C++. Обратите внимание, что он объявлен как static (это влияет на то, что (jclass или jobject) будет в качестве второго параметра C++-функции) и native. Реализовывать native-метод не нужно, мы это уже сделали в C++, а остальное за нас сделает JNI.

Теперь мы, в общем-то, уже можем вызвать нашу функцию. Если вы, как и я, выбрали FullscreenActivity, то у нас есть Dummy Button, который, по сути, ничего не делает. И даже уже есть touch listener, пусть и не самый лучший (он будет вызываться много раз, пока палец на экране), но, чтобы не плодить лишний код, используем его.

Для начала добавим в список импорта:
import android.widget.Button;
чтобы можно было нормально работать с кнопкой.

Найдем следующий код:
View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (AUTO_HIDE) { delayedHide(AUTO_HIDE_DELAY_MILLIS); } return false; } };
и добавим несколько строк перед return false .
View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (AUTO_HIDE) { delayedHide(AUTO_HIDE_DELAY_MILLIS); } final String message = stringFromJNI(); final Button button = (Button)findViewById(R.id.dummy_button); final String actualText = button.getText().toString(); if(message.equals(actualText)) { button.setText("Dummy Button"); } else { button.setText(message); } return false; } };

Описание добавленного кода

  • final String message = stringFromJNI(); - получаем строку из C++. Вызов нативного метода - то, ради чего все и затевалось.
  • final Button button = (Button)findViewById(R.id.dummy_button); - находим объект кнопки.
  • final String actualText = button.getText().toString(); - вытаскиваем текущий текст кнопки.
  • if(message.equals(actualText)) - сравниваем строку, полученную из C++, с текстом кнопки.
    • button.setText("Dummy Button"); - если одинаковы, меняем текст кнопки на Dummy Button.
    • button.setText(message); - если различаются, то меняем на текст, полученный из C++.

Полный листинг класса измененного класса

package com.example.markedone.myapp; import com.example.markedone.myapp.util.SystemUiHider; import android.annotation.TargetApi; import android.app.Activity; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.widget.Button; /** * An example full-screen activity that shows and hides the system UI (i.e. * status bar and navigation/system bar) with user interaction. * * @see SystemUiHider */ public class FullscreenActivity extends Activity { static { System.loadLibrary("myapp"); } private static native String stringFromJNI(); /** * Whether or not the system UI should be auto-hidden after * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. */ private static final boolean AUTO_HIDE = true; /** * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after * user interaction before hiding the system UI. */ private static final int AUTO_HIDE_DELAY_MILLIS = 3000; /** * If set, will toggle the system UI visibility upon interaction. Otherwise, * will show the system UI visibility upon interaction. */ private static final boolean TOGGLE_ON_CLICK = true; /** * The flags to pass to {@link SystemUiHider#getInstance}. */ private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION; /** * The instance of the {@link SystemUiHider} for this activity. */ private SystemUiHider mSystemUiHider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fullscreen); final View controlsView = findViewById(R.id.fullscreen_content_controls); final View contentView = findViewById(R.id.fullscreen_content); // Set up an instance of SystemUiHider to control the system UI for // this activity. mSystemUiHider = SystemUiHider.getInstance(this, contentView, HIDER_FLAGS); mSystemUiHider.setup(); mSystemUiHider .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() { // Cached values. int mControlsHeight; int mShortAnimTime; @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) public void onVisibilityChange(boolean visible) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { // If the ViewPropertyAnimator API is available // (Honeycomb MR2 and later), use it to animate the // in-layout UI controls at the bottom of the // screen. if (mControlsHeight == 0) { mControlsHeight = controlsView.getHeight(); } if (mShortAnimTime == 0) { mShortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); } controlsView.animate() .translationY(visible ? 0: mControlsHeight) .setDuration(mShortAnimTime); } else { // If the ViewPropertyAnimator APIs aren"t // available, simply show or hide the in-layout UI // controls. controlsView.setVisibility(visible ? View.VISIBLE: View.GONE); } if (visible && AUTO_HIDE) { // Schedule a hide(). delayedHide(AUTO_HIDE_DELAY_MILLIS); } } }); // Set up the user interaction to manually show or hide the system UI. contentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (TOGGLE_ON_CLICK) { mSystemUiHider.toggle(); } else { mSystemUiHider.show(); } } }); // Upon interacting with UI controls, delay any scheduled hide() // operations to prevent the jarring behavior of controls going away // while interacting with the UI. findViewById(R.id.dummy_button).setOnTouchListener(mDelayHideTouchListener); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Trigger the initial hide() shortly after the activity has been // created, to briefly hint to the user that UI controls // are available. delayedHide(100); } /** * Touch listener to use for in-layout UI controls to delay hiding the * system UI. This is to prevent the jarring behavior of controls going away * while interacting with activity UI. */ View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (AUTO_HIDE) { delayedHide(AUTO_HIDE_DELAY_MILLIS); } final String message = stringFromJNI(); final Button button = (Button)findViewById(R.id.dummy_button); final String actualText = button.getText().toString(); if(message.equals(actualText)) { button.setText("Dummy Button"); } else { button.setText(message); } return false; } }; Handler mHideHandler = new Handler(); Runnable mHideRunnable = new Runnable() { @Override public void run() { mSystemUiHider.hide(); } }; /** * Schedules a call to hide() in milliseconds, canceling any * previously scheduled calls. */ private void delayedHide(int delayMillis) { mHideHandler.removeCallbacks(mHideRunnable); mHideHandler.postDelayed(mHideRunnable, delayMillis); } }

17. Собираем и запускаем проект
Сначала Build->Make Project. На этом этапе собирается Java-часть.
Затем Run->Run "app". А вот здесь, перед стартом приложения, будет происходить сборка C++ части. Если в ней будут какие-то ошибки, то об этом будет выведено сообщение. Если ошибок нет, то появится стандартный диалог выбора устройства, и, после нажатия OK приложение запустится.

Работа на реальном устройстве

Вывод сообщения в лог

Заключение

В целом, мне Android Studio понравилась. Интеграция Android SDK выполнена довольно плотно, иногда даже забываешь, что это запускаются отдельные программы. Есть всякие интересные плюшки, такие, как Help me choose. Понравилась новая система сборки - Gradle, - но тут же и недостаток: по ней очень мало информации.

Также, видно, что поддержка NDK еще сыровата, но прослеживается движение в этом направлении. Очень надеюсь, что они все-таки сделают полноценную поддержку C++-разработки.

P.S. Дебага C++ кода пока не обнаружено.

Теги:

  • android studio
  • gradle
  • android ndk
  • android
Добавить метки

Начиная осваивать разработку для любой платформы, ты обязательно сразу же наткнешься на множество с первого взгляда незаметных подводных камней. Большинство из них будут связаны с самим процессом кодинга: несостыковки в API, скрытые функции, ограничения, особый стиль программирования для платформы. Есть и камни, лежащие немного поодаль: тестирование и автоматическая оптимизация, создание клипарта и иконок, получение автоматических краш-репортов. Неопытные разработчики для Android рискуют отбить о них обе ноги.

В этой статье мы рассмотрим проблемы разработки для Android в контексте утилит и инструментов. Мы избавимся от необходимости подключать смартфон с помощью кабеля во время тестирования и отладки на устройстве, расщепим приложение на версии Lite и Pro, встроим в него механизм автоматической генерации и отсылки на сервер краш-репортов, автоматизируем тестирование, обфусцируем и оптимизируем код, а также за несколько минут создадим для приложения иконку и все необходимые ресурсы. Поехали.

1. Медленный эмулятор

Итак, ты набросал свое первое приложение, и пора его запустить и проверить на работоспособность. Для этого в комплекте Android SDK есть эмулятор. Долгое время его упрекали за медлительность, но с выпуском Android Studio 2.0 ситуация намного улучшилась - x86-версия эмулятора получила хардварное ускорение, так что теперь он работает быстрее реальных устройств. К тому же у него появился удобный графический интерфейс, с помощью которого можно симулировать звонки, СМС, изменять данные GPS и сбои в сети, то есть все, для чего раньше приходилось использовать инструменты командной строки.

Поэтому, если ты еще не обновился, настоятельно рекомендую это сделать, не говоря уже о переходе с Eclipse. И обязательно выбирать x86-версию эмулятора в AVD manager, ARM-версия не поддерживает хардварное ускорение.

2. Смартфон на поводке

Второй этап - тестирование на реальном устройстве. Здесь все просто: подключаешь смартфон по USB, устанавливаешь драйверы, включаешь режим отладки в настройках для разработчиков, после чего девайс появляется в списке доступных для установки приложения (рядом с эмулятором). Проблема только в том, что в данном случае устройство необходимо держать подключенным к ПК с помощью кабеля, а если это твой основной смартфон, на который поступают звонки и сообщения, то об удобстве говорить не приходится.

К счастью, Android Studio (а точнее, утилита ADB, которую он использует для связи с устройством) поддерживает работу по сети. Но данную функцию еще нужно активировать. Если у тебя рутованный смартфон, то тебе повезло: включить отладку по сети можно с помощью приложения WiFi ADB . Последовательность действий:

  1. Устанавливаем WiFi ADB, запускаем, включаем сетевой режим с помощью переключателя и запоминаем IP-адрес.
  2. Запускаем Android Studio.
  3. Открываем консоль, переходим в каталог с установленным SDK, далее в platform-tools и запускаем следующую команду:

    $ adb connect IP-адрес

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

  1. Подключаем смартфон и устанавливаем драйверы.
  2. Включаем режим отладки в настройках для разработчиков.
  3. Открываем консоль, переходим в каталог SDK/platform-tools и запускаем следующую команду:

    $ adb tcpip 5555

  4. Подключаемся к смартфону по сети:

    $ adb connect IP-адрес

IP-адрес можно узнать через настройки: «О телефоне (О планшете) → Общие сведения», пункт «IP-адрес».

3. Библиотеки

Окей, твой накиданный за полчаса огрызок вроде бы работает, и настало время превратить его в настоящее приложение с красивым интерфейсом и виджетами для рабочего стола. На этом этапе тебе наверняка понадобятся внешние библиотеки, реализующие различные концепции интерфейса, паттерны программирования и связь с внешними сервисами. И если с последними все ясно (нужен SDK для Dropbox - открываешь портал для разработчиков и следуешь инструкциям), то с остальными уже сложнее. Где их искать и какие библиотеки лучше?

Наиболее полный каталог библиотек - это Android Arsenal . Там ты найдешь практически все, что тебе нужно. Доступны удобный поиск и сортировка по рейтингу, для каждой библиотеки есть инструкция, как ее подключить к своему проекту, в том числе с помощью стандартной для Android системы сборки Gradle: достаточно добавить репозиторий в файл build.gradle проекта и указать библиотеку в списке зависимостей.


Отличный список must have библиотек ты найдешь на этой странице . От себя добавлю, что на первых этапах стоит сразу изучить Dagger 2 , RxJava и Retrofit . Став продвинутым разработчиком, ты так или иначе придешь к использованию этих библиотек.

4. Иконки и клипарт

Наконец, спустя дни или недели у тебя начинает вырисовываться полноценное приложение. Вот только никакого графического материала нет до сих пор: иконка стандартная, в форме зеленого робота, вместо клипарта - заглушки. Очевидно, без графики соваться в маркеты бессмысленно, однако и платить за иконку для своего первого приложения тоже глупо. Что делать?

На самом деле иконку можно сгенерировать. Есть замечательный веб-сервис Android Asset Studio , с помощью которого буквально за пару минут ты получишь красивую иконку во всех возможных разрешениях. В качестве основы можно взять подготовленную тобой картинку, просто написать текст или, что лучше всего, выбрать из предоставленного сервисом клипарта. Также ты сможешь задать стиль иконки (круглая, квадратная, в стиле iOS…), цвет, настроить тени и другие параметры. В результате в твоем распоряжении появится архив ic_launcher.zip , который необходимо развернуть в каталог AndroidstudioProjects/ИМЯ_ПРИЛОЖЕНИЯ/app/src/main/res . Обязательно создай веб-иконку, нажав на кнопку «Generate web icon». Она тебе понадобится.


Тот же сервис позволяет создать иконки для ActionBar’а и строки состояния . Принцип примерно тот же, скажу лишь, что в строке состояния лучше всего смотрятся иконки с отступом от краев 15%.

Кроме того, тебе понадобится так называемая Feature Image. Это специальная картинка, которую Play Market и другие магазины приложений используют в качестве плашки в верхней части экрана (когда открываешь страницу приложения на смартфоне). Ее можно сгенерировать с помощью другого сервиса . Для оформления скриншотов можно использовать официальный сервис от Google . Он создает вокруг скриншота рамку смартфона.

5. Краш-репорты

Приложение готово, иконка есть, интерфейс удобный, код качественный. Настало время тестирования, и первое, что ты делаешь, - рассылаешь приложение друзьям и знакомым. Но вот незадача: у некоторых из них приложение падает, а у тебя все работает отлично, и повторить действия, приведшие к падению, ты не можешь. Что делать, просить друзей присылать тебе листинг logcat?

Нет, нам нужна система краш-репортинга. Таких существует огромное множество, и все они реализуют один и тот же принцип работы: к приложению подключается небольшая библиотека, которая в момент падения записывает стектрейс и другие данные о падении и отправляет их на сервер, а затем специальный веб-интерфейс формирует на их основе красивые и наглядные отчеты.

Одна из самых популярных таких систем - Fabric , однако я рекомендую посмотреть в сторону Splunk MINT: он бесплатный, простой и легко интегрируется в приложение (достаточно добавить всего одну строку кода). Чтобы начать им пользоваться, необходимо подключить к проекту SDK, сделать это можно с помощью все того же Gradle. Открываем файл build.gradle (тот, что относится к приложению, а не ко всему проекту) и добавляем следующие строки:

Repositories { maven { url "https://mint.splunk.com/gradle/" } } dependencies { compile "com.splunk.mint:mint:5.0.0" }


После этого Splunk MINT покажет тебе строку кода, которую необходимо вставить в код:

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов.

В этой статье будет рассказано как установить Android Studio, для этого вам понадобится уже установленный пакет Java, если вы ещё не поставили его, прочитайте, пожалуйста, . Также здесь будет рассказано про настройку при первом запуске и обновлении Android SDK пакетов.

Скачивание пакета Android Studio

Большая часть работ, задействованных в разработке приложений для Android, будет производиться с помощью среды Android Studio. Её можно скачать со страницы: http://developer.android.com/sdk/index.html . Под заголовком "Other Download Options" представлен список пакетов под разные платформы.

Перед началом загрузки вам необходимо будет согласиться с лицензионным соглашением.


Установка Android Studio

Процесс установки различается для разных операционных систем. Ниже даны инструкции для Windows, Mac OS X, Linux.

Установка под Windows

Запустите скаченный exe-файл, откроется мастер установки со стандартными шагами наподобие места установки и лицензионного соглашения, после этого появится кнопка запуска процесса установки. Ничего сложного.



Также сразу будет предложена установка и других компонентов таких, как SDK Manager и Android Virtual Device. Отметьте их, они нам все понадобятся.


Если версия операционной системы позволяет, Android Studio может быть запущена из меню Пуск. В случае же с Windows 8 запуск происходит с помощью исполняемого файла в папке bin директории установки среды, по умолчанию путь до неё выглядит так C:\Program Files\Android\Android Studio\bin. Способ не самый удобный, но ведь всегда можно перенести этот файл на панель задач. Обратите внимание, что одновременно могут присутствовать разные версии exe-файлов для 32-битной и 64-битной системы.

Установка под Mac OS X

Android Studio для MAC OS X загружается в виде файла образа диска (.dmg). Дважды щёлкните по нему, появится окно:


Чтобы установить пакет, просто перетащите значок Android Studio на папку Applications. Пакет будет установлен в папку Applications системы, процесс занимает, как правило, несколько минут.

Чтобы запустить Android Studio, найдите исполняемый файл в папке Applications и дважды щелкните по нему. Может появиться диалоговое окно с ошибкой указывающей на то, что JVM не может быть найдено. Если вылезла такая ошибка, то необходимо скачать и установить JRE пакет Mac OS X Java. Он может быть загружен с сайта Apple, по ссылке http://support.apple.com/kb/DL1572 . После этого ошибка не должна больше появляться.

Для дальнейшего облегчения доступа к инструменту, перетащите значок Android Studio из окна Finder и на панель Dock.

Установка под Linux

После скачивания пакета, перейдите в терминале в папку, куда должна установиться Android Studio, и выполните следующую команду:

Unzip / /android-studio-ide- -linux.zip

Обратите внимание на то, что комплект Android Studio будет установлен в подкаталог с именем android-studio.

Чтобы запустить IDE, откройте окно терминала, смените директорию на android-studio/bin и выполните следующую команду:

./studio.sh

Первичная настройка Android Studio

При первом запуске Android Studio появится диалоговое окно, предоставляющее возможность импортировать настройки из предыдущей версии Android Studio. Если у вас есть настройки из предыдущей версии, и вам хотелось бы импортировать их в новую установку, выберите соответствующую опцию и укажите расположение настроек. В противном случае укажите, что вам не нужно импортировать предыдущие настройки и нажмите на кнопку OK, чтобы продолжить.

После того как Android Studio завершит загрузку, появится мастер установки, как на рисунке ниже.


Нажмите на кнопку "Далее", выберите стандартную установку и нажмите кнопку "Далее" еще раз, примите лицензионные соглашения и нажмите на кнопку "Готово", чтобы завершить процесс установки. Появится приветственный экран Android Studio.


Установка последних пакетов Android SDK

До этого мы уже поставили Java, IDE для Android и набор текущих Android SDK пакетов поставляемых по умолчанию. Прежде чем продолжить, стоит потратить некоторое время, чтобы проверить, какие пакеты установлены и установить недостающие пакеты. Это можно сделать с помощью Android SDK Manager, который может быть запущен изнутри Android Studio через Настройки (Configure) -> SDK Manager или из приветственного окна при запуске.


В Android SDK Manager убедитесь, что установлены флажки в столбце Status напротив следующих пакетов:

  • Tools > Android SDK Tools
  • Tools > Android SDK Platform-tools
  • Tools > Android SDK Build-tools
  • SDK Platform (most recent version)> SDK Platform
  • SDK Platform (most recent version) > ARM EABI v7a System Image
  • Extras -> Android Support Repository
  • Extras > Android Support Library
  • Extras -> Google Repository
  • Extras -> Google USB Driver (Required on Windows systems only)
  • Extras > Intel x86 Emulator Accelerator (HAXM installer)

В случае, если какой-либо из вышеуказанных пакетов не установлен (в колонке Status стоит Not Installed), просто проставьте флажки напротив них и нажмите на кнопку установки пакетов (Install packages), чтобы начать процесс установки. В появившемся диалоговом окне примите условия лицензионного соглашения, нажмите на кнопку Install, после чего SDK Manager начнёт загружать и устанавливать отмеченные пакеты. Во время установки в нижней части окна диспетчера будет отображаться индикатор с указанием статуса установки.

Заключение

На этом установка Android Studio закончена, в мы закончим подготовку к разработке приложений под Android.



Понравилась статья? Поделиться с друзьями: