场景:

项目中因为进度有要求,不能什么功能都自己写,很多时候都要用嫁衣神功拿别人造好的轮子实现自己的业务需求,这是常事,但是不同公司,不同产品提的需求都是不一样的,这样我们用的第三方库当然也就良莠不齐,这个时候就会可能出现一个问题,就是我们项目中不需要的一个权限,而且是动态获取的权限,在我们的manifest文件中并没有声明使用,这个时候就会很尴尬,人家测试或者产品问你,你这个权限是干什么用的?哪里用到了,这个很难解释的让别人满意,所以我们就要想办法找到我们APP中不需要的权限,看他到底是在哪里申请的,然后删除它,就可以了。

Step1,解压Apk包,打开manifest文件

把我们的apk安装包后缀改为.zip格式或者其它你能解压缩的格式,解压出来就可以看到一个manifest文件,这个文件并不仅仅是我们项目主module下的app中的manifest文件,而是整个项目包含所有的第三方库中的manifest合并之后的结果,当然,第三方库的权限优先级是小于我们APP中的权限优先级的,打开文件之后会是乱码,不过没事,我们只看重点,我们以定位权限示例,就是说我们项目中没有申请过和位置相关的权限,但是APP首次启动依然会动态申请定位权限的问题,
Android开发apk包删除不必要的权限申请_Android教程>这样我们已经确定了确实是项目中的某个地方申请了位置权限,只是不是我们自己写的而已。接下来就是想办法找到他,然后干掉他。这一步也可以省略用文章末尾的代码checkPermissionCustom()方法代替查看。

Step2删除不必要权限申请

打开我们的主module下的manifest文件,切换到MergedManifest视图,进行删除合并权限的操作
Android开发apk包删除不必要的权限申请_Android开发_02>上图红框区域就是我们依赖的第三方库或者jar包中对应的manifest文件,一个个的点进去排查权限,你就可以发现这里会有你想要删除的权限,然后直接删除那个权限就可以,弹出的Non-Project Files Protection警告默认选择第一项就可以了,
Android开发apk包删除不必要的权限申请_Android开发_03
这个时候再重新打包运行我们的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();
       }
    }