配置gradle :将properties文件转换为扩展属性
Posted -SOLO-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置gradle :将properties文件转换为扩展属性相关的知识,希望对你有一定的参考价值。
配置gradle
为了便于管理项目配置信息,和自动复制应用图标到资源文件夹,为后面的一键生成app做准备。我写了一个gradle文件。
作用
项目启动的时候自动执行以下操作
-
在setting.gradle中引入一次后,全局可用。根目录的build.gradle和各个module的build.gradle都可以使用
-
可以将config目录下的所有propteries文件转化为gradle的扩展属性
-
访问方式统一,只需要通过gradle.aaa.xxx 既可以访问config目录下的aaa.properties中的xxx 属性。不需要区分在那个文件。无论是setting.gradle还是各种build.gradle
-
可以将config目录下img文件夹中的jpg和png文件复制到app/src/main/res/drawable-xxxhdpi/ 文件中
-
.根据app名称修改项目名称。
-
使用简单,所有文件都在一个文件夹中,集中管理
文件结构
文件名 | 作用 | 备注 |
---|---|---|
img | 用于保存不同项目差异的图片,在脚本运行的时候会自动复制到 app/src/main/res/drawable-xxxhdpi/ 中供项目使用 | 目前只支持jpg和png。可以修改脚本自行扩展功能 |
app.properties | 保存了不同项目中差异的属性,比如项目名称,版本号等 | 默认properties文件不支持中文,需要设置,文章后面有设置方法 |
shareSdk.properties | 存放了shareSdk相关的配置信息 | 可以通过gradle.shareSdk来获取其中的配置,但是shareSdk配置有问题,需要特殊处理。后面有解决方法 |
config.gradle | 完成所有功能的脚本 | 需要在setting.gradle中引入 |
相关文件
config.gradle 文件(核心)
//使用该文件
//在setting.gradle中引入
//通过 apply from:"config/config.gradle" 引入
//该脚本会自动讲config目录下所有的properties文件转换为gradle的扩展属性
//比如文件为aaa.properties转化以后
//可以通过 gradle.aaa.xxx 来访问定义在aaa.properties中的xxx属性
//,properties转化的value都会转化为string类型
//在使用过程中要转化为对应的类型
//boolean 类型:gradle.aaa.xxx.toBoolean()
//int 类型:gradle.aaa.xxx.toInteger()
//注意:乱码问题,android Studio默认创建properties文件使用的ISO-8859-1
//不支持中文,需要在设置中修改.
//创建一个扩展
//参考文档 https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtensionAware.html
class MyEx
//注意必须使用rootDir.path 这是项目根目录
//不能使用./等相对路径,因为在setting.gradle引入,和在根目录的build.gradle引入
//路径是不一样的,为了保证脚本的稳定性。推荐使用rootDir.path
//参考文档:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html
File file = file("$rootDir.path/config")
File[] fileList= file.listFiles()
for(int i=0;i<fileList.length;i++)
propertiesFile2Extension(fileList[i].path)
def propertiesFile2Extension(String path)
if (!path.endsWith("properties"))
return
File file = file(path)
String name= file.getName()
String extName=name.substring(0,name.indexOf("."))
if (file.exists())
//加载资源
BufferedReader reader = file.newReader("UTF-8");
Properties properties = new Properties()
properties.load(reader)
gradle.extensions.create(extName, MyEx)
for (String key : properties.keySet())
gradle.extensions[extName].ext.setProperty(key, properties.get(key))
//复制 config/img 下的jpg文件和png文件 到drawable-xxxhdpi下
//目前配置了项目的图标和默认的占位图
//注意图片的命名中不能包含空格
copy
from("$rootDir.path/config/img")
into("$rootDir.path/app/src/main/res/drawable-xxxhdpi/")
include("*.jpg", "*.png")
参考的 app_config.properties文件
#appId
appId=com.xxx.yyy
#app的名称,会影响setting.gradle的rootProject.name 也就是会影响Android Studio中的窗口显示的名称
#修改app名称以后,如果想修改Android Studio的显示名称。那么需要同步gradle。其他情况都不需要同步gradle。
appName=非洲新闻
#app的版本号
appVersionName=5.1.6
#app的code 必须是int类型
appVersionCode=516
#最低sdk版本
minSdkVersion=20
#目标sdk版本
targetSdkVersion=31
解决properties文件中文乱码
解决shareSdk中无法获取到gradle的问题
解决办法用本地变量来保存gradle中的扩展属性
参考代码
apply plugin: 'com.mob.sdk'
//因为在MobSdk->ShareSDK->WeChat中无法访问到gradle
//返回的gradle 是null。所有使用本地变量保存shareSdk的配置项。
//感觉这是个bug。目前没有解决办法
def shareSdk=gradle.shareSdk
MobSDK
appKey shareSdk.sdkAppKey
appSecret shareSdk.sdkAppSecret
ShareSDK
//平台配置信息
devInfo
SinaWeibo
appId shareSdk.wbAppId
appKey shareSdk.wbAppKey
callbackUri shareSdk.wbCallbackUri
shareByAppClient true
enable true
Wechat
appId shareSdk.wxAppId
appSecret shareSdk.wxAppSecret
bypassApproval false
enable true
WechatMoments
appId shareSdk.wxAppId
appSecret shareSdk.wxAppSecret
bypassApproval false
enable true
QQ
appId shareSdk.qqAppId
appKey shareSdk.qqAppKey
shareByAppClient true
enable true
QZone
appId shareSdk.qzAppId
appKey shareSdk.qzAppKey
enable false
Dingding
appId shareSdk.ddAppId
appSecret shareSdk.ddAppSecret
bypassApproval false
enable true
参考配置文件
shareSdk.properties
#sdk相关
sdkAppKey=xxx
sdkAppSecret=xxx
#微信相关配置
wxAppId=xxx
wxAppSecret=xxx
#QQ相关配置
qqAppId=xxx
qqAppKey=xxx
#QQ空间配置
qzAppId=xxx
qzAppKey=xxx
#钉钉配置
ddAppId=xxx
ddAppSecret=xxx
#微博相关配置
wbAppId=xxx
wbAppKey=xxx
wbCallbackUri=xxx
引入和使用
1、创建相关文件
按照上面的文件结构创建相关文件。
2.改造Setting.gradle
setting.gradle
apply from:'config/config.gradle'
//项目名称和应用名称一直便于区分
rootProject.name=gradle.app.appName
达到的效果
3、在其他gradle文件中使用
使用变量app来装载config目录下的app.properties文件中的配置
主要是为了少写点代码
//使用变量app来装载config目录下的app.properties文件中的配置
//主要是为了少写点代码
def app = gradle.app
defaultConfig
applicationId app.appId
minSdkVersion app.minSdkVersion.toInteger()
//noinspection ExpiredTargetSdkVersion
targetSdkVersion app.targetSdkVersion.toInteger()
versionCode app.appVersionCode.toInteger()
versionName app.appVersionName
//应用名称
manifestPlaceholders = [
app_name: app.appName
]
//定义res->strings中的app_name
resValue("string", "app_name", app.appName)
关于类型问题
默认情况下,properties的value都会转化为string类型
在使用过程中要转化为对应的类型
类型 | 转化方式 |
---|---|
boolean | gradle.aaa.xxx.toBoolean() |
int | gradle.aaa.xxx.toInteger() |
关于android studio的显示名称
修改了app_config.properties文件后,不会提示同步gradle,也不需要同步
但是如果修改了app名称,需要让android studio显示的项目名称立刻改变可以手动触发同步,其他情况都不需要触发gralde同步。
参考文档
参考的都是gradle的官方文档,有兴趣的可以看看
ExtraPropertiesExtension
ExtensionAware
以上是关于配置gradle :将properties文件转换为扩展属性的主要内容,如果未能解决你的问题,请参考以下文章
错误记录Android Gradle 配置报错 ( gradle.properties 配置到 BuildConfig 中需要注意类型转换 | 位置: 类 BuildConfig )
Gradle 签名的配置文件 gradle.properties
Android Gradle 插件Gradle 基础配置 ③ ( 生成 Gradle Wrapper 配置 | 分析生成的 gradle-wrapper.properties 配置文件 )