今天开发组长问了这么一个问题,如何实现通过gradle编译动态设置代码里的一些值。可能这么说不太明白,下面说依稀具体需求。

开发中有两个服务器:一个用于测试版本、一个用于线上版本发布,这两个服务器地址不同。现在想通过在编译版本的时候,不去手动更改服务器地址,而是编译测试版本时,代码中使用的地址就是测试服务地址,编译线上版本时,使用线上服务地址。如何实现? 实现原理和多渠道打包是一样的。下面展示代码:

(1) 在App的AndroidManifest.xml文件中Application节点下添加:

<meta-data
android:name="DATA_NAME"
android:value="${DATA_NAME_VALUE}" />

(2)在App的build.gradle文件中添加:

defaultConfig {
applicationId "com.gradle.asdemo"
versionCode Integer.parseInt(project.VERSION_CODE)
versionName project.VERSION_NAME
minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK)
targetSdkVersion Integer.parseInt(project.ANDROID_TARGET_SDK_VERSION)
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [DATA_NAME_VALUE: "http://www.mamami.com"] //设置默认的值
} productFlavors {
ol {
manifestPlaceholders = [DATA_NAME_VALUE: "http://www.mamami.com"] //线上服务地址
}
test {
manifestPlaceholders = [DATA_NAME_VALUE: "http://192.168.58.38"] //测试服务地址
}
}

(3) 在代码中获取服务地址的值

public static String getAppMetaData(Context context, String meta_name) {
try {
ApplicationInfo appInfo = context.getPackageManager()
.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString(meta_name);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
} public static String getHost(Context context) {
String hostURL = getAppMetaData(context, "DATA_NAME");
if (hostURL != null) {
return hostURL;
} return DEFUALT_HOST;
}

  这样在编译时通过选择不同的Flavor就可以动态改变服务地址。这里说一下,在我们平时开发debug开发编译获取到的地址并不是默认值,而是好像在按照Flavor中设置的name的字典顺序拿到的。

(4)可能遇到的问题:Error:(74, 13) Attribute meta-data#xxx@value at AndroidManifest.xml:74:13 requires a placeholder substitution but no value for <YOUMI_CHANNEL_VALUE> is provided

解决方案:(两处取证说明正确)——其实我遇到这个问题不是这个原因,这是意外收获。后续我会说明我的那种情况造成这个问题的原因

http://www.tuicool.com/articles/BRNfeiU

http://stackoverflow.com/questions/37368124/gradle-manifest-requires-a-placeholder-substitution-error-but-manifestplacehol

(5)拓展:

  使用manifestPlaceholders的这种配置,同样适用于manifest的其他配置。比如你需要在不同渠道发布的apk里面,指定不同的启动Activity。比如在豌豆荚里面发布的,启动的Activity显示的是豌豆荚首发的界面,应用宝里面启动的是应用宝首发的界面,你就可以对你的activity的值使用${activity_name}的方式,然后在productFlavors里面配置这个${activity_name}的值。

(6)参考:

http://blog.csdn.net/mynameishuangshuai/article/details/51783303

http://blog.csdn.net/maosidiaoxian/article/details/42000913

Gradle实现编译差异的更多相关文章

  1. 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中<meta-data>变量的值

    转载请说明来源: http://www.cnblogs.com/lizhilin2016/p/7390079.html 最近lz 在开始做一个新的Demo, 在项目中集成了bugly用于收集项目中的崩 ...

  2. 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中&lt;meta-data&gt;变量的值

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客 你也能够查看我的其它同类文章.也会让你有一定的 ...

  3. Android 提高 gradle 的编译速度

    随着项目在国内各个商店上线,开始介入了渠道的概念. 目前总共有 13 家商店,尝试使用 ./gradlew assembleRelease 命令打包,耗时将近 40 分钟. 因此搜索了一些可以提供编译 ...

  4. Spring5源码阅读环境搭建-gradle构建编译

      前沿:Spring系列生态十分丰富,涉及到各个方面.但是作为Spring生态的核心基础Spring,是最重要的环节,需要理解Spring的设计原理,我们需要解读源码.   在构建Spring源码阅 ...

  5. Android Studio (Gradle)编译错误

    Error:Execution failed for task ':app:processDebugResources' .com.android.ide.common.process.Process ...

  6. 利用cmdline和gradle快速编译出apk

    http://blog.csdn.net/qq_16628781/article/details/49365139 gradlew.bat clean build --info > bugtag ...

  7. Gradle Android最新自动化编译脚本教程

    转自:http://blog.csdn.net/changemyself/article/details/39927381 一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主 ...

  8. Gradle编译时下载依赖失败解决方法

    如果Gradle在编译的时候没有在本地仓库中发现依赖,就会从远程仓库中下载,默认的远程仓库为mavenCentral(),也就是http://repo1.maven.org/maven2/,但是往往访 ...

  9. 用gradle编译任意结构的Android项目

    ## 需求 * 继续用`Eclipse`项目的结构,但是使用`gradle`编译,或者说任意的项目结构进行编译. ## 解决方案 1. Android studio的项目结构 1. Android S ...

随机推荐

  1. 用WPE+CCproxy+自动代理截取安卓游戏封包

    wpe三件套:https://pan.baidu.com/s/19gI2GPZ0iuu4wpKljCOn4A 用WPE+CCproxy+自动代理截取安卓游戏封包>>

  2. kivy 小demo

    from kivy.lang.builder import Builder from kivy.uix.boxlayout import BoxLayout from kivy.app import ...

  3. redis 数据统计(用自增id防止同一秒并发过大没统计成功)

    Redis 缓存保存某段时间累加的数值,加入最大id防止同一秒并发过大,导致只统计了执行时同一秒的部分数据,而同一秒另一部分数据在下次累加时没有统计到缓存中 //coin总数 public funct ...

  4. go实例—函数或方法的可变长参数

    支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. 需要注意的是,可变长参数应该是函数定义的最右边的参数,即最后一个参数 package ...

  5. MacOS Docker 安装

    使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Home ...

  6. 接口自动化(unittest)

    一.用例 TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到TestSuite中的 TestRunn ...

  7. python简说(十六)第三方模块安装

    安装第三模块 1.pip install xxx pip问题 1.提示没有pip命令的, 把python的安装目录. 安装目录下面的scripts目录加入到环境变量里面 2.Unknown or un ...

  8. Eclipse中已安装的插件如何卸载

    最近在Eclipse中安装了一个插件,导致Eclipse使用的时候有些问题,就找了资料,原来Eclipse中的插件也是可以卸载的. 方法是点击菜单“Help”,“Install New Softwar ...

  9. 20165310 NstSec2019 Week1 Exp0 Kali安装

    20165310 NstSec2019 Week1 Exp0 Kali安装 Kali下载与安装 进入Kali官网 ,进入Download选项,选择Kali Linux 64 bit VMware VM ...

  10. ERROR! The server quit without updating PID file (/application/mysql-5.6.40/data/db01-51.pid).

    centos7.5 安装mysql数据库报错 问题: [root@db01-51 scripts]# /etc/init.d/mysqld start Starting MySQL.Logging t ...