Введение
Ручной способ
Автоматический способ
Комфорт среды программирования во многом зависит от количества второстепенных действий, не относящихся к программированию, которые требуется выполнять программисту, а также глубины изучения самой среды разработки для её правильной настройки под собственные нужды. В этом смысле идеалом, на мой взгляд, является среда Дельфи, заточенная как раз-таки на максимально простую и быструю разработку приложений для Windows (справедливости ради замечу, что с разработкой приложений под Android и другие системы там пока ещё не всё так гладко, как хотелось бы).
В этом смысле в царстве Android нет достаточно комфортных сред разработки, как это, впрочем, и полагается программам в мире бесплатных операционных систем. Ещё до недавнего времени центральным средством разработки считался Eclipse со специализированными плагинами. Однако летом 2013 года Google представил на суд общественности новую IDE — Android Studio, основанную на давнишнем конкуренте Eclipse — системе IntelliJ IDEA. Надо сказать, что несмотря на раннюю версию системы, не вошедшую ещё даже в стадию Beta, она уже превосходит удобством Eclipse.
Тем не менее, программистам всё ещё приходится вникать как в многочисленные нюансы настройки среды, так и в непривычные действия по формированию конечных файлов приложений, готовых к распространению. И это всё на фоне изучения тех специфичных классов, которые приходится использовать, чтобы заставить интерфейс должным образом работать с кодом.
После такого большого вступления, я всего лишь расскажу, как в Android Studio можно генерировать конечные apk-файлы, готовые к распространению, ибо есть нюансы. Надеюсь, моя статья хоть как-то облегчит жизнь начинающим пользователям этой, пожалуй, лучшей на сегодняшний день IDE для программирования под Android.
Ручной способ
- В левом нижнем углу Android Studio есть маленькая кнопочка, управляющая отображением специальных ярлыков у краёв экрана. Ярлыки открывают различные вспомогательные окна. Кроме того, при простом наведении на эту кнопочку указателя мыши, появляется список всех этих окон для быстрого открытия нужного. Откроем окно Build Variants и напротив нашего модуля в поле Build Variant переключим режим сборки с debug на release.
- В основном меню открываем 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.
- Открывается окно помощника генерации подписи для apk-файла. Мы уже знаем, что все распространяемые приложения для Android должны иметь цифровую подпись автора, иначе приложение не установится на устройства пользователей. Сгенерированная подпись должна храниться в специальном файле-хранилище, расположенном на вашем компьютере, откуда потом она будет извлекаться для подписания apk-файлов. При этом одно хранилище может хранить несколько подписей для разных apk-файлов. Кроме того, одна и та же подпись может использоваться для подписания разных apk-файлов. Итак, для создания хранилища нажимаем кнопку Create New… и заполняем открывшиеся в окне поля:
- Путь для размещения файла хранилища
- Пароль и подтверждение для доступа к хранилищу
- Имя подписи, по которому она будет вызываться
- Пароль и подтверждение для доступа к подписи
- Срок действия подписи (по умолчанию 25 лет, оставляем без изменений)
- Хотя бы одно из полей сертификата. Обычно заполняют имя и фамилию, город и страну (RU).
- Нажимаем OK. Окно закрывается, и мы видим, что все поля в предыдущем окне автоматически заполнились введёнными нами данными. Ставим галочку в поле Remember Password, чтобы каждый раз не набирать пароль, и нажимаем OK.
- В следующем окне контролируем путь и имя apk-файла. По умолчанию оно равно имени модуля. Включаем галочку Run ProGuard, чтобы наш файл был оптимизирован, и можем даже поменять файл конфигурации proguard-android.txt на proguard-android-optimize.txt для более жёсткой оптимизации (хотя это может быть чревато для некоторых экзотичных смартфонов). Нажимаем Finish и ждём, посматривая в строку состояния.
- Когда сборка проекта закончится, отобразится окошко с предложением открыть папку с полученным 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 способен читать информацию из файла по мере необходимости, а не загружать в память весь пакет целиком. В итоге уменьшается объем оперативной памяти, потребляемой запущенным приложением.
Спасибо!
ОтветитьУдалитьПожалуйста! :-)
УдалитьПожалуйста! )
ОтветитьУдалитьСпасибо!
ОтветитьУдалитьПожалуйста )
УдалитьСкомпилировал таким образом HelloWorld. Загрузил получившийся apk файл на телефон, попробовал поставить но получил сообщение "Ошибка при синтаксическом анализе пакета", видимо без бубна тут все таки не обойтись... =(
ОтветитьУдалитьХм... Ручным или автоматическим? В любом случае так получается? Отлаживаете на устройстве или в эмуляторе? Если на устройстве, то при отладке работает?
УдалитьИ так и так пробовал - результат один, но это на устройстве! А в эмуляторе все отлично работает, хотя нет, пробовал APK файлик отдельно загрузить на эмулятор и при установке тоже пишет ошибку. Вечером буду разбираться с отладчиком... В любом случае, огромное спасибо за статью, информации действительно не много даже для того чтобы элементарный HelloWorld запустить))
УдалитьМожет у вас не соответствует версия Android на телефоне?!
УдалитьОтлично. "Ошибка при синтаксическом анализе пакета" и это HelloWorld. В эклипс без проблем собирался
Удалить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
что делать
Анализировать то, что он вам пишет.
УдалитьОн говорит, что файл не найден и показывает полное имя этого файла, в пути которого вместо русских букв "егор" видны кракозябры. Можно предположить, что он не понимает кириллицу. Попробуйте изменить имя пользователя или переместить папку проектов в другое место.
спасибо, но я уже сам понял.
УдалитьКак перевести файл тхт или вордовкий в апк файл, если программа их не находит?
ОтветитьУдалитьНе очень понял, что значит перевести. Если имеется ввиду включение файла txt или вордовского в ресурсы, то просто перетащите его в папку проекта app - src - main - assets. Кажется, там должны храниться ресурсы...
УдалитьПомогите пожалуйста "Настроить сценарий" на той ссылке что вы кинули я ничего не понял(
ОтветитьУдалитьВ главе про автоматический способ это описано подробнее.
УдалитьА что с этим делать?Error:line (24)Gradle DSL method not found: 'runProguard()'
УдалитьОни там внутри что-то поменяли. Уберите эту строчку, и впишите вместо неё:
УдалитьminifyEnabled true
спасибо
ОтветитьУдалитьПожалуйста! )
УдалитьНельзя ли по подробнее о цифровой подписи автора.Из чего она должна состоять? У меня в аппликации есть обращение к Google maps с соответствующим ключом. Должен ли этот ключ фигурировать при создании APK? И если да . то где.
УдалитьЯ создала APK . Аппликация работает. но Google maps не открывается.
В ручном способе описано создание цифровой подписи и перечислено, из чего она состоит. Про взаимодействие некого ключа и Google maps я не знаю - приложения, использующие Google maps я не писал. Думаю, стоит поискать в Интернете уже готовые тематические статьи на эту тему.
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьСделал простенькую клавиатуру по этому уроку: http://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android--cms-22615
ОтветитьУдалитьОшибок в Studio не было, apk создался в автоматическом режиме, приложение установилось на телефон, но в списке способов ввода не появляется(
Подскажете что-нибудь?
Клавиатурами я не занимался, поэтому ни с чем подобным не сталкивался. Думаю, будет правильнее спросить об этом у автора урока с клавиатурой.
Удалить