суббота, 5 апреля 2014 г.

Android Studio — два способа изготовить apk-файл

Введение

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

В этом смысле в царстве Android нет достаточно комфортных сред разработки, как это, впрочем, и полагается программам в мире бесплатных операционных систем. Ещё до недавнего времени центральным средством разработки считался Eclipse со специализированными плагинами. Однако летом 2013 года Google представил на суд общественности новую IDE — Android Studio, основанную на давнишнем конкуренте Eclipse — системе IntelliJ IDEA. Надо сказать, что несмотря на раннюю версию системы, не вошедшую ещё даже в стадию Beta, она уже превосходит удобством Eclipse.

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

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


Ручной способ
  1. В левом нижнем углу Android Studio есть маленькая кнопочка, управляющая отображением специальных ярлыков у краёв экрана. Ярлыки открывают различные вспомогательные окна. Кроме того, при простом наведении на эту кнопочку указателя мыши, появляется список всех этих окон для быстрого открытия нужного. Откроем окно Build Variants и напротив нашего модуля в поле Build Variant переключим режим сборки с debug на release.
  2. В основном меню открываем Build Generate Signed APK. Возникает сообщение, которое, немного перефразируя, можно перевести примерно так: «Для проектов, собирающихся утилитой Gradle, информация о подписи и порядок подписывания apk-файлов должны быть прописаны в специальном сценарии. Настройте сценарий, как это описано в руководстве пользователя: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Signing-Configurations. Затем запустите "Gradle assembleRelease", и получите сгенерированный apk-файл в папке build/apk/» Это сообщение как раз настоятельно рекомендует нам использовать второй способ создания apk-файла. Принимаем информацию к сведению, но продолжаем ручной способ, нажав OK.
  3. Открывается окно помощника генерации подписи для apk-файла. Мы уже знаем, что все распространяемые приложения для Android должны иметь цифровую подпись автора, иначе приложение не установится на устройства пользователей. Сгенерированная подпись должна храниться в специальном файле-хранилище, расположенном на вашем компьютере, откуда потом она будет извлекаться для подписания apk-файлов. При этом одно хранилище может хранить несколько подписей для разных apk-файлов. Кроме того, одна и та же подпись может использоваться для подписания разных apk-файлов. Итак, для создания хранилища нажимаем кнопку Create New… и заполняем открывшиеся в окне поля:

    1. Путь для размещения файла хранилища
    2. Пароль и подтверждение для доступа к хранилищу
    3. Имя подписи, по которому она будет вызываться
    4. Пароль и подтверждение для доступа к подписи
    5. Срок действия подписи (по умолчанию 25 лет, оставляем без изменений)
    6. Хотя бы одно из полей сертификата. Обычно заполняют имя и фамилию, город и страну (RU).
       
  4. Нажимаем OK. Окно закрывается, и мы видим, что все поля в предыдущем окне автоматически заполнились введёнными нами данными. Ставим галочку в поле Remember Password, чтобы каждый раз не набирать пароль, и нажимаем OK.
  5. В следующем окне контролируем путь и имя apk-файла. По умолчанию оно равно имени модуля. Включаем галочку Run ProGuard, чтобы наш файл был оптимизирован, и можем даже поменять файл конфигурации proguard-android.txt на proguard-android-optimize.txt для более жёсткой оптимизации (хотя это может быть чревато для некоторых экзотичных смартфонов). Нажимаем Finish и ждём, посматривая в строку состояния.
  6. Когда сборка проекта закончится, отобразится окошко с предложением открыть папку с полученным apk-файлом. Открываем её и видим наш файл.

Скажу сразу, что несмотря на то, что я ставлю галочку в поле Run ProGuard, он у меня почему-то не отрабатывает, и apk-файл остаётся неоптимизированным. Возможно, это пережитки ранней версии Android Studio (у меня версия 0.5.4). Но выйти из положения достаточно просто, включив эту галочку непосредственно в файле сценария утилиты ProGuard. Найдите в окне проекта внутри нашего модуля файл build.gradle. В секции android buildTypes release, отвечающей за генерацию релиза, поменяйте параметр runProguard с false на true.

