问题现象:开机向导到联网状态,一直失败,查看log输出,如下信息:
image2-31 20:35:15.312 3722 3722 E AndroidRuntime: Caused by: java.lang.SecurityException: NetworkScoreService: Neither user 10044 nor current process has android.permission.REQUEST_NETWORK_SCORES.
12-31 20:35:15.312 3722 3722 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:2004)
也就是开机向导没有REQUEST_NETWORK_SCORES这个权限,导致问题产生。
我们在framework/base/core/res 下面,打开
AndroidManifest.xml
搜索可以看到:
image我们知道,GMS是不能用系统签名的,于是只能是setup了。而这里的setup是什么意思呢?
image完整的讲解在
https://blog.csdn.net/u013553529/article/details/53167072
这些数值,对应的源码位置在PermissionInfo.java文件:
image于是关键搜索就是PROTECTION_FLAG_SETUP 这个值了。
搜索出来,定位到PackageManagerService.java 文件
grantSignaturePermission方法里面
image这里发现,关键信息是包名 和 mSetupWizardPackage 进行比对了,那么我们就去看看这个mSetupWizardPackage值从哪来的?
image继续去看:
image然后我们发现,这里有个逻辑判定:
matches.size() == 1 ,也就是只有为1时候,才会赋值,于是我们定位就转为,找下手机是否有多个开机向导了。如果有多个,也就可以定位问题点了。
那么我们再次看一个信息:
连接手机,使用
adb shell dumpsys package permission android.permission.REQUEST_NETWORK_SCORES
使用此命令,将此权限的信息打印出来。
image这里就能看到,这个权限是谁提供的, android
权限信息:signature|setup
然后只是每个申请此权限的apk,以及是否允许状态。
这里granted=true 表示已经授权。
使用adb shell dumpsys package com.google.android.setupwizard 进行查看开机向导授权信息: image正常情况下有一行
image异常时候没有这一行,也就代表没有授权。
然后使用
adb shell dumpsys package -f 打印出所有intent信息
image搜索 开机向导的intent:android.intent.category.SETUP_WIZARD
发现有两个包处理这个:
com.google.android.setupwizard
com.android.provision
问题定位,删掉com.android.provision解决。
关于解析apk的androidManifest.xml 流程,这里权限的解析在:
PackageParser.java文件的
image这里,然后代码中关联的就是PermissionInfo.java的一系列值。更详细的流程
https://blog.csdn.net/qq_23547831/article/details/51203482
完
image
网友评论