我有一个ant脚本,它可以做它需要做的事情,但我需要根据我是在运行发布还是调试来设置一些属性值。我该怎么做?
如果有区别的话,我的ant脚本在执行android构建之前会运行一些自定义的实用程序任务。
回答我自己的问题:
要查找的属性是"build.mode.release"one_answers"build.mode.debug",但有一个警告。。。如果您的清单具有可调试="true",则系统将切换到带有轻微"短期"(IMO)的调试模式
- build.mode.release未设置
- build.mode.debug是 也未设置
- 调试签名被禁用(您必须提供密钥库、别名和密码)
注意:这仅适用于Android构建的
"警告"的原因实际上记录在Android main_rules.xml
项目($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" />
作为对Joe答案的更新,至少在Android Tools版本22.3中,属性build.mode.debug似乎已不存在,但您可以使用uild.is.package.debug来区分调试和发布
ant -D<prop-name>=<value>
将在ant 中设置属性
ant调试和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