Подтвердить что ты не робот

Несколько файлов приложений .pk для Android приложений из одного исходного кода

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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 для автоматического переключения между ними.

Ответ 2

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

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

Ответ 3

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

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

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

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

Я, вероятно, не объяснил это лучше всего, но этот веб-сайт выполняет довольно хорошую работу.

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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