Создайте несколько APK для разных размеров экрана.

Если вы публикуете свое приложение в Google Play, вам необходимо создать и загрузить пакет Android App Bundle . Когда вы это сделаете, Google Play автоматически создаст и предоставит оптимизированные APK-файлы для конфигурации устройства каждого пользователя, поэтому они загружают только тот код и ресурсы, которые им необходимы для запуска вашего приложения. Публикация нескольких APK-файлов полезна, если вы не публикуете их в Google Play, но вам необходимо самостоятельно создавать, подписывать и управлять каждым APK-файлом.

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

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

Пытаясь создать приложение, которое работает на устройствах Android разных размеров, естественно, вы хотите, чтобы ваше приложение использовало все доступное пространство на более крупных устройствах, не жертвуя при этом совместимостью или удобством использования на экранах меньшего размера. Поначалу может показаться, что поддержка нескольких APK — лучшее решение, но зачастую это не так. Раздел «Использование одного APK вместо» руководства для разработчиков нескольких APK содержит полезную информацию о том, как сделать это с помощью одного APK, включая использование нашей библиотеки поддержки. Вам также следует прочитать руководство по поддержке нескольких экранов , и есть даже библиотека поддержки , которую вы можете скачать с помощью Android SDK, которая позволяет использовать фрагменты на устройствах до Honeycomb (что значительно упрощает поддержку нескольких экранов в одном APK).

Если вы можете справиться с этим, ограничение вашего приложения одним APK-файлом имеет ряд преимуществ, в том числе:

  • Публикация и тестирование стали проще
  • Необходимо поддерживать только одну кодовую базу
  • Ваше приложение может адаптироваться к изменениям конфигурации устройства.
  • Восстановление приложений на всех устройствах просто работает
  • Вам не нужно беспокоиться о рыночных предпочтениях, поведении при «обновлениях» с одного APK на другой или о том, какой APK подходит к какому классу устройств.

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

Напишите свои требования

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

маленький нормальный большой большой

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

маленький нормальный большой большой

В зависимости от ваших потребностей вы также можете иметь два APK: «маленький и все остальное» или «xlarge и все остальное». Раскрашивание диаграммы также упрощает общение внутри команды: теперь вы можете просто называть каждый APK «синим», «зеленым» или «красным», независимо от того, сколько различных типов экранов он охватывает.

Поместите весь общий код и ресурсы в проект библиотеки.

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

Примечание. Подробности реализации создания и включения проектов библиотек выходят за рамки этого урока, но вы можете быстро освоиться, прочитав «Создание библиотеки Android» .

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

С другой стороны, если вы создаете приложение с нуля, постарайтесь сначала как можно больше написать код в проекте библиотеки, а затем при необходимости переместите его в отдельный APK. В долгосрочной перспективе с этим гораздо проще справиться, чем добавлять его в один, затем в другой, затем в третий, а затем месяцами позже пытаться выяснить, можно ли переместить этот большой объект в раздел библиотеки, не испортив ничего.

Создавайте новые проекты APK

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

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

После создания проектов добавьте проект библиотеки в качестве ссылки на каждый проект APK. Если возможно, определите начальное действие в проекте библиотеки и расширьте это действие в проекте APK. Наличие стартового действия, определенного в проекте библиотеки, дает вам возможность разместить всю инициализацию вашего приложения в одном месте, так что каждому отдельному APK не придется повторно реализовывать «универсальные» задачи, такие как инициализация Analytics, запуск проверок лицензии и т. д. другие процедуры инициализации, которые не сильно меняются от APK к APK.

Настройте манифесты

Когда пользователь загружает приложение, использующее несколько APK-файлов, через Google Play, правильный APK-файл выбирается с использованием двух простых правил:

  • В манифесте должно быть указано, что конкретный APK соответствует требованиям.
  • Из подходящих APK-файлов побеждает наивысший номер версии.

В качестве примера возьмем описанный ранее набор из нескольких APK и предположим, что каждый APK настроен на поддержку всех размеров экрана, превышающих его «целевой» размер экрана. В отдельности возможный диапазон каждого APK будет выглядеть следующим образом:

маленький нормальный большой большой
маленький нормальный большой большой
маленький нормальный большой большой

Однако, используя правило «выигрывает наибольший номер версии», если мы установим атрибут versionCode в каждом APK так, чтобы красный ≥ зеленый ≥ синий, диаграмма фактически свернется до следующего вида:

маленький нормальный большой большой

Теперь давайте предположим, что у Red APK есть некоторые требования, которых нет у двух других. На странице «Фильтры в Google Play» руководства для разработчиков Android приведен целый список возможных виновников. Для примера предположим, что для красного цвета требуется фронтальная камера. Фактически, весь смысл красного APK-файла заключается в том, чтобы использовать дополнительное доступное пространство экрана для развлечений с помощью фронтальной камеры. Но, оказывается, не на всех устройствах xlarge ЕСТЬ даже фронтальная камера! Ужас!

