深入思考 Android 的 AndroidManifest.xml 文件 2018-09-12 / 3,008 次 / 沙发被抢 /

AndroidManifest.xml 是 Android 中最重要的配置文件之一。

本文是 AppX 系列中的一篇。AppX 系列是 @ifeegoo 个人移动互联网学习、工作和生活的提炼与总结的文章系列。更多内容请关注:
AppX @ifeegoo https://www.ifeegoo.com/appx.html
AndroidManifest.xml 文件是 Android 中最重要的配置文件之一,主管 Android App 的各种重要的参数。我们只有深入理解了这个配置文件,才能对 Android 开发有重要提升。

我们先不着急一个个的深入学习各种标签属性的意思,这样的学习,其实并没有很好的效果,实际中并没有用到,或者没有在某种场景下遇到“坑”,你很难深入理解这种标签属性的意思,接下来我们先以一些开发中实际场景来切入到对 AndroidManifest.xml 文件的理解。

1.要求移除 “android.permission.CALL_PHONE”。
我们的应用所有发布渠道共用一个版本,只是渠道号不一样。我们之所以使用了拨打电话的权限,是由于我们针对中文环境客户追加了可以语音控制拨打电话的功能。但是我们应用不支持英文环境下的语音控制,更没有语音拨打电话的功能,但是我们必须在清单文件中申请拨打电话权限,才能保证中文环境客户可以使用相关功能。而英文环境客户没有这种功能,也不理解为什么需要拨打电话权限,关键是系统还提醒拨打电话可能会导致一定的费用,国外的用户比较在乎这些,所以就遭到了投诉。

身为“老司机”的我们,直接在 AndroidManifest.xml 文件中移除这个权限不就行了吗?其实这个里面有一个“大坑”。

当时我们也是这样想的,但是导出来的包,通过安装或反编译,依然可以看到这个权限的存在!结果通过全局搜索,就傻眼了:

android-permission-call-phone-in-global-search

我们发现其他地方还有很多残留的 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

我又一次深刻体会到:

The Android official documentation will give you better basic understanding of the Android,not sometimes,but ALMOST everytime.
官方文档总是能够帮到你很多!

同时另外一个总结便是:

我们在提供给别人库工程尤其是 .aar 的库,最好不好携带 AndroidManifest.xml,我们可以用文档描述的形式对外说明,让项目统一在主 AndroidManifest.xml 来配置管理,我认为这样更好一些!
2.编译出错,最终结果和 AndroidManifest.xml 文件有关,却没有提示更加详细的信息。
曾经遇到过一次是由于工程内部编译的时候合并多个 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.

未完待续,不断更新!

打赏
本博客所有文章如无特别注明均为原创。复制或转载请以超链接形式注明转自ifeegoo,原文地址《深入思考 Android 的 AndroidManifest.xml 文件
上一篇: « 下一篇: »
Copyright © ifeegoo Time is limited, less is more! / 粤ICP备15109713号 / Theme by Hang & Ben / WordPress / 知识共享许可协议