今天开发组长问了这么一个问题,如何实现通过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. 对gulp的理解和使用(一)

    说的gulp,到底是什么?用来做什么的? 以前并没有想过这个问题,拿到公司的项目脚手架就开始做事情了.现在专门来总结一下. gulp干什么的呢? gulp是node中的一种代码构建工具,还有就是项目自 ...

  2. Spring MVC数据绑定

    1.绑定默认数据类型 当前端请求参数较为简单的时候,后台形参可以直接使用SpringMVC提供的参数类型来绑定数据. HttpServletRequest:通过request对象获取请求信息: Htt ...

  3. mycat水平分表

    和垂直分库不同,水平分表,是将那些io频繁,且数据量大的表进行水平切分. 基本的配置和垂直分库一样,我们需要改的就是我们的 schema.xml和rule.xml文件配置(server.xml不用做任 ...

  4. Oracle 手动建库

    Oracle在创建实例的时候,多数采用的是dbca的形式..其实手动建库可以提供更大的自由发挥的空间,根据情况进行定制 登录Oracle用户 指定SID(Instance Identifier) ex ...

  5. 小程序 canvas实现图片预览,图片保存

    wxml 代码: <view class="result-page"> <canvas bindtap="previewImage" canv ...

  6. pagehelper调用mybatis报错java.lang.NoSuchMethodError:org.apache.ibatis.reflection.MetaObject.forObject

    最近在升新的基础框架到spring cloud,启动时pagehelper报错,如下: java.lang.NoSuchMethodError:org.apache.ibatis.reflection ...

  7. Docker 微服务教程(搭建真正的网站)

    Docker 是一个容器工具,提供虚拟环境.很多人认为,它改变了我们对软件的认识. 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器.数据库容器.储存容器.队列容器......Docker ...

  8. openstack cloud init set password

    设置代理和password #!/bin/bash cd /home/ubuntu wget otcloud-gateway.bj.intel.com/script.tar.gz ]; then cu ...

  9. jQuery中清空元素.empty()和.html(''),两种方法的对比

    jQuery 中有 .empty() 和 .html() 两种方式,都能够清空所选父元素中的所有子元素.但是这两者清空元素的方式上,有着很大的区别: 1.empty() jQuery对象.empty( ...

  10. NOIP 2016 蚯蚓 (luogu 2827 & uoj 264) - 鬼畜的优化

    题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...