我有一个Android应用程序项目,分为免费版和付费版。两个项目共有的所有内容都存在于名为“core”的Android库项目中。然后我有付费和免费版本的实际Android应用程序项目。
我正在使用Ant脚本来构建这两个APK。付费版本设置一个属性,告诉付费版本正在构建的“核心”项目。免费版本告诉核心项目免费版本正在构建。
在谷歌决定发布ADT 22之前,以前的工作非常好。现在“核心”项目已不再使用这些构建属性了。
我怀疑库项目现在是在一个单独的Ant构建环境/流程中构建的。
所以这是我的问题:如何在app项目的build.xml文件中定义引用的Android库项目的属性?如何将属性传递给这些库项目构建?
SDK的build.xml文件中实际编译的库项目在哪里?我想这将是适合调查的地方。
感谢您的时间。
答案 0 :(得分:3)
编辑以澄清
您必须从Android SDK创建原始build.xml
文件的修改后的副本(请参阅SDK-Folder/tools/ant
),并且当Google通过合并发布ADT更新时,不时地让它保持最新差异(并保持自己的修改)。
build.xml
文件使用<subant>
任务构建库项目,该任务基本上启动一个单独的构建环境,该环境不会自动查看调用范围的任何属性(这将是应用程序项目的构建环境) 。
但是,在subant
标记内,您可以使用<propertyset>
标记将调用者范围的属性导出到库的构建XML。在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库构建脚本都可见。
答案 1 :(得分:1)
我发现为我的免费版本与付费版本提供不同值的替代解决方案是使用[资源]。 Android构建链允许应用程序项目覆盖共享库项目中设置的资源值。
例如,您可以在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
时,编译器或任何其他静态分析工具无法优化代码。