Не забудьте после редактирования файла сценария синхронизировать с ним ваш проект. Для этого в панели инструментов нажмите кнопку Sync Project with Gradle Files (стрелочка вниз из зелёного кружка) или ссылку Sync Now во всплывшей в верхней части исходника жёлтой полосе сообщения. После синхронизации можно снова попробовать собрать apk-файл, начиная со второго пункта нашей инструкции. Только в этот раз вместо генерации нового хранилища используем уже созданное. Все наши пароли и настройки сохранились, поэтому нам только остаётся нажимать во всплывающих окнах OK-Next-Finish. Обратите внимание, что вновь сгенерированный apk-файл стал немного меньше, чем в прошлый раз.


Автоматический способ

Автоматический способ позволяет генерировать apk-файл без ввода паролей при каждом запуске приложения на выполнение, а также командой assembleRelease, добавленной в список конфигураций и выполняющейся той же кнопкой Run.

Для включения автоматического режима надо внести в уже знакомый нам файл сценария build.gradle новую секцию, содержащую в том числе информацию о подписи:

signingConfigs {
    release {
        storeFile file("C:\\Users\\ИмяПользователя\\KEYSTORE.jks")
        storePassword "ПарольХранилища"
        keyAlias "ИмяПодписи"
        keyPassword "ПарольПодписи"
    }

    buildTypes {
        release {
            minifyEnabled true 
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
       }
    }
}

Вместо файла настроек "proguard-android.txt" можно вписать файл ещё более оптимизированных настроек "proguard-android-optimize.txt". Это позволит ещё немного сократить объём apk-файла.

Для внесения этой секции в настройки откроем файл build.gradle, расположенный внутри нашего модуля и закомментируем секцию buildTypes. Вместо неё вставим вышеприведённую секцию. Не забудьте поменять путь к вашему файлу ключей, который вы создали в первой части статьи при ручном создании apk-файла, а также вписать правильное имя подписи и оба пароля.

После внесения изменений в файл нажимаем в панели инструментов кнопку Sync Project with Gradle Files (стрелочка вниз из зелёного кружка) или ссылку Sync Now во всплывшей вверху жёлтой информационной полосе, чтобы синхронизировать изменённые настройки с проектом. Всё, автоматический режим настроен!

Теперь, чтобы иметь возможность генерировать apk-файл без запуска приложения, добавим отдельную команду запуска генерации apk-файла в список конфигураций (комбо-бокс в панели инструментов). Откроем окошко Gradle Tasks, нажав на ярлык Gradle у правого края экрана, или выбрав его во всплывающем списке кнопки, расположенной в левом нижнем углу Android Studio. В секции All tasks раскрываем список задач для нашего модуля и правой кнопкой щёлкаем по задаче assembleRelease. В появившемся контекстном меню выбираем пункт Create… и выбранная задача добавится в список конфигураций.

Теперь мы можем генерировать релиз и без запуска программы на выполнение, просто выбрав в списке конфигураций команду assembleRelease и нажав кнопку Run. Результат автоматического создания apk-файла будет находится в папке build/apk/. Там будут два файла: ИмяМодуля-release-unaligned.apk и ИмяМодуля-release.apk. Первый файл — это полуфабрикат. Он уже подписан но ещё не выровнен. Второй файл — уже выровненный. Это и есть наш конечный apk-файл, который мы уже можем переименовать и свободно распространять.

Замечу, что выравнивание файла гарантирует, что все несжатые данные будут начинаться с позиции, кратной 4 байтам по отношению к началу файла. Это обеспечит оптимизацию производительности программы на устройстве. Когда файл выровнен, Android способен читать информацию из файла по мере необходимости, а не загружать в память весь пакет целиком. В итоге уменьшается объем оперативной памяти, потребляемой запущенным приложением.

