#java #android #configuration #ant #build
#java #Android #конфигурация #ant #сборка
Вопрос:
У меня есть ant script, который выполняет то, что ему нужно, но мне нужно установить несколько значений свойств в зависимости от того, запускаю ли я release или debug. Как мне это сделать?
Если это имеет значение, мой ant script запускает некоторые пользовательские служебные задачи перед выполнением сборки Android.
Чтобы ответить на мой собственный вопрос:
Свойства, которые нужно искать, — это «build.mode.release» и «build.mode.debug«, однако есть предостережение … если в вашем манифесте есть debuggable=»true», система ВОЗВРАЩАЕТСЯ в режим отладки с небольшим «недолетом» (IMO)
- build.mode.release не установлен,
- build.mode.debug также не установлен
- Подпись отладки отключена (необходимо указать хранилище ключей, псевдоним и пароль)
Примечание: Это относится только к сборкам Android
Ответ №1:
Причина «предостережения» фактически задокументирована в main_rules.xml
проекте Android ( $ANDROID_SDK_ROOT/tools/ant/main_rules.xml
):
<target name="-set-release-mode">
<!-- release mode is only valid if the manifest does not explicitly
set debuggable to true. default is false.
We actually store build.packaging.debug, not build.release -->
<xpath input="AndroidManifest.xml" expression="/manifest/application/@android:debuggable"
output="build.packaging.debug" default="false"/>
...
</target>
Итак, что вы хотите проверить, так это build.mode.debug
(выполняется через ant debug
), build.mode.release
(когда @debuggable=false
и выполняется с помощью ant release
) и, наконец, для соответствия вашему предостережению: build.packaging.debug
(когда @debuggable=true
и выполняется с помощью ant release
)
Вот пример, который будет работать при предварительной компиляции автоматически:
<target name="-my-debug-precompile" if="build.mode.debug">
<!-- This is executed for any "debug" build ("ant debug") -->
</target>
<target name="-my-release-precompile" unless="build.mode.debug">
<!-- This is executed for any non-"debug" build (e.g., "ant release",
regardless of the @debuggable attribute in AndroidManifest.xml) -->
</target>
<!-- This is called automatically by Android's ant tasks, and delegates the
task to one of the above two targets: -->
<target name="-pre-compile" depends="-my-debug-precompile,-my-release-precompile" />
Комментарии:
1. main_rules — это то место, где я нашел информацию, которую я опубликовал. Спасибо 🙂
2. @copolii: причина, по которой я остановился, заключается в том, что вы не упомянули 3-е свойство (
build.packaging.debug
) — что верно, когда приложение должно находиться в режиме выпуска (ant release
), но вынуждено вернуться к отладочной сборке из-за@debuggable=true
— а также явно не указали, почему произошло ваше «предостережение». Я также понимаю, что у вас уже было решение, которое сработало для вас, и которое вы описали на словах, но поскольку это ТАК, и другие столкнутся с этим вопросом позже, наличие подробного примера полезно для других; следовательно, цели примера.
Ответ №2:
В качестве обновления к ответу Джо, похоже, что, по крайней мере, в версии 22.3 Android Tools, свойство build.mode.debug больше не существует, но вы можете использовать build.is.packaging.debug для различения debug и release
Комментарии:
1. Мне потребовались часы попыток, прежде чем я наткнулся на это. Это нельзя перегружать. Действительно, теперь
build.is.packaging.debug
Ответ №3:
ant -D<prop-name>=<value>
установит свойство в ant
Комментарии:
1. Я знаю это, но я не вижу условной части этого. Я хочу либо загрузить один из двух файлов (release.properties / debug.properties), либо вручную установить значения свойств из скрипта на основе конфигурации. возьмем, к примеру, путь к каталогу, я хочу out / release и out / debug
2. @copolii использует задачу <условие>: ant.apache.org/manual/Tasks/conditions.html
3. Я в курсе задачи с условием, мне нужно фактическое условие … что-то, что вычисляется как true, если ant script выполняется с «ant release» и false с «ant debug» или наоборот. Где-то должно быть свойство … т. Е. в VisualStudio / MSBuild это $ (configuration), которое оценивается как ‘release’ или ‘debug’
Ответ №4:
окончательный вариант для ant debug и модуля jni:
1. в custom_rules.xml назначьте режим отладки ‘BUILDMODE’
<?xml version="1.0" encoding="UTF-8"?>
<project>
<property name="out.library.jar.file" location="bin/classes.jar" />
<target name="-pre-compile">
<exec executable="ndk-build">
<arg value="BUILDMODE=${build.is.packaging.debug}" />
</exec>
</target>
</project>
- jni / Android.mk, добавьте следующее:
ifeq ($(BUILDMODE), true)
LOCAL_CFLAGS=-DDEBUG
endif