google更新开机向导APK后,我们可以通过点击上一步,再重新进wifi界面.多试几次,可能就可以跳过连wifi界面了.(也有变态的解法,判断google的开机向导activity,延迟个5-10s启动),留给FRP service 更多时间.
同时,再国内环境,如果插了SIM卡有数据连接的话,机器会一直卡在检查网络界面,不管以前是否登录过google账号.
原因是
:
第一次
eng
刷机开机,机器初始任务多,手机运行慢,如果手机在
10s
内没有取到
killswitch
的
token
是否存在的结果的话,
wifi
界面就没法跳过。
代码流程分析:
反编译
google
的开机向导后,我们从
WifiSettingsWrapper.onStartSubactivity()
里面可以知道,在这个方法返回
true
的时候
NetworkRequirementHelper.isNetworkRequired()
,
wifi
界面是没法
skip
的。
往下跟到
----->FrpHelper.isChallengeRequired() ------> FrpStatus. getFrpStatus()
public static FrpStatus getFrpStatus()
FrpTask localFrpTask = getFrpRequiredTask();
if ((localFrpTask.getStatus() != AsyncTask.Status.FINISHED) ||(
localFrpTask.isCancelled()
));
可以看出如果
localFrpTask
没有完成,或者
localFrpTask
已经
cancel
了的话,
getFrpStatus()
会返回
null,
同时
isChallengeRequired
会返回
true
,也就是
wifi
界面没法
skip
同时
FrpHelper
在实例的时候就会
loadFrpStatus()
也就是会去在后台跑
localFrpTask
,也就是
FrpTask
,看
FrpTask
类的
doInBackground
方法。
protected FrpHelper.FrpStatus doInBackground(Void[]paramArrayOfVoid)
FrpHelper.FrpStatus localFrpStatus = new FrpHelper.FrpStatus();
this.mHandler.postDelayed(this.mTimeoutRunnable,10000L);
localFrpStatus.challengeRequired =FrpHelper.-get0(FrpHelper.this).isChallengeRequired();
localFrpStatus.supported =FrpHelper.-get0(FrpHelper.this).isChallengeSupported();
Log.i("SetupWizard.FrpHelper", "FRP status: "+ localFrpStatus);
this.mHandler.removeCallbacks(this.mTimeoutRunnable);
return localFrpStatus;
catch (NullPointerException localNullPointerException)
while (true)
Log.wtf("SetupWizard.FrpHelper", "Exceptiongetting FRP challenge state", localNullPointerException);
从黄色高亮的代码可以看出
10s
后,如果
task
没有完,就会执行
mTimeoutRunnable
privatefinal Runnable mTimeoutRunnable = new Runnable()
public void run()
if (FrpHelper.FrpTask.this.getStatus() ==AsyncTask.Status.RUNNING)
FrpHelper.FrpTask.this.cancel(true);
在
mTimeoutRunnable
里面会把这个后台
task
给
cancel
掉。
我们再返回看前面的
getFrpStatus()
方法
,
这个方法会返回
null
。
我们再通过
smail
代码看
isChallengeRequired()
方法的返回值:
.method publicstatic isChallengeRequired()Z
.locals 2
.prologue
.line 54
invoke-static{},Lcom/google/android/setupwizard/util/FrpHelper;->getFrpStatus()Lcom/google/android/setupwizard/util/FrpHelper$FrpStatus;
move-result-object v0
.line 55
.local v0,"frpStatus":Lcom/google/android/setupwizard/util/FrpHelper$FrpStatus;
if-eqzv0, :cond_0
iget-booleanv1, v0,Lcom/google/android/setupwizard/util/FrpHelper$FrpStatus;->challengeRequired:Z
:goto_0
return v1
:cond_0
const/4 v1,0x1
goto:goto_0
.end method
关键地方就是
if-eqzv0,:cond_0
,
if-eqz
意思是如果
v0(frpStatus)
是否等于
Zreo
,也就是
null
。恰好我们的
frpStatus
的值就是
null
。跟到
cond_0,
发现给了
v1
赋值
1
,也就是
true
,再跟到
goto_0,
这里直接把
v1
返回了,也就是返回了
true
。
所以
wifi
界面就跳不过了。
从抓的
log
里面可以证实上述运行逻辑:
01-0616:55:02.269 I/SetupWizard.FrpHelper( 5151): FRP status: supported:true, challengeRequired: false
01-0616:55:02.593 W/SetupWizard.FrpHelper( 5151):
FRPtask cancelled,
butchallengeRequired=false
我在
AsyncTask
的
cancel(booleanmayInterruptIfRunning)
方法里面打出的回调栈的
log
:
01-0619:25:27.587 4109 4109 E fuyao : cancle call stackisjava.lang.Exception
01-0619:25:27.587 4109 4109 E fuyao : atandroid.os.AsyncTask.cancel(AsyncTask.java:482)
01-0619:25:27.587 4109 4109 E fuyao : atcom.google.android.setupwizard.util.FrpHelper$FrpTask$1.run(FrpHelper.java:127)
01-0619:25:27.587 4109 4109 E fuyao : atandroid.os.Handler.handleCallback(Handler.java:739)
01-0619:25:27.587 4109 4109 E fuyao : atandroid.os.Handler.dispatchMessage(Handler.java:95)
01-0619:25:27.587 4109 4109 E fuyao : atandroid.os.Looper.loop(Looper.java:148)
01-0619:25:27.587 4109 4109 E fuyao : atandroid.app.ActivityThread.main(ActivityThread.java:5417)
01-0619:25:27.587 4109 4109 E fuyao : atjava.lang.reflect.Method.invoke(Native Method)
01-0619:25:27.587 4109 4109 E fuyao : atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-0619:25:27.587 4109 4109 E fuyao : atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
PS
:反编译后的
java
代码逻辑有些混乱,我们可以通过查看反编译的
smali
代码来帮助我们确认正常的逻辑
对比了
AndroidL
的
Setupwizard
,是没有这个
10s
的要求的。
Google
就是个坑
- -
!
更新: google更新开机向导APK后,我们可以通过点击上一步,再重新进wifi界面.多试几次,可能就可以跳过连wifi界面了.(也有变态的解法,判断google的开机向导activity,延迟个5-10s启动),留给FRP service 更多时间. 同时,再国内环境,如果插了SIM卡有数据连接的话,机器会一直卡在检查网络界面,不管以前是否登录过google账
目前第一次
开机
(或者恢复出厂设置后
开机
)有以下两个问题:
开机
向导
wifi设置界面skip按钮置灰,等待一段时间后才可以点击
跳
过
开机
动画完成后黑屏一段时间才出现
开机
向导
第一个界面
以上两个问题并不会同时出现(即类似互斥关系)
WIFI设置界面
无法
skip问题,主要因为GmsCore得3个dex文件做dex2oat时间太长导致:
由于手机防盗功能,
开机
向导
在wifi设置界面需要判断F
1.
原因
在有些低端手机芯片会发现,
开机
向导
时候很容易出现各种gms应用anr的情况,都是因为cpu高导致。但是对性能不好的芯片来说,很容易导致anr,因此解决方法1就是
跳
过skip anr。
2.实现判断时间
搜索add start ,add end
xref: /frameworks/base/services/core/java/com/
android
/server/am/Acti...
目录更改 USER_SETUP_COMPLETE 和 DEVICE_PROVISIONED
更改 USER_SETUP_COMPLETE 和 DEVICE_PROVISIONED
打开
命令行,输入命令:
adb shell settings put secure user_setup_complete 1
adb shell settings put global device_provisioned 1
diff --git a/packages/apps/Launcher3/src/com/
android
/launcher3/LauncherClings.ja
index ef8e8ab..fd444a4 100644
--- a/packages/apps/Launcher3/src/com/
android
/launcher3/LauncherClings.java
+++ b/packages
adb shell settings put global device_provisioned 1
adb shell settings put secure user_setup_complete 1
这将使
Android
设备
跳
过
开机
向导
。
4. 重新启动设备,现在你应该能够直接进入主屏幕,
跳
过
开机
向导
。
请注意,这种操作可能会导致某些设置
无法
完成,因此请谨慎操作。