К счастью, если пользователь просматривает Google Play с одного из таких устройств, Google Play просмотрит манифест, увидит, что Red указывает наличие фронтальной камеры в качестве требования, и спокойно проигнорирует это, определив, что Red и это устройство не являются обязательными. матч, созданный на цифровом раю. Тогда он увидит, что Green не только совместим с устройствами xlarge, но его не волнует, есть ли фронтальная камера или нет! Пользователь по-прежнему может загрузить приложение из Google Play, потому что, несмотря на всю проблему с фронтальной камерой, все еще существовал APK, который поддерживал этот конкретный размер экрана.

Чтобы все ваши APK-файлы находились на отдельных «дорожках», важно иметь хорошую схему кода версии. Рекомендуемый вариант можно найти в разделе «Коды версий» нашего руководства для разработчиков. Поскольку примерный набор APK имеет дело только с одним из трех возможных измерений, было бы достаточно разделить каждый APK на 1000 и увеличить его. Это может выглядеть так:

Синий: 1001, 1002, 1003, 1004...
Зелёный: 2001, 2002, 2003, 2004...
Красный: 3001, 3002, 3003, 3004...

Если сложить все это вместе, ваши манифесты Android, скорее всего, будут выглядеть примерно так:

Синий:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Зеленый:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Красный:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Обратите внимание, что технически несколько APK-файлов будут работать либо с тегом support-screens, либо с тегом совместимых экранов. Supports-screens обычно предпочтительнее, и использовать оба тега в одном манифесте обычно очень плохая идея. Это неоправданно усложняет задачу и увеличивает вероятность ошибок. Также обратите внимание, что вместо использования значений по умолчанию (маленький и нормальный всегда верны по умолчанию), манифесты явно устанавливают значение для каждого размера экрана. Это может избавить вас от головной боли в будущем. Например, в манифесте с целевым SDK < 9 для параметра xlarge автоматически будет установлено значение false, поскольку такого размера еще не существовало. Так что будьте откровенны!

Просмотрите контрольный список перед запуском

Перед загрузкой в ​​Google Play дважды проверьте следующие пункты. Помните, что они относятся конкретно к нескольким APK-файлам и никоим образом не представляют собой полный контрольный список для всех приложений, загружаемых в Google Play.

  • Все APK-файлы должны иметь одинаковое имя пакета.
  • Все APK должны быть подписаны одним и тем же сертификатом.
  • Для каждого размера экрана, который должен поддерживать APK, в манифесте установите значение true. Для каждого размера экрана, которого вы хотите избежать, установите значение false.
  • Дважды проверьте фильтры манифеста на предмет противоречивой информации (APK, который поддерживает только кексы на экранах XLARGE, никто не увидит).
  • Манифест каждого APK должен быть уникальным хотя бы для одной поддерживаемой версии экрана, текстуры OpenGL или версии платформы.
  • Попробуйте протестировать каждый APK хотя бы на одном устройстве. За исключением этого, на вашей машине разработки находится один из самых настраиваемых эмуляторов устройств в отрасли. С ума сойти!

Также стоит проверить скомпилированный APK перед выпуском на рынок, чтобы убедиться в отсутствии каких-либо сюрпризов, которые могут скрыть ваше приложение в Google Play. На самом деле это довольно просто с помощью инструмента «aapt». Aapt (инструмент упаковки ресурсов Android) — это часть процесса сборки для создания и упаковки приложений Android, а также очень удобный инструмент для их проверки.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Когда вы проверяете выходные данные aapt, обязательно убедитесь, что у вас нет конфликтующих значений для support-screens и совместимых-screens, а также что у вас нет непреднамеренных значений «uses-feature», которые были добавлены в результате разрешений, которые вы установлен в манифесте. В приведенном выше примере APK будет невидим для большинства, если не для всех, устройств.

Почему? Добавление необходимого разрешения SEND_SMS неявно добавило требование к функции android.hardware.telephony. Поскольку большинство (если не все) устройств xlarge представляют собой планшеты без телефонного оборудования, Google Play в этих случаях будет отфильтровывать этот APK до тех пор, пока не появятся будущие устройства, которые будут достаточно большими, чтобы сообщать о размере экрана xlarge, и будут обладать телефонным оборудованием.

К счастью, это легко исправить, добавив в манифест следующее:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

Требование android.hardware.touchscreen также добавляется неявно. Если вы хотите, чтобы ваш APK был виден на телевизорах без сенсорного экрана, вам следует добавить в свой манифест следующее:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Заполнив контрольный список перед запуском, загрузите APK-файлы в Google Play. Приложению может потребоваться некоторое время, чтобы оно появилось при просмотре Google Play, но когда это произойдет, выполните последнюю проверку. Загрузите приложение на любые тестовые устройства, которые вам могут понадобиться, чтобы убедиться, что APK-файлы предназначены для нужных устройств.

Дополнительную информацию о публикации нескольких APK-файлов в Google Play можно найти в статье Поддержка нескольких APK-файлов .