#android #eclipse
#Android #eclipse
Вопрос:
У меня есть один проект Android, из которого мне нужно собрать много файлов .apk. Файлы .apk отличаются друг от друга всего несколькими способами:
- в файле манифеста Android есть несколько значений, которые отличаются друг от друга
- некоторые из apk-файлов могут исключать некоторые файлы в папке / res
- другое название пакета
Каков наилучший способ автоматического создания всех этих разных файлов .apk?
Спасибо!
Ответ №1:
Используйте плагин Android Maven. Он поддерживает проекты библиотеки Android.
- Создайте многомодульный проект.
- Поместите все распространенные классы в один модуль (библиотеку).
- Создайте модуль для каждого приложения, которое вы хотите распространять, и сделайте его зависимым от модуля lib.
Вот пример:https://github.com/jayway/maven-android-plugin-samples/tree/master/libraryprojects
(Вам нужно будет создать несколько модулей ‘libraryprojects-mainapp’)
Ответ №2:
Если вы используете git, вы можете создавать разные ветки и проверять каждую из них перед сборкой. Вы также можете написать сценарий оболочки для автоматизации этого, если вы используете Mac или Linux.
Разработка может, например, выполняться в ветке интеграции, которая будет объединена с вашими тремя разными ветвями.
Я не знаю, облегчает ли это вам задачу, но это был бы один из способов.
Комментарии:
1. это то, что я сделал, но мне действительно любопытно, есть ли способ получше. пожалуйста, просветите меня.
Ответ №3:
2011 год — это давно .. но, похоже, решения Eclipse / Netbeans для этого нет. Недавно я столкнулся с такой же проблемой в проекте cordova на Netbeans.
В Android Studio bleeding Edge есть удобное решение под названием «вкусы«.
Он основан на иерархии зеркальных каталогов. Иерархия каталогов «main», которая содержит все файлы «main» сборки, и иерархии каталогов «flavours», каждый каталог flavour содержит файлы, которые будут перезаписывать или дополнять эти «main» во время сборки.
Для моего использования (я не могу перейти на Android Studio) я написал простой ant-скрипт для имитации этой функции. Это работает на Netbeans и Eclipse, и я думаю, что это своего рода независимый от проекта.
Для его использования полная папка проекта должна отступить на один уровень иерархии, а исходная должна быть размещена в каталоге «main». Необходимо создать каталог сборки и поместить несколько папок «вкусов» внутри «вкусов», поскольку это:
├── build.xml < - ant script file
├── main < - original project
├── flavors
│ ├── freeVersion < - files related with a freeVersion app
│ └── paidVersion < - files related with a paidVersion app
└── build < - temporary build folder
Запустив скрипт ($ ant change-flavor), он запросит каталог witch flavor, который вы хотите создать. После ввода пользователем он проверяет наличие каталогов flavor и копирует весь основной каталог в папку build, плюс возможные файлы «flavors», перезаписывая «основные».
Результирующая папка сборки представляет собой совершенно новый собственный проект Android / Cordova / любой другой, который обычно может быть скомпилирован через IDE.
<?xml version="1.0" encoding="UTF-8"?>
<project name="Flavors" basedir="." >
<property name="flavors.dir" value="flavors"/>
<property name="flavors.build.dir" value="build"/>
<property name="flavors.main.dir" value="main"/>
<target name="change-flavor">
<input message="Witch Flavor?" addproperty="flavor.dir" />
<fail message="Empty flavor not allowed">
<condition>
<equals arg1="${flavor.dir}" arg2=""/>
</condition>
</fail>
<fail message="Directory ${flavors.dir}/${flavor.dir} not exists">
<condition>
<not>
<available file="${flavors.dir}/${flavor.dir}" type="dir" />
</not>
</condition>
</fail>
<echo message="Deleting build dir ${flavors.build.dir}"/>
<delete includeemptydirs="true">
<fileset dir="${flavors.build.dir}" includes="**/*"/>
</delete>
<echo message="Copying from main ${flavors.build.dir}"/>
<copy todir="${flavors.build.dir}" includeemptydirs="true" >
<fileset dir="${flavors.main.dir}" includes="**"/>
</copy>
<echo message="Copying from flavor ${flavors.build.dir}"/>
<copy todir="${flavors.build.dir}" includeemptydirs="true" overwrite="true" >
<!-- exclude folder is here because my flavors directories are also netbeans
projects. If similar approach is used on eclipse, maybe put here .project
and .settings folders -->
<fileset dir="${flavors.dir}/${flavor.dir}" includes="**" excludes="nbproject/**"/>
</copy>
</target>
</project>
За каждую сборку версии предусмотрено штрафное время, потому что нет предварительно скомпилированного материала, но в моем случае, я думаю, это того стоит, поскольку единственное, что меняется от версии к другой, — это файлы свойств и ресурсы. Большая часть процесса разработки может быть выполнена в «основном» проекте, варианты — это просто оболочки. Кроме того, это позволяет избежать внедрения в собственную систему сборки cordova / интеграцию netbeans.