更多问答 >>
-
每日一问 Parcelable 为什么效率高于 Serializable ?
2019-08-26 00:02 -
2019-09-01 23:16
-
2019-09-04 23:33
-
2019-09-09 00:19
-
2019-09-11 00:24
-
2019-08-18 21:42
-
每日一问 Android 有哪些 位运算 的例子很值得借鉴?
2019-08-13 21:56 -
2019-08-12 09:58
-
每日一问 事件分发机制大家应该都熟记于心,默认事件分发是逆序的,有哪些方法可以修改分发顺序?
2019-08-11 21:18 -
每日一问 匿名内部类访问的外部类局部变量为什么要用final 修饰,jdk8为啥不需要了? 2/3
2019-08-08 23:51
BuildConfig的用处:
@陈熔 同学已经讲的很详细了。
BuildConfig是怎样生成的?
为了能看到Gradle的源码,首先要添加下依赖(版本可以跟当前项目中的gradle版本):
想一下,既然它是自动生成的,按常理,在刚刚引用的gradle库里面,肯定有BuildConfig之类的字眼吧?全局搜一下:
会发现在一个叫BuildConfigGenerator的类里面有这么一句:哈哈哈,CTRL点开这个常量,可以看到一个叫
generate
的方法用到了它(看名字就知道是生成的意思了),看下精简后的代码:emmm,没错了,BuildConfig这个类以及它里面的内容,就是在这个方法中利用square的开源项目 javapoet - JavaWriter 来生成的。
BuildConfig是在哪个环节中生成的?
我们可以用顺瓜模藤来找到调用generate的源头:
可以看到调用链的源头就是BasePlugin的
apply
方法,但要搞清楚生成BuildConfig的任务执行时机,还是要看回ApplicationTaskManager或LibraryTaskManager的createTasksForVariantScope
方法(任务太多了,精简掉了一些不太熟悉的任务):可以看到是在MergeResources和MergeAssets之后才生成的,完成之后,就开始生成Aidl文件的java代码了。
参考文章:https://www.jianshu.com/p/238b78368ba6
1、BuildConfig的用处
程序编译成功后,会在每一个Module下的build\generated\source\buildConfig\debug(release)\包名下生成一个BuildConfig文件。BuildConfig内容如下:
从内容中可以看出,BuildConfig是根据Module下的build.gradle生成的。
其中最常用的是BuildConfig.DEBUG,判断当前是否处于debug模式,来控制日志的输出。这个值会根据开发者的Build类型自动设定,不需要手动设置。除此之外,还可以自定义添加BuildConfig里的常量,比如设置开发环境和正式环境下的网络请求地址和其他常量。在Module下的build.gradle文件中的defaultConfig和buildTypes中添加 buildConfigField "String", "BASE_STRING", "\"string content\"" 即可区别在于buildTypes会根据Build类型引用不同的值,defaultConfig是通用的值。
buildConfigField "String", "BASE_STRING", "\"string content\"" 这句代码中三个参数分别是数据类型,常量名,常量值。
这里要注意的是BuildConfig是通过String读取数据的,所以当常量值数据类型为String时,需要在双引号里面在添加一个双引号。常量值的可以直接写在build.gradle中,不过更推荐定义在gradle.properties中,然后在build.gradle中引用即可。在gradle.properties中定义然后在build.gradle中引用时
因为gradle.properties里定义的value默认都是String,所以在定义build.gradle中可以直接使用
2、BuildConfig的生成
至于BuildConfig在项目的编译期间,那个环节、如何生成的,暂时没有找到好的答案。
感谢分享~
1.用处:可以用来获取APP的编译模式,包名,编译类型,版本号,版本名
2.是在项目的编译期间AS自动生成的...