文章首发于我的个人博客-Manifest配置动态替换
该方案是根据极光推送的官方配置方案而来,后续将推出gradle自定义插件的方式完成配置替换
目的
减少配置侵入、关键信息暴露
便于可变配置信息引入及替换
封装动态配置定义在Library内,由app
完成替换
注意:
当Library 的清单文件定义了替换key,
gradle
没有填写,在编译期会出现如下日志,只要app
内 填写正确,运行不受影响日志详细信息:
Error:
Attribute meta-data#QQ_APPID@value at manifestMerger8142313556881373986.xml requires a placeholder substitution but no value for <QQ_APPID> is provided
- Library 如果与
app
同时配置,将会冲突导致都无效,及时Llbrary配置值为空,app已配置的也会被替换掉
Manifest 定义
- 常规定义:”${定义的内容}”
- 会出现数字的,读取时不会被读取为String类型,需要通过反斜杠转义 :”\ ${定义的内容}”
- 想动态替换的内容都可定义,并由gradle 完成替换
如:
<!--动态配置meta-data的可变内容-->
<meta-data
android:name="QQ_APPKEY"
android:value="\ ${QQ_APPID}"/>//转义数字为String
<meta-data
android:name="QQ_SECRET"
android:value="${QQ_SECRET}"/>
<!--动态配置Activity的过滤器可变内容-->
<activity>
<intent-filter>
<data android:scheme="tencent${QQ_APPID}"/>
</intent-filter>
</activity>
<!--动态配置Receiver的过滤器可变内容-->
<receiver>
<intent-filter>
<category android:name="${JPUSH_PKGNAME}"/>
</intent-filter>
</receiver>
Gradle 配置替换
使用manifestPlaceholders=[]
各属性间使用英文逗号分隔,注意空格
如:
manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
当release 版本与debug需要区分时,可在buildTypes
内配置
如:
buildTypes {
release {
manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
}
debug {
manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
}
}
当不需要区分时,可在defaultConfig
内配置
如:
defaultConfig {
manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
}
代码读取
读取Manifest定义好的key
val appInfo = mContext?.packageManager?.getApplicationInfo(mContext?.packageName,
PackageManager.GET_META_DATA)
val sinaKey = appInfo?.metaData?.get("QQ_APPKEY")
val sinaSecret = appInfo?.metaData?.get("QQ_SECRET")
debug 包指定签名信息
目的
不打签名包直接运行也可实现签名包的效果,可有效减少耗时
如微信分享时,需要签名信息,每次验证都打包相对耗时较长,使用该方法,不打签名包也可实现
签名文件
需在module同级目录下
gradle
配置
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
指定签名信息:
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}