Несколько .apk-файлов пакета приложений Android из одного исходного кода - PullRequest
48 голосов
/ 22 сентября 2011

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

Этот вопрос НЕ О:

Google говорит «вам, вероятно, нужно создать отдельные проекты Android для каждого APK, который вы собираетесь опубликовать, чтобы вы могли соответствующим образом разрабатывать их отдельно. Это можно сделать, просто продублировав существующий проект.и дать ему новое имя. "Тогда они любезно предлагают использовать библиотеки, которые я понимаю.Затем они попутно упоминают, что я действительно хочу: «система сборки, которая может выводить различные ресурсы на основе конфигурации сборки»

  • Я знаю, что для выполнения условной компиляции в JAVA можно отключить переменную public static final.Существует пример настройки такого значения в build.xml.Любой более полный пример конфигурации сборки Android Ant для этого или ссылка на проект OSS, делающий это сейчас, пожалуйста?Кстати, build.xml генерируется автоматически, но я видел, как люди его взламывали, так как это работает?

  • С именем пакета, объявленным в Manifest.xml как package = "com.example.appname ", если нужно создать несколько .apks, которые меняют это имя, один застрял с отдельным проектом для каждого?

Ответы [ 10 ]

11 голосов
/ 05 октября 2011

Я генерирую 2 разных APK (демонстрационные и производственные) из одного исходного дерева с 3 небольшими модификациями:

1) У меня public static final DEMO=true; //false; в моем классе Application, и в зависимости от этого значения яиспользуется для переключения кода между демонстрационными и производственными функциями

2) Есть 2 основных действия, например:

package mypackage;
public class MyProduction extends Activity 
{
    //blah-blah
}

package mypackage.demo;
public class MyDemoActivity extends mypackage.MyProductionActivity
{
    //blah-blah
}

3) И, наконец, 2 отдельных файла AndroidManifest.xml, которые указывают на разныедействия запуска в зависимости от переключения демонстрации / производства

Я переключаюсь между двумя APK вручную, но не вижу ничего сложного в написании небольшой задачи ANT для автоматического переключения между ними

10 голосов
/ 03 октября 2011

Один из способов сделать это - сохранить два отдельных файла AndroidManifest.xml, по одному для каждой конфигурации.Вы можете переключаться между ними либо вручную (копирование), либо автоматически (сценарий сборки).

[править] У этого человека есть система, которая делает такие вещи: http://blog.elsdoerfer.name/2010/04/29/android-build-multiple-versions-of-a-project/

5 голосов
/ 21 апреля 2014

ответ на этот крик Gradle, как объяснено на этом веб-сайте . Он официально встроен в Android Studio и приветствуется.

Это удивительно; Я создал 3 отдельных приложения, использующих один и тот же исходный код, с настроенным текстом и графикой, без какого-либо специального кодирования. Требуется только какой-то каталог и настройка Gradle, а другие мои посты можно найти с ответами на оба вопроса.

Кажется, это действительно хорошо объясняет все основы. Чтобы получить ответ на конкретный вопрос, поищите раздел Product Flavors в разделе Build Variants, где описывается указание различных вариантов.

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

Возможно, я не объяснил это лучше, но этот веб-сайт неплохо справляется.

3 голосов
/ 22 сентября 2011

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

Например, я работал над приложениями, в которых они должны быть выпущены как для AndroidМаркет и Amazon AppStore.Amazon AppStore требует, чтобы, если вы ссылаетесь на рыночную страницу приложения, это должна быть страница Amazon (в отличие от страницы Android Market).Вы можете сохранить URL-адрес в ресурсе в библиотеке и использовать его в своем коде, но затем переопределите этот ресурс в проекте Amazon, чтобы он указывал на соответствующий URL-адрес Amazon.

Если вы правильно его структурируете, вы можете сделатьаналогичные вещи в коде, потому что ваша отправная точка - это объект Application, который вы можете создавать подклассами и выполнять разные действия.

При этом, если вы хотите добавить шаг Ant, который изменяет имя пакета в манифесте, он это просто XML.Это не должно быть сложно изменить в качестве шага предварительной компиляции.

2 голосов
/ 14 апреля 2013

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

Как создать несколько файлов Android apk из одной кодовой базы, организованной мультимодульным проектом Maven.

2 голосов
/ 04 октября 2011

В этой статье есть хорошее руководство с примерами того, как изменить файлы конфигурации во время сборки; см., в частности, Настройка сборки и С использованием файла конфигурации Java разделы. Обратите внимание, что некоторые сведения о build.xml и ant немного устарели.

1 голос
/ 20 декабря 2014

Достичь своей цели легко, используя варианты сборки Android Studio, использующие graddle в качестве системы сборки.

Проверьте здесь для получения более подробной информации.

1 голос
/ 06 октября 2011

Моя команда строит 2 разные сборки, используя одну кодовую базу + дополнительный код.Поскольку сборка Android основана на Ant-скрипте, я использую Ant-скрипт для этой работы.

Я использовал xmltask для манипулирования XML-файлом манифеста и многими задачами Ant (regexp, copy ..)редактировать исходный код

Я подготовил шаблон проекта шаблона (включая build.xml, default.properties, local.properties) и скопировал новый исходный код в эти шаблоны проекта.когда копирование завершено, запустите build.xml параллельно, чтобы сократить время сборки.когда сборка завершена, я получаю несколько файлов apk.

1 голос
/ 04 октября 2011

Вот наша ситуация: у нас есть единая кодовая база, из которой мы выпускаем несколько клиентов. У каждого из них свои требования к заголовкам, фонам и другим ресурсам приложения (не говоря уже об именах пакетов).

Сборка обрабатывается скриптом Ruby, который модифицирует AndroidManifest, копирует / заменяет определенные ресурсы из папок, специфичных для клиента, а затем переходит к стандартной процедуре сборки Android. После завершения сборки сценарий сбрасывает измененные файлы в исходное состояние «по умолчанию».

Ну ... Может быть, это не оптимально и определенно не специфично для Android, но вот как мы это делаем.

0 голосов
/ 17 апреля 2013

Я думаю, что лучшим способом остается использовать libray для общих источников и два разных проекта Android для демонстрационных и производственных пакетов. Это потому, что в Java очень просто сделать обратный инжиниринг от apk к источникам. Если вы используете одни и те же источники для демонстрации и производства, кто-то может взломать ваш apk, скачав демонстрационный пакет, распаковать исходники java и разблокировать источники, изменив переменную, чтобы использовать ее в качестве рабочей версии. С помощью библиотеки вы можете сохранить часть исходников в производственном пакете, таким образом, невозможно использовать демонстрационный пакет в качестве производственного пакета.

...