27 комментариев:

  1. Эта статья сэкономила мне время и нервы. Спасибо!

    ОтветитьУдалить
  2. Скомпилировал таким образом HelloWorld. Загрузил получившийся apk файл на телефон, попробовал поставить но получил сообщение "Ошибка при синтаксическом анализе пакета", видимо без бубна тут все таки не обойтись... =(

    ОтветитьУдалить
    Ответы
    1. Хм... Ручным или автоматическим? В любом случае так получается? Отлаживаете на устройстве или в эмуляторе? Если на устройстве, то при отладке работает?

      Удалить
    2. И так и так пробовал - результат один, но это на устройстве! А в эмуляторе все отлично работает, хотя нет, пробовал APK файлик отдельно загрузить на эмулятор и при установке тоже пишет ошибку. Вечером буду разбираться с отладчиком... В любом случае, огромное спасибо за статью, информации действительно не много даже для того чтобы элементарный HelloWorld запустить))

      Удалить
    3. Может у вас не соответствует версия Android на телефоне?!

      Удалить
    4. Отлично. "Ошибка при синтаксическом анализе пакета" и это HelloWorld. В эклипс без проблем собирался

      Удалить
  3. Error:Execution failed for task ':app:dexRelease'.
    > com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\егор\AppData\Local\Android\sdk\build-tools\21.1.2\dx.bat --dex --output C:\Users\егор\AndroidStudioProjects\Randomise\app\build\intermediates\dex\release --input-list=C:\Users\егор\AndroidStudioProjects\Randomise\app\build\intermediates\tmp\dex\release\inputList.txt
    Error Code:
    1
    Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    java.lang.RuntimeException: C:\Users\егор\AndroidStudioProjects\Randomise\app\build\intermediates\classes\release: file not found
    at com.android.dex.util.FileUtils.readFile(FileUtils.java:51)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:169)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:632)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
    at com.android.dx.command.dexer.Main.run(Main.java:246)
    at com.android.dx.command.dexer.Main.main(Main.java:215)
    at com.android.dx.command.Main.main(Main.java:106)
    1 error; aborting
    что делать

    ОтветитьУдалить
    Ответы
    1. Анализировать то, что он вам пишет.
      Он говорит, что файл не найден и показывает полное имя этого файла, в пути которого вместо русских букв "егор" видны кракозябры. Можно предположить, что он не понимает кириллицу. Попробуйте изменить имя пользователя или переместить папку проектов в другое место.

      Удалить
    2. спасибо, но я уже сам понял.

      Удалить
  4. Как перевести файл тхт или вордовкий в апк файл, если программа их не находит?

    ОтветитьУдалить
    Ответы
    1. Не очень понял, что значит перевести. Если имеется ввиду включение файла txt или вордовского в ресурсы, то просто перетащите его в папку проекта app - src - main - assets. Кажется, там должны храниться ресурсы...

      Удалить
  5. Помогите пожалуйста "Настроить сценарий" на той ссылке что вы кинули я ничего не понял(

    ОтветитьУдалить
    Ответы
    1. В главе про автоматический способ это описано подробнее.

      Удалить
    2. А что с этим делать?Error:line (24)Gradle DSL method not found: 'runProguard()'

      Удалить
    3. Они там внутри что-то поменяли. Уберите эту строчку, и впишите вместо неё:
      minifyEnabled true

      Удалить
  6. Ответы
    1. Нельзя ли по подробнее о цифровой подписи автора.Из чего она должна состоять? У меня в аппликации есть обращение к Google maps с соответствующим ключом. Должен ли этот ключ фигурировать при создании APK? И если да . то где.
      Я создала APK . Аппликация работает. но Google maps не открывается.

      Удалить
    2. В ручном способе описано создание цифровой подписи и перечислено, из чего она состоит. Про взаимодействие некого ключа и Google maps я не знаю - приложения, использующие Google maps я не писал. Думаю, стоит поискать в Интернете уже готовые тематические статьи на эту тему.

      Удалить
  7. Этот комментарий был удален автором.

    ОтветитьУдалить
  8. Сделал простенькую клавиатуру по этому уроку: http://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android--cms-22615
    Ошибок в Studio не было, apk создался в автоматическом режиме, приложение установилось на телефон, но в списке способов ввода не появляется(
    Подскажете что-нибудь?

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

      Удалить