обнаружение конфигурации сборки (debug или release) в ant script

#java #android #configuration #ant #build

#java #Android #конфигурация #ant #сборка

Вопрос:

У меня есть ant script, который выполняет то, что ему нужно, но мне нужно установить несколько значений свойств в зависимости от того, запускаю ли я release или debug. Как мне это сделать?

Если это имеет значение, мой ant script запускает некоторые пользовательские служебные задачи перед выполнением сборки Android.


Чтобы ответить на мой собственный вопрос:

Свойства, которые нужно искать, — это «build.mode.release» и «build.mode.debug«, однако есть предостережение … если в вашем манифесте есть debuggable=»true», система ВОЗВРАЩАЕТСЯ в режим отладки с небольшим «недолетом» (IMO)

  1. build.mode.release не установлен,
  2. build.mode.debug также не установлен
  3. Подпись отладки отключена (необходимо указать хранилище ключей, псевдоним и пароль)

Примечание: Это относится только к сборкам 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>
  
  1. jni / Android.mk, добавьте следующее:

ifeq ($(BUILDMODE), true)
LOCAL_CFLAGS=-DDEBUG
endif