android动态项目文件,Android-使用productFlavors配置项目移植-程序员宅基地

技术标签: android动态项目文件  

原创-转载请注明出处

概述

有时候需要做两个或多个项目,但都用的同一套代码.只有稍微的一些布局或者代码的改动.

我们常规的做法是再切一个分支,再在这个分支上做相应的改动.但比如发现了某一处bug,或者需要统一改个需求.那我们就需要在每一个分支上都进行这种变动.

如果项目多的话会很不好维护.下面就介绍怎样通过productFlavors的方式配置项目移植.

Flavor

在主项目build.gradle中配置productFlavorsandroid{

...

defaultConfig{

...

}

productFlavors{

jkxt {

applicationId "com.****.****"

buildConfigField "String", "PROJECT_SIGN", "\"jkxt\""

manifestPlaceholders = [BAIDU_CHANNEL_VALUE       : "*****",

PACKAGE_NAME              : "*****"]

}

jkhd {

applicationId "com.****.****"

buildConfigField "String", "PROJECT_SIGN", "\"jkhd\""

manifestPlaceholders = [BAIDU_CHANNEL_VALUE       : "*****",

PACKAGE_NAME              : "*****"]

}

}

}

上面定义了一个productFlavors,gradle会为这个flavor关联对应的sourceSet,默认位置为src/目录,对应到本例就是src/jkhd,如果没有建文件夹,则默认为src/main.看如下解释The product flavors support the same properties as defaultConfig—this is because defaultConfig actually belongs to the ProductFlavor class. This means you can provide the base configuration for all flavors in the defaultConfig {} block, and each flavor can override any of these default values, such as the applicationId.

也就是说,defaultConfig中可以配置的属性,比如applicationId,minSdkVersion等,都可以在productFlavors中配置,因为defaultConfig就是一个productFlavor实例.

在本例中,解释上面两个属性,buildConfigField可以理解为定义一个常量,传入的值分别代表type,name,value;

通过BuildConfig.PROJECT_SIGN  可以拿到相应的值,比如我们熟悉的BuildConfig.DEBUG,就是系统定义的一个常量.

manifestPlaceholders作用是动态替换manifest文件,传入的是一个map对象,写法如上所示.在配置多个项目时,一些第三方的key比如友盟,极光等需要进行动态配置,就需要用到这个属性,在manifest文件中把需要动态配置的属性按如下写法,android:name="${PACKAGE_NAME}"

替换资源文件

上面讲到productFlavors已经为我们关联了对应的sourceSet,所以我们只需要把不同的资源文件放入相应目录下

以jkhd为例,在src/jkhd目录下新建res文件,新建需要替换的资源文件夹,比如需要替换app_name

只需要在src/jkhd/res/values/string.xml,新建app_name标签即可.其他公用的资源不需要添加,找不到的话会默认从主项目下面找.

使用第三方sdk

做某些项目可能用用到不用的第三方sdk,但其他项目并不需要这个sdk,那么怎么为特定的项目添加sdk呢?android {

productFlavors {

jkhd {

}

}

}

...

dependencies {

jkhdCompile 'com.nineoldandroids:library:2.4.0'}

然后通过反射的方法,进行具体判断class MyActivity extends Activity {private boolean useSdk;@overridepublic void onCreate(Bundle savedInstanceState) {    try {

Class.forName("com.nineoldandroids.......");

useSdk = true;

} catch (ClassNotFoundException ignored) {

}

}

}

动态替换代码如果在src/jkhd目录下新建同名类的话会报类重复的问题.但我们可以新建src/jkhd,和src/jkxt两个文件夹,在这两个文件夹中同时写入一个与主目录不同的类,在主目录中进行调用,这样是没有问题的

直接在主目录中以判断标记位的方法来达到动态替换的效果.

总结

productFlavors对于配置项目移植,和多渠道打包都非常方便,节省了我们大量的工作.目前所介绍的配置基本上可以满足我们的需求.以后再也不用担心多渠道打包和项目移植啦~

作者:程序猿Jeffrey

链接:https://www.jianshu.com/p/5cae61481509

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30260057/article/details/117312180

智能推荐

python模块下载地址_常用的python模块功能和下载地址-程序员宅基地

文章浏览阅读265次。adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:连接MySQL数据库的py2ex..._ctypes模块下载地址

(python)7-4 sdut-oop-1 简单的复数运算 (10 分)_sdut-oop-1-测试对象初始化(构造方法) 分数 4 作者 周雪芹 单位 山东理工大学 阅-程序员宅基地

文章浏览阅读1.7k次。设计一个类Complex,用于封装对复数的下列操作:成员变量:实部real,虚部image,均为整数变量;构造方法:无参构造方法、有参构造方法(参数2个)成员方法:含两个复数的加、减、乘操作。 复数相加举例: (1+2i)+(3+4i)= 4 + 6i 复数相减举例: (1+2i)-(3+4i)= -2 - 2i 复数相乘举例: (1+2i)*(3+4i)= -5 + 10i要求:对复数进行连环算术运算。提示:如果用PYTHON语言实现,不必设计Complex类,可以._sdut-oop-1-测试对象初始化(构造方法) 分数 4 作者 周雪芹 单位 山东理工大学 阅

编译OSG源码并且配置使用_osg3.0.1 下载-程序员宅基地

