4

我有一个 Android 应用程序项目,它分为免费和付费版本。这两个项目共有的所有内容都位于一个名为“core”的 Android 库项目中。然后,我有付费版和免费版的实际 Android 应用程序项目。

我正在使用 Ant 脚本来构建这两个 APK。付费版本设置一个属性,告诉“核心”项目付费版本正在构建。免费版告诉核心项目免费版正在构建。

在 Google 决定发布 ADT 22 之前,这曾经工作得非常好。现在“核心”项目不再使用这些构建属性。

我怀疑库项目现在是在单独的 Ant 构建环境/进程中构建的。

所以这是我的问题:如何在应用项目的 build.xml 文件中为引用的 Android 库项目定义属性?如何将属性传递给这些库项目构建?

SDK 的 build.xml 文件中实际编译的库项目在哪里?我想那将是研究的正确地点。

谢谢你的时间。

4

2 回答 2

3

编辑澄清

您必须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 库构建脚本都可见。

于 2013-05-30T19:24:14.000 回答
1

我发现为我的免费版本和付费版本提供不同价值的另一种解决方案是使用 [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

于 2013-05-30T21:01:33.170 回答