当我在使用 telegram 的时候,我意识到一些问题,并且自行修改了,改了什么不是关键,有兴趣的朋友可以自行去看看 我的版本 。在编译的时候,我需要提供 2 个版本,一,我自己的版本,二,分享给大家顺便使用的版本。其实二者唯一的差别就是 App 名称不一样,我自己的版本我想叫「Tel4Drakeet」,但分享给别人,叫这个名字可能不太合适。
因此,我如果每次手动修改再进行编译,显然很麻烦。于是想到借助 gradle,想到林的那篇文章,原本我只知道 buildConfigField 和类似友盟多渠道打包那样,修改清单文件内容 manifestPlaceholders,但这两种都不是我现在想要的,我要的是能够修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值。
在林的文章中正好找到这点,貌似在整个互联网上并不容易找到。所以我要总结记录下来:
使用 gradle 在编译时动态设置 Android resValue
在你的 gradle 内容 buildTypes 或者 productFlavors 下面,如 release 体内写上类似:
resValue "string", "AppName", "Tel4Drakeet"
意为把名为 AppName 的 string value 值改为 Tel4Drakeet,完整地和多个 buildType 结合可以参考我的 Tel4Drakeet 的 gradle 文件。
使用 gradle 在编译时动态设置 Android BuildConfig
在同上的地方写上:
buildConfigField "String", "ENDPOINT", "http://example.com"
gradle sync 一下后,BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就可以供 Java 代码调用了。
使用 gradle 在编译时动态设置 Android Manifest
我们在使用友盟多渠道打包的时候,有这么种方式可以在编译的时候动态修改清单文件中的内容,从而实现不同渠道不同标识值。
你需要在 AndroidManifest.xml 中,对友盟的渠道进行如下配置:
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/>
然后在你的 product flavor 中写上:
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GooglePlay"]
这样清单文件中原本预设的 ${UMENG_CHANNEL_VALUE} 这个值就会被替换为”GooglePlay”。如果要和 Java 配合调用,就是如上所示,结合访问 meta-data 即可,这里不展开了。