文章浏览阅读952次。前言  关于OSG主要是用于3D模型的处理,使用C++语言编辑而成的。这是我第一次使用OSG也是独立编译使用(参考网上的编译教程),并且根据本机的实际环境加以修改。先说下我的编译环境:win7 64bit + Visual Stdio 2010资源准备参考网址:http://trac.openscenegraph.org/projects/osg//wiki/Downloads 1.OSG源码:_osg3.0.1 下载

java 字符串包含_java判断字符串包含某个字符的实例方法-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏5次。java判断字符串是否包含某个字符的方法:一、contains方法1:描述java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列2:声明public boolean contains(CharSequence s)3:返回值如果此字符串包含返回true,否则返回false。4:实例public static void main(Strin..._java 字符串包含

jquery学习记录_"使用$(\"p\").addclass(\"p1,p2\")可以为所有段落元素同时添加p1和p2两-程序员宅基地

文章浏览阅读410次,点赞2次,收藏6次。什么是jQuery? jQuery是一个快速,小巧,功能丰富的JavaScript库。它通过易于使用的API在大量浏览器中运行,使得HTML文档遍历和操作,事件处理,动画和Ajax变得更加简单。通过多功能性和可扩展性的结合,jQuery改变了数百万人编写JavaScript的方式。..._"使用$(\"p\").addclass(\"p1,p2\")可以为所有段落元素同时添加p1和p2两个类"

hibernate连接多个数据库_winform hibernate-configuration 项目加载多个数据库-程序员宅基地

文章浏览阅读5.2k次。本文转自自http://blog.sina.com.cn/s/blog_49bf8585010004m6.html一、 Hibernate访问数据库时加载的过程对于大多数使用Hibernate的朋友来说,通常使用一下方式来获得Configuration实例: Configuration configure = new Configuration()._winform hibernate-configuration 项目加载多个数据库

随便推点

深度人工神经网络模拟单个皮层神经元1_神经网络模仿神经元-程序员宅基地

文章浏览阅读267次。利用机器学习的最新进展,我们引入了一种系统方法来表征神经元的输入/输出 (I/O) 映射复杂性。训练深度神经网络 (DNN) 以在毫秒(尖峰)分辨率下忠实地复制皮层神经元的各种生物物理模型的 I/O 功能。需要一个具有五到八层的时间卷积 DNN 来捕获第 5 层皮质锥体细胞 (L5PC) 的真实模型的 I/O 映射。当在训练分布范围之外广泛呈现输入时,该 DNN 可以很好地泛化。当 NMDA 受体被移除时,一个更简单的网络(具有一个隐藏层的完全连接的神经网络)足以拟合模型。对 DNN 的权重矩阵的分析表明,_神经网络模仿神经元

CMake查找第三方或者自己的库文件_windows第三方库cmake后-程序员宅基地

文章浏览阅读6.2k次。CMake查找库文件使用cmake指定第三方库或者自己的工具库的相关目录使用CMake可以方便的进行项目管理。作为初学者在使用过程中遇到了一些问题,做一些纪录。问题描述在windows下面做C++开发时,如果需要使用第三方库或者自己编译的工具库的时候,一般都是通过三步进行配置,这种方式在库文件比较少的时候可以通过手动完成配置(当然也可以通过bat脚本枚举库目录下面的文件,一起添加),然后导..._windows第三方库cmake后

XSS笔记_<img src=x 慰nerr慰r=alert(1)>-程序员宅基地

文章浏览阅读230次。XSS的原理用户提交的数据没有过滤,或者过滤不严格,输出到网页中,导致可以构造执行JS代码,或者修改网页内容。XSS的危害盗取用户或管理员的CookieXSS Worm挂马(水坑攻击)有局限性的键盘记录 等等XSS的分类反射型XSS存储型XSSDOM XSSFlash XSS存储型XSS又称为持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久的存放在目标服务器的数据库或文件中。DOM XSSDOM XSS与反射型XSS和存储型XSS的差别是在于DOM XSS的代码不_

X3 PI双风扇散热外壳开源(可自行下载3D打印)_哪里有开源外壳-程序员宅基地

文章浏览阅读224次。地平线旭日X3派外壳CNC工艺设计_哪里有开源外壳

固定docker容器IP方法_docker 容器固定ip-程序员宅基地

文章浏览阅读6.6k次,点赞2次,收藏14次。docker默认有4种网络模式,详细查曾经写的 "docker几种网络模式"docker run 新建并启动容器时,不指定网络默认,默认是使用桥接模式,容器内部IP是通过DHCP获取,docker容器重启后,其容器IP会变化。有没有办法来固定容器内的IP呢?答案是肯定的。可以使用脚本或工具来固定容器内部IP。一、如何查看容器内部IP?:方法一:通过docker inspect查看容器的详细信息来查看,可以使用grep来匹配查询[root@localhost ~]# docker in._docker 容器固定ip

XPC调试记录 :TwinCAT生成XML配置文件_twincat xae new device type found.-程序员宅基地

文章浏览阅读3.8k次。XPC调试记录:生成XML配置文件202103161.连接目标控制器硬件准备:用一根网线将配置有EtherCAT的电脑和EK1100(BECOHOFF总线模块)网线插槽X2(OUT)相连。(正常初始化配置时对应指示灯闪烁)(1)打开 TwinCAT3,点击 New TwinCAT Project 或 FILE 中的新建(2)选择 TwinCAT Project 中的 TwinCAT XAE Project(XML format),并把名字改成英文,例如下图中 TwinCAT Project1,还有别_twincat xae new device type found.

推荐文章

热门文章

相关标签