又来了,监管部门安全整改相关的内容。
这次整改的内容是 app 中 AndroidManifest.xml 中安卓权限的申请。
说说检测机构的判定标准吧,如果在 AndroidManifest.xml 中声明了某个权限,则需要有对应的功能场景,否则就算是过度声明。
检测方法呢,就是反编译 apk 包,直接从里面的 Androidmanifest.xml 文件中查看最终的权限申请。
之前其实也没有很认真了解过这一块的内容,都是需要用就声明一下。
这里整改的项目,由于之前的开发人员使用了很多第三方的SDK,同时整个项目架构也是基于 mPaaS 这个框架的,就又触碰了一些自己没了解过的知识点,趁着整改完成后的间隙,做一下记录。
1、首先聊聊 AndroidManifest.xml 这个文件的合并。
【1】gradle 在打包的时候,会主工程、子工程和第三方 SDK 的 AndroidManifest.xml 文件的内容进行合并,也就是如果是多 module 的工程,合并顺序大概是 第三方SDK-->moudle-->app。
合并记录可以通过 app-->build-->outputs-->logs 下的日志来看,如图:
这里详细记录了哪个权限是在哪个 AndroidManifest.xml 文件的哪一行合并进来的
【2】在主 module 下的 AndroidManifest.xml 文件的 Merged Manifest 视图可以看到第三方 SDK 的合并记录,也可以方便找到是哪些 SDK 声明了过度的权限。如图:
2、接下来就是如何删除这些权限了。
【1】如果是自己声明的权限,在确认没有用到的情况下,直接在 AndroidManifest.xml 中删除。
【2】第三方 SDK 中声明的权限,一些比较大型的应该不会去申请一些多余的危险权限,但是一些小众的第三方库,难保它会有多余的权限声明,这个时候,在确保删除某些权限不会影响当前功能的正常使用后,删除方法有两种。
第一种是在上面第二点提到的,在 merged manifest 视图中对应的 SDK 点进去,直接进行删除。
第二种是在 AndroidManifest.xml 中使用 remove 标签进行移除,如下:
【3】最后一种就是插件引入的权限了。这种比较麻烦一点,用第【2】点讲的方法是没有办法移除的。像我这边使用的 mPaaS 中的多媒体组件,只有把组件关掉,才能移除相关引入的权限,而且这种引入均没办法从上述的途径中看出来。
具体的就要去咨询相关插件的技术人员。我这边也是咨询了蚂蚁相关人员才清楚的。
这里粘贴一篇其他博主对此的解析文章,虽然我看不太懂,是关于如何移除第三方插件引用的权限及为什么普通的方式无法移除这类权限(与其并入 AndroidManifest.xml 的时机有关)
https://www.jianshu.com/p/64d205a159e6
3、关于如何处理两个蓝牙相关权限的 BLUETOOTH 和 BLUETOOTH_ADMIN。
从安卓系统的角度出发,这两个权限并不是危险权限,也就是说并不需要去动态申请,也就不会有系统授权的弹框出现。但是这又不符合监管部门的要求。
原因是蓝牙也是涉及用户隐私的权限,需要让用户明确知道项目使用了,并亲自决定是否授权。
解决方法:在项目中新增了打开手机蓝牙开关的代码。原本项目中蓝牙连接需要用户手动打开手机蓝牙,加入打开蓝牙的相关逻辑,就会提示用户是否打开蓝牙,此举也就向用户展示了我们需要用到这权限,也给了用户授权的空间。
代码如下:
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
act.startActivity(intent);
// mAdapter.enable();
firstRequestOpenBlueTooth = false;