Manifest配置动态替换

文章首发于我的个人博客-Manifest配置动态替换
该方案是根据极光推送的官方配置方案而来,后续将推出gradle自定义插件的方式完成配置替换

目的

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

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

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

注意:

  1. 当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
  1. 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"
        }
    }

猜你喜欢

转载自blog.csdn.net/tianbo_zhang/article/details/80322584