Передача свойств в файл сборки проекта библиотеки Android
У меня есть проект приложения для Android, который разделен на бесплатную и платную версию. Все, что является общим для обоих проектов, находится в проекте библиотеки Android под названием "ядро". Тогда у меня есть реальные проекты приложений для Android как для платной, так и для бесплатной версии.
Я использую скрипты Ant для создания этих двух APK. Платная версия устанавливает свойство, которое сообщает "базовому" проекту о создании платной версии. Бесплатная версия сообщает базовому проекту, что бесплатная версия строится.
Раньше это прекрасно работало, пока Google не решил выпустить ADT 22. Теперь "основной" проект больше не собирает эти свойства сборки.
Я подозреваю, что библиотечные проекты теперь создаются в отдельной среде / процессе сборки Ant.
Итак, вот мой вопрос: как определить свойства для проектов библиотек Android, на которые есть ссылки, в файле build.xml проекта приложения? Как передать свойства в эти сборки проекта библиотеки?
И где в файле build.xml SDK фактически скомпилированы библиотечные проекты? Я думаю, это было бы правильное место для изучения.
Спасибо за ваше время.
2 ответа
РЕДАКТИРОВАТЬ для уточнения
Вы должны создать модифицированную копию оригинала build.xml
файл из Android SDK (см. SDK-Folder/tools/ant
), а также время от времени обновлять его, когда Google выпускает обновление ADT, объединяя различия (и, конечно, сохраняя собственные модификации).
build.xml
файл строит проекты библиотеки с использованием <subant>
задача, которая в основном запускает отдельную среду сборки, которая автоматически не видит никаких свойств вызывающей области (которая будет средой сборки проекта приложения).
Однако в рамках этого subant
тег, вы можете экспортировать свойства области звонящего в XML библиотеки сборки, используя <propertyset>
тег. Ищите следующий блок кода в вашей копии build.xml
и внесите изменения, как показано ниже:
....
<echo level="info">Building Libraries with '${project.libraries.target}'...</echo>
<!-- no need to build the deps as we have already
the full list of libraries -->
<subant failonerror="true" buildpathref="project.library.folder.path" antfile="build.xml">
<!-- *** ADD THIS: *** -->
<propertyset id="project.library.buildargs">
<propertyref prefix="project.library.buildargs" />
</propertyset>
<target name="nodeps" />
<target name="${project.libraries.target}" />
<property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />
</subant>
....
Приведенный выше пример делает все приложение проекта build.xml
свойства с префиксом project.library.buildargs.
видимый для всех упомянутых скриптов сборки библиотеки Android.
Альтернативное решение, которое я нашел для предоставления различных значений для моей бесплатной версии по сравнению с моей платной версией, заключается в использовании [resources]. Цепочка сборки Android позволяет проектам приложений переопределять значения ресурсов, установленные в проекте общей библиотеки.
Так, например, вы можете иметь логический ресурс в любом файле XML в res/values
:
<bool name="paid_version">false</bool>
Конечно, платная версия имеет тот же ресурс в своем собственном res/values
подкаталог со значением true
,
Тогда из Activity
подкласс или любой другой класс с Context
Вы можете сделать следующее:
if (getResources().getBoolean(R.id.paid_version)) {
// Do the paid version code here
}
Это имеет то преимущество, что его довольно легко реализовать. С другой стороны, это проверка во время выполнения на основе динамического кода. Это означает, что код не может быть оптимизирован компилятором или любым другим инструментом статического анализа, когда значение ресурса установлено в false
,