Android的发布版和调试版应该使用不同的字符串值

31
每当我发布我的应用程序时,我会更改所有的URL字符串和一些密钥,从测试环境变成生产环境。我的做法是在发布之前注释掉测试字符串。是否有更好的方法来处理基于构建类型的字符串?

4
在Gradle中声明一个变量并在Java代码中使用,是可能的。你可以将变量声明在build.gradle文件中,并使用project.ext来引用它。在Java代码中,你可以使用project对象的getProperty方法来获取该变量的值。 - CommonsWare
我正在寻找这个.. 很棒的问题和答案.. - DJphy
3
不要那样做。用你的方法在生产代码中出现错误字符串的可能性相当高。请按照以下方式操作:http://developer.android.com/tools/building/configuring-gradle.html - Rusheel Jain
@RusheelJain,有没有仅针对Android资源值的解决方案? - spaceMonkey
@spaceMonkey 是的,就是我给你的链接。我知道这个,因为今天我自己试过了 :P我在下面的回答中写了步骤。如果有什么不清楚的地方,请告诉我 :) - Rusheel Jain
3个回答

57
假设您使用Android Studio,默认情况下系统会创建一个基本的releasedebug版本。因此,如果您在项目的app/src文件夹中添加debugrelease文件夹,则可以在这些文件夹中声明不同的值。
因此,您的结构应该像这样:
project
  -app
    -src
      -debug
        -java
          ...
        -res
          -values
            -strings.xml
      -release
        -java
          ...
        -res
          -values
            -strings.xml
      -main
        -java
          ...
        -res
          -values
            -strings.xml

我应该补充一点,如果你有一个字符串没有在 debug 或者 release 文件夹中被定义,那么它会回退到你的 main 文件夹。


1
每次我在做某些事情的时候,我都应该更新这三个文件夹吗? - spaceMonkey
将URL特定字符串分离到单独的"url-strings.xml"文件中,然后在以下位置设置: project/app/src/main/res/values/strings.xml project/app/src/debug/res/values/url-strings.xml project/app/src/release/res/values/url-strings.xml - k3b
5
不,你只需将应用程序放在默认的“main”文件夹中。任何需要在“debug”或“release”构建中不同的资源,您只需添加到strings.xml(或如@k3b所提到的其他文件)中即可。Android Studio始终会回退到“main”文件夹,因此您可以在“debug”/“release”文件夹中只有1个URL字符串,它只会使用那些。 - Jasper van de Klundert
1
我不得不使用这个来处理我在三个新的资源文件中创建的Admob广告单元(用于主要、调试和发布)。在我的情况下,拥有一个发布版本并不是必要的,尽管我仍然创建了它。但是我让admob.xml的发布和主要版本相同(复制和粘贴),因为我正在将其移植到其他只能识别主文件夹中文件的操作系统上。 - aphoe
还要确保在Android Studio中更改构建变体,以管理所有集成。 - Juan Saravia

8

如果只需要用几个字符串,可以使用Gradle。

buildTypes {
    release {
        resValue 'string', 'adUnitIdMain', '"production-id-value-should-be-here"'
        resValue 'string', 'adUnitIdList', '"production-id-value-should-be-here"'
        resValue 'string', 'adUnitIdDetail', '"production-id-value-should-be-here"'
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        resValue 'string', 'adUnitIdMain', '"test-id-value-should-be-here"'
        resValue 'string', 'adUnitIdList', '"test-id-value-should-be-here"'
        resValue 'string', 'adUnitIdDetail', '"test-id-value-should-be-here"'
    }
}

1
对于那些想要了解更多关于resValue的人,您可以在此处阅读DSL文档:https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.BuildType.html,该文档由Google文档链接提供:https://developer.android.com/studio/build/build-variants#build-types。 - Bruno Bieri
2
我正在寻找一个放置我的adMob单元ID的地方,而这里是一个完美的选择,而不是strings.xml。谢谢! - GiveEmTheBoot

1

在build.gradle中创建两个版本。然后按照链接中给出的方式再创建两个目录(developer.android.com/tools/building/configuring-gradle.html)。 由于只需要更改字符串,所以只需将strings.xml文件复制到新目录中(即dev和production) 删除原始的strings.xml即可。

就是这样。 :)

不需要移动java文件或其他布局文件。

简而言之,在所有构建版本中都应该保持一致的“main”目录中保留所有内容。 将依赖于构建版本的值覆盖到各自的目录中。


构建风味?你是指“构建类型”还是“产品风味”? - spaceMonkey
抱歉。是的,产品口味像测试和生产。 - Rusheel Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接