Manifest配置动态替换

该方案是根据极光推送的官方配置方案而来,后续将推出gradle自定义插件的方式完成配置替换

目的

减少配置侵入、关键信息暴露

便于可变配置信息引入及替换

封装动态配置定义在Library内,由app完成替换

注意:

  1. 当Library 的清单文件定义了替换key,gradle没有填写,在编译期会出现如下日志,只要app内 填写正确,运行不受影响

日志详细信息:

1
2
Error:
Attribute meta-data#QQ_APPID@value at manifestMerger8142313556881373986.xml requires a placeholder substitution but no value for <QQ_APPID> is provided
  1. Library 如果与app同时配置,将会冲突导致都无效,及时Llbrary配置值为空,app已配置的也会被替换掉

Manifest 定义

  • 常规定义:”${定义的内容}”
  • 会出现数字的,读取时不会被读取为String类型,需要通过反斜杠转义 :”\ ${定义的内容}”
  • 想动态替换的内容都可定义,并由gradle 完成替换

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--动态配置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=[]各属性间使用英文逗号分隔,注意空格

如:

1
2
3
4
5
manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""

]

当release 版本与debug需要区分时,可在buildTypes内配置

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
buildTypes {
release {

manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
}
debug {

manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
}
}

当不需要区分时,可在defaultConfig内配置

如:

1
2
3
4
5
6
7
 defaultConfig {

manifestPlaceholders = [
QQ_SECRET : "",
QQ_APPID : ""
]
}

代码读取

读取Manifest定义好的key

1
2
3
4
5
 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配置

1
2
3
4
5
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}

指定签名信息:

1
2
3
4
5
6
7
8
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
完结撒花