添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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. 重新启动设备,现在你应该能够直接进入主屏幕, 开机 向导 。 请注意,这种操作可能会导致某些设置 无法 完成,因此请谨慎操作。