开机向导到联网状态,一直失败问题分析

本文详细解析了Android设备开机向导联网失败的问题,深入探讨了REQUEST_NETWORK_SCORES权限缺失的原因,通过分析framework源码及使用adb命令,最终定位并解决了由多个开机向导造成的权限冲突。

问题现象:开机向导到联网状态,一直失败,查看log输出,如下信息:

 

640

 

2-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

 

搜索可以看到:


640

 

我们知道,GMS是不能用系统签名的,于是只能是setup了。而这里的setup是什么意思呢?

 

640

 

完整的讲解在

https://blog.youkuaiyun.com/u013553529/article/details/53167072

 

这些数值,对应的源码位置在PermissionInfo.java文件:

 

640


于是关键搜索就是PROTECTION_FLAG_SETUP 这个值了。

搜索出来,定位到PackageManagerService.java 文件

grantSignaturePermission方法里面

 

640


这里发现,关键信息是包名 和 mSetupWizardPackage 进行比对了,那么我们就去看看这个mSetupWizardPackage值从哪来的?

 

640


继续去看:


640

 

然后我们发现,这里有个逻辑判定:

matches.size() == 1 ,也就是只有为1时候,才会赋值,于是我们定位就转为,找下手机是否有多个开机向导了。如果有多个,也就可以定位问题点了

 

那么我们再次看一个信息:

连接手机,使用

adb shell dumpsys package permission android.permission.REQUEST_NETWORK_SCORES

使用此命令,将此权限的信息打印出来。

 

640


这里就能看到,这个权限是谁提供的, android

权限信息:signature|setup

然后只是每个申请此权限的apk,以及是否允许状态。

 

这里granted=true 表示已经授权。

 

使用adb shell dumpsys package com.google.android.setupwizard 进行查看开机向导授权信息:


640


正常情况下有一行

 640


异常时候没有这一行,也就代表没有授权。

 

然后使用

adb shell dumpsys package -f 打印出所有intent信息

640


搜索 开机向导的intent:android.intent.category.SETUP_WIZARD


发现有两个包处理这个:

com.google.android.setupwizard

com.android.provision

问题定位,删掉com.android.provision解决。

 

关于解析apk的androidManifest.xml 流程,这里权限的解析在:

PackageParser.java文件的


640


这里,然后代码中关联的就是PermissionInfo.java的一系列值。更详细的流程

https://blog.youkuaiyun.com/qq_23547831/article/details/51203482


640

分享技术我是认真的


转载声明:本文转载自「代码GG之家」,搜索「code_gg_home」即可关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值