AndroidManifest.xml 是 Android 中最重要的配置文件之一。
AppX @ifeegoo https://www.ifeegoo.com/appx.html。
我们先不着急一个个的深入学习各种标签属性的意思,这样的学习,其实并没有很好的效果,实际中并没有用到,或者没有在某种场景下遇到“坑”,你很难深入理解这种标签属性的意思,接下来我们先以一些开发中实际场景来切入到对 AndroidManifest.xml 文件的理解。
我们的应用所有发布渠道共用一个版本,只是渠道号不一样。我们之所以使用了拨打电话的权限,是由于我们针对中文环境客户追加了可以语音控制拨打电话的功能。但是我们应用不支持英文环境下的语音控制,更没有语音拨打电话的功能,但是我们必须在清单文件中申请拨打电话权限,才能保证中文环境客户可以使用相关功能。而英文环境客户没有这种功能,也不理解为什么需要拨打电话权限,关键是系统还提醒拨打电话可能会导致一定的费用,国外的用户比较在乎这些,所以就遭到了投诉。
身为“老司机”的我们,直接在 AndroidManifest.xml 文件中移除这个权限不就行了吗?其实这个里面有一个“大坑”。
当时我们也是这样想的,但是导出来的包,通过安装或反编译,依然可以看到这个权限的存在!结果通过全局搜索,就傻眼了:
我们发现其他地方还有很多残留的 AndroidManifest.xml 文件,然后里面包含 “android.permission.CALL_PHONE” 权限。这些残留的 AndroidManifest.xml 文件都是这个项目之前的各种封装的 .aar 库里面包含的,那就逐一删除一下就好了,但是当你在 Andrioid Studio 中打开这个文件的时候,就会发现文件顶部有这样一段提示:
Files under “build” folder are generated and should not be edited.
Build 目录底下的文件是不能被编辑的。没关系,凭借着之前对 .aar 文件的肤浅理解,我们可以将 .aar 用解压缩文件打开,然后修改里面的 “android.permission.CALL_PHONE”,修改好了之后,压缩成 .zip 包,然后修改成 .aar 包,再次导入就可以了。如此机智的想法!但是最终没有选择这样做,也许这样做可以,但是如果项目中有 100 个 .aar 的包,还这样做的话,那就不符合有逼格程序员的气质了!
曾经在调试一个“没有详细错误提示信息”的 Bug 中,使用了 Gradle 命令获得了详细的编译过程,偶然的看到了有 Merge AndroidManifest 的字眼,后来去查官方文档发现了这个:Merge multiple manifest files。回头仔细阅读了官方文档,果然有重大收获!
其实 Android 工程中会允许多个 AndroidManifest.xml 文件存在,有一个主 AndroidManifest.xml 文件,就是主工程底下的,其他的你引入的模块或者 .aar 库也是可以携带 AndroidManifest.xml 文件的,在项目编译的过程中,会尝试将各种元素合并到一起(如果没有冲突的话)。这就解释了为什么在主 AndroidManifest.xml 文件中删除了权限,而没有删除其他地方的 AndroidManifest.xml 文件中这个权限,导致最终的安装包中还有这个权限,要想解决好合并的细节控制,我们可以通过“合并规则标记”来解决问题,针对于刚才我们的需求,我们可以在主 AndroidManifest.xml 文件中这样来声明:
<uses-permission android:name="android.permission.CALL_PHONE" tools:node="remove"/>
以上操作就可以解决“移除”掉所有其他 AndroidManifest.xml 文件中的拨打电话的权限,这一招直接解决!针对很多复杂细节的各种元素合并的规则,可以详细阅读官方文档:Merge multiple manifest files。
我又一次深刻体会到:
官方文档总是能够帮到你很多!
同时另外一个总结便是:
曾经遇到过一次是由于工程内部编译的时候合并多个 AndroidManifest.xml 文件冲突导致的。
这种问题,我们就需要使用“杀手锏”了,可以通过 Gradle 命令详细跟踪编译过程中出错的地方:
*clean project ./gradlew clean *build project ./gradlew build *build for debug package ./gradlew assembleDebug or ./gradlew aD *build for release package ./gradlew assembleRelease or ./gradlew aR *build for release package and install ./gradlew installRelease or ./gradlew iR Release *build for debug package and install ./gradlew installDebug or ./gradlew iD Debug *uninstall release package ./gradlew uninstallRelease or ./gradlew uR *uninstall debug package ./gradlew uninstallDebug or ./gradlew uD *all the above command + "--info" or "--debug" can get more detail information.
未完待续,不断更新!
上一篇: « 推荐给移动互联网从业者的学习资源清单 下一篇: 移动互联网从业者该如何选择及使用电脑? »