6

某些 Android 库(例如Google Analytics )将资源用于配置目的(例如ga_trackingId)。

在这些情况下,我对调试和生产有不同的价值观。我目前所做的是在调试时手动注释生产值,反之亦然。它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--  DEBUG -->
    <string name="ga_trackingId">UA-12345678-1</string>
    <integer name="ga_dispatchPeriod">1</integer>
    <bool name="ga_debug">true</bool>

    <!--  PRODUCTION -->    
    <!--string name="ga_trackingId">UA-87654321-1</string>
    <integer name="ga_dispatchPeriod">120</integer>
    <bool name="ga_debug">false</bool-->
</resources>

这种切换配置的方式既繁琐又容易出错,如果我不小心,还会产生不必要的存储库更改。有没有更好的办法?

(例如:在 iOS 上,我使用IF DEBUG宏的条件编译)

4

2 回答 2

10

在该src文件夹下,您可能有一个main存储所有共享内容的文件夹。但是您可以拥有用于风味或构建类型的特定资源。

在您将放置 xml 文件副本但内容正确的文件夹debug下放置一个名为的文件夹。src您必须维护文件夹结构,debug以便将global_tracker.xml需要放置在../src/debug/res/xml

您的文件夹结构应如下所示:

在此处输入图像描述

Android Studio 会感知到这个 xml 文件有多个版本。

这是您应该在 AS 中看到的内容:

在此处输入图像描述

您可以将它用于所有类型的资源,即,拥有同一个文件的多个版本,它将被“神奇地”正确选择。

于 2017-08-02T21:13:11.457 回答
1

我对依赖于签名的谷歌地图密钥有类似的问题。我所做的是使用有条件地生成/复制资源到项目的 ant 脚本。您可以在 Eclipse 中的 Project>Properties>Builders 下包含 ant 脚本

如果您需要在代码中使用 DEBUG 值,您可以创建一个带有静态值的 java 文件,该文件也将有条件地包含在内。

请评论 ant 环境变量是否正常工作(执行脚本后,您可以在控制台中看到“构建类型:”消息)。

<project name="build-res">
<property name="conditional.resources.dir" value="myresources" />
<property name="keys_file" value="res/values/keys.xml" />

<target name="copy-release" if="${build.mode.release}" >
    <property name="build.type" value="Release" />
    <echo message="Build type: ${build.type}" />
    <property name="google.maps.key" value="nanana-value-for-release" />
    <copy file="${conditional.resources.dir}/Release.java" tofile="gen/com/example/project/BuildInfo.java" />
</target>

<target name="copy-debug" if="${build.mode.debug}">
    <property name="build.type" value="Debug" />
    <echo message="Build type: ${build.type}" />
    <property name="google.maps.key" value="lalala-value-for-debug" />
    <copy file="${conditional.resources.dir}/Debug.java" tofile="gen/com/example/project/BuildInfo.java" />
</target>

<target name="build-res" depends="copy-debug,copy-release">
    <echo file="${keys_file}" message="&lt;?xml version='1.0' encoding='utf-8'?&gt;&lt;resources&gt;&lt;string name='google_maps_key'&gt;${google.maps.key}&lt;/string&gt;&lt;/resources&gt;" />
</target>
</project>
于 2013-03-06T09:12:19.897 回答