目前来讲,安卓项目都会集成一些第三方的SDK,那么遇到清单文件合并出错的问题就很常见了。今天我们来讨论其中一个关于占位符(placeholder substitution)的问题。
问题描述
如果你遇到类似下图这样的错误提示:
AndroidManifest.xml:xx:x-xx:xx requires a placeholder substitution but no value for <xxx> is provided.
那么,请看看这篇文章,这会对你解决此问题有所帮助!!!
文章以集成小米或华为推送为例,其它的占位符问题都一样:
说说问题出现的原因
不想看分析的话可以直接下翻到 【到了解决问题的时间了】看如何快速解决问题!
SDK 提供方通常需要我们使用方提供一些参数,例如这里的【huawei_push_appid】和【mi_push_appid】,但是他们不知道我们应用的 appid 具体的值,所以只能用一个占位符来表示。
首先,找到问题详情:
我们打开出现错误的第三方框架的 AndroidManifest 文件:
选择你项目的 AndroidManifest 文件,然后点击选择 Merged Manifest 选项卡
你会看到错误详情
红色矩形区域就是出错的三方框架,比如这里是 【huawei】,那我们点击绿色矩形区域【PushHuaweiHMS-release:@aar】。
随便提一下,这里 Android Studio 有个不人性化的地方就是在你点击它提供的错误代码行的时候会把你引到我们自己的清单文件,所以你看不到这个占位符是什么!!!像上面那样找到出错的 aar 包的清单文件就好了。
看到了吧,红色矩形区域的文字【"${huawei_push_appid}"】,这个 ${huawei_push_appid} 就表示 app 推送 id (字符串格式)。
这就是错误的原因了!!!
SDK 需要我们提供我们在华为推送官网注册的 appid 字符串,但是我们没有为其提供具体的值,这就导致了 no value for <huawei_push_appid> is provided。
到了解决问题的时间了
我们已经知道了问题就是没有给占位符提供具体的值,那么我们就提供一个就 ok 啦!
知识点(敲黑板了哈):
安卓有一个清单文件占位符的属性:manifestPlaceholders
书写格式为:
manifestPlaceholders = [key:value]
key:占位符的名称,例如这里的 huawei_push_appid
value:占位符具体的值,这里就是你在华为推送官网申请的 appid
修复问题:
在你项目模块的 build.gradle 文件,有一个 android{} 代码块,在这个 android 代码块内加入一个标签 defaultConfig{},在这个defaultConfig 代码块内对占位符赋值,像下面这样:
-
/*
-
huawei_push_appid :占位符的名字
-
"aaa123456" :占位符具体的值
-
*/
-
-
android {
-
defaultConfig {
-
manifestPlaceholders = [huawei_push_appid:
"aaa123456"]
-
}
-
}
好了,现在重新编译工程就解决问题了。
总结一小下下
整篇文章的核心知识点就是这个 manifestPlaceholders 占位符属性。
掌握 定义占位符 和 为占位符赋值 就可以,so easy !
定义一个占位符:
${name}:name 就是你定义的占位符的名字
举个栗子: ${huawei_push_appid}
-
<meta-
data
-
android:name=
"com.huawei.hms.client.appid"
-
android:value=
"${huawei_push_appid}" >
-
</meta-
data>
为占位符赋值:
-
android {
-
defaultConfig {
-
manifestPlaceholders = [huawei_push_appid:
"aaa123456"]
-
}
-
}
文章到此为止了,从来没写过这么详细的博客,如有错误,欢迎各位大佬评论指出哦!