Как вы встраиваете конфигурацию конкретной конфигурации в APK?

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

Я рассматриваю подход, в котором у меня есть файл шаблона в структуре проекта, и во время сборки используйте ant для интерполяции значений в выходной файл, такой как res/xml/config.xml.

Спасибо заранее!

Ответ 1

Есть несколько способов приблизиться к этому:

1) Настройка приложения для Android-приложений (предназначен для Eclipse)

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

Затем для каждой конкретной сборки, которую вы хотели бы создать, вы бы установили новый проект для Android, который ссылается на ранее созданный проект библиотеки. Этот проект должен иметь свой собственный AndroidManifest, который объявляет компоненты, используемые в приложении библиотеки. Поскольку каждое приложение имеет свой собственный манифест, почти любой тип настройки может быть сделан путем замены компонентов или изменения информации. Однако, учитывая сложные различия, это создает некоторую избыточность в обслуживании, если есть несколько различий.

2) Создал ANT script или другую конструкцию script для управления конфигурацией

ANT script может построить время, чтобы манипулировать источниками или XML файлами, чтобы обеспечить пользовательскую настройку. Самый простой способ сделать это - использовать unix sed или python/ruby ​​script, чтобы выполнить настройку. Это идеальный вариант, когда настройка ограничивается небольшими изменениями и/или просто текстовыми заменами. В большинстве случаев это мой выбор.

Я рекомендую скопировать исходное дерево во временную директорию, прежде чем делать манипуляции таким образом, чтобы ее можно было очистить с помощью "ant clean" и не повлияет на рабочую копию источника.

Одно из предупреждений заключается в том, что я разработал бы такие модификации, чтобы источник все еще строился без запуска script (т.е. вы можете делать стандартные сборки при разработке в eclipse или любой другой среде, не требуя специального script для работать).

Ответ 2

Вы можете просто настроить Maven Android Plugin на основе сборки для вашего apk, который использует фильтрацию ресурсов и профили для ваших различных конфигураций. Проверьте пример morseflash проекта официальных образцов, чтобы увидеть, как все это делается подробно.

Как только у вас установлены профили, вы можете использовать плагин maven invoker для запуска всего этого в одной развертке. И если вы хотите, чтобы он автоматизировал, просто поместите сборку на Hudson.

http://code.google.com/p/maven-android-plugin/

http://code.google.com/p/maven-android-plugin/wiki/Samples

http://www.simpligility.com/2010/11/release-version-management-for-your-android-application/

Ответ 3

Я использую ant script, который читает несколько параметров времени сборки и создает для меня подходящий APK (appname-1.1_ggl, appname-1.1_amz.apk, который содержит ссылки на рынок Google или рынок Amazon, соответственно). Вручную запустить его дважды - это не большая проблема.

Это может быть нереалистично, в зависимости от того, сколько у вас перестановок (вы не упомянули), но вы можете использовать subant, Используя разные buildpath и последующие build.properties для каждой перестановки, которую вы должны вызвать.

Ответ 4

Я использую проект библиотеки, который имеет весь код и два (или более) проекта, ссылающихся на эту библиотеку.

В библиотечном проекте есть файл ресурсов config.xml в папке res, и этот файл переопределяется в других проектах. таким образом, у меня могут быть разные настройки приложения, и каждая сборка имеет свой собственный manifest.xml, чтобы вы могли реально настроить вещи по-разному для каждого типа сборки.

Это также позволяет вам иметь определенный код/​​разрешения/..., который требуется только определенной сборке и упрощает процесс сборки.