场景:
项目中因为进度有要求,不能什么功能都自己写,很多时候都要用嫁衣神功拿别人造好的轮子实现自己的业务需求,这是常事,但是不同公司,不同产品提的需求都是不一样的,这样我们用的第三方库当然也就良莠不齐,这个时候就会可能出现一个问题,就是我们项目中不需要的一个权限,而且是动态获取的权限,在我们的manifest文件中并没有声明使用,这个时候就会很尴尬,人家测试或者产品问你,你这个权限是干什么用的?哪里用到了,这个很难解释的让别人满意,所以我们就要想办法找到我们APP中不需要的权限,看他到底是在哪里申请的,然后删除它,就可以了。
Step1,解压Apk包,打开manifest文件
把我们的apk安装包后缀改为.zip格式或者其它你能解压缩的格式,解压出来就可以看到一个manifest文件,这个文件并不仅仅是我们项目主module下的app中的manifest文件,而是整个项目包含所有的第三方库中的manifest合并之后的结果,当然,第三方库的权限优先级是小于我们APP中的权限优先级的,打开文件之后会是乱码,不过没事,我们只看重点,我们以定位权限示例,就是说我们项目中没有申请过和位置相关的权限,但是APP首次启动依然会动态申请定位权限的问题,
>这样我们已经确定了确实是项目中的某个地方申请了位置权限,只是不是我们自己写的而已。接下来就是想办法找到他,然后干掉他。这一步也可以省略用文章末尾的代码checkPermissionCustom()方法代替查看。
Step2删除不必要权限申请
打开我们的主module下的manifest文件,切换到MergedManifest视图,进行删除合并权限的操作
>上图红框区域就是我们依赖的第三方库或者jar包中对应的manifest文件,一个个的点进去排查权限,你就可以发现这里会有你想要删除的权限,然后直接删除那个权限就可以,弹出的Non-Project Files Protection警告默认选择第一项就可以了,
这个时候再重新打包运行我们的APP就不会有那个我们不需要的权限弹出来了。瞬间觉得首次启动APP清爽了一些。
检测应用所需所有权限是否开启
private void checkPermissionCustom() {
PackageManager pm = context.getPackageManager();
PackageInfo pi;
try {
pi = pm.getPackageInfo(getPackageName(),PackageManager.GET_PERMISSIONS);
String[] permissions= pi.requestedPermissions;
if (permissions != null){
for (String str:
permissions ) {
boolean permission =(PackageManager.PERMISSION_GRANTED ==
pm.checkPermission(str,getPackageName()));
LogUtils.e("permisson",str+permission);
}
}
}catch (Exception e){
e.printStackTrace();
}
}