GMS 5.1_r3/6.0_r2 以上版本开机向导wifi设置无法跳过

GMS 5.1_r3和6.0_r2以上版本存在开机向导WiFi设置无法跳过的问题。5.1_r3版本因GmsCore的dex2oat过程导致skip按钮置灰,6.0_r2版本由于SetupWizard的机制变化,10秒内未获取FRP状态会取消任务。解决方案包括优化dex2oat时间、延迟开机向导启动和取消中断异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

▪Description
 
更新版本GMS(5.1_r3/6.0_r2)后出现,在开机向导wifi设置界面,跳过按钮置灰
  • 5.1_r3版本,按钮置灰一段时间后可以恢复,点击即可跳过
  • 6.0_r2版本,按钮置灰不能恢复,则此次开机一直不能跳过

▪Version

 Android L/M

▪Rate

30% ~ 50%

▪Analyze

5.1_r3及以上版本:

L1版本升级最新5.1 GMS_r3,目前第一次开机(或者恢复出厂设置后开机)有以下两个问题:

  • 开机向导wifi设置界面skip按钮置灰,等待一段时间后才可以点击跳过
  • 开机动画完成后黑屏一段时间才出现开机向导第一个界面

以上两个问题并不会同时出现(即类似互斥关系)

WIFI设置界面无法skip问题,主要因为GmsCore得3个dex文件做dex2oat时间太长导致:

  1. 由于手机防盗功能,开机向导在wifi设置界面需要判断FRP的状态来决定是否一定需要网络来登录Google账户验证
  2. FRP状态需要通过GmsCore的FrpService获取,而FrpService需要等待GmsCore的3个插件dex文件做dex2oat完成后才能启动
  3. 如果在开机向导的wifi设置界面,FrpService还没有启动起来,那么这个时候skip按钮就是置灰的;需要一直等待FrpService启动后获取到正确的FRP状态后skip按钮才可以点击

 

开机向导启动前黑屏问题,关键在于从开机动画完成到开机向导的第一个有界面activity启动花费太长时间,而这个又是因为其它应用在开机阶段首次运行时做dex2oat导致cpu loading几乎100%:

 

出现黑屏问题的时候,由于开机向导启动时间被延后,所以在wifi设置界面时GmsCore的dex2oat已完成,这个时候可以正常通过FrpService获取到frp状态,从而可以一次性跳过;

而未出现黑屏问题的时候,由于开机向导启动时间早,所以在wifi设置界面时GmsCore的dex2oat还未完成,所以无法正常获取frp状态,导致无法skip

总结:

以上两个问题都是同一个原因造成(App占用CPU资源做dex2oat),只是对应的现象不一样,后面针对当前分析给出workaround解法

解法主要从以下方面进行优化:

  • 缩短GmsCore插件做dex2oat时间
  • 延迟开机向导启动时间(加长开机动画时间)

6.0_r2及以上版本:

M版本升级最新6.0 GMS_r2,目前第一次开机(或者恢复出厂设置后开机)会概率性出现开机向导wifi设置界面无法跳过,一旦出现,此次开机将一直无法点击跳过按钮

M版本GmsCore第一次运行时并不需要再做dex2oat,可是SetupWizard的机制有所变化,即:

SetupWizard通过asyncTask调用GmsCore获取FRP Status,如果10s未返回结果则cancel掉此asyncTask(通过中断线程执行直接cancel,同时抛出InterruptedException异常),且设置必须要网络连接才可以进行下一步

对于性能不够好的机器,10s有可能线程未能及时finished,则会导致开机向导状态错误

总结:

后面针对当前分析给出workaround解法,解法主要从“取消中断异常”方面进行优化

▪Solution

5.1_r3及以上版本:

1.
首先根据
[FAQ15597]whitelist: 针对个别apk由于的dex2oat原因安装失败/ 安装慢 / lunch慢的处理方法
修改/art/dex2oat/dex2oat.cc,对应白名单为:
在device.mk中加入PRODUCT_PROPERTY_OVERRIDES += ro.mtk.dex2oat_white_list=com.google.android:
(注意 包名后又冒号“:”一定要加,如果有多个应用,每个应用的包名后面都要添加":",且总字符串不能超过91个字符)

2.

FAQ15597中的/art/dex2oat/dex2oat.cc以下部分代码做一下改变:

[C/C++] hide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifdef HAVE_ANDROID_OS
 
  if (shouldUseInterpretonly(zip_location.c_str())){
 
    compiler_filter_string = "interpret-only" ;
 
    LOG(INFO) << " This apk is in whitelist from property so set interpret-only" ;
 
  } else if (shouldUseInterpretonly(dex_filename.c_str())){
 
    compiler_filter_string = "interpret-only" ;
 
    LOG(INFO) << " This jar is in whitelist from property so set interpret-only" ;
 
  } else {
 
#endif
 
修改为==>
 
#ifdef HAVE_ANDROID_OS
 
  if (shouldUseInterpretonly(zip_location.c_str())){
 
    compiler_filter_string = "verify-none" ;
 
    LOG(INFO) << " This apk is in whitelist from property so set verify-none" ;
 
  } else if (shouldUseInterpretonly(dex_filename.c_str())){
 
    compiler_filter_string = "verify-none" ;
 
    LOG(INFO) << " This jar is in whitelist from property so set verify-none" ;
 
  } else {
 
#endif

3.

在以下文件添加"///M: @{ ... ///M: @}"部分代码:

[Java] hide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
 
import java.lang.Thread;
 
final int startActivityLocked(...) {
 
  ...
 
  if (err == ActivityManager.START_SUCCESS) {
 
    final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0 ;
 
    ///M: @{
 
    ComponentName SetupCmpName = intent.getComponent();
 
    String GMSSetupString = "com.google.android.setupwizard/.SetupWizardActivity" ;
 
    if (userId == 0 && SetupCmpName != null && GMSSetupString.equals(SetupCmpName.flattenToShortString())) {
 
      int sleepTimeMS = 5000 ;
 
      Slog.i(TAG, "setupwizard sleep " + sleepTimeMS);
 
      try {
 
        Thread.sleep(sleepTimeMS);
 
      } catch (Exception e){
 
        Slog.i(TAG, e.toString());
 
      }
 
    }
 
    ///M: @}
 
    Slog.i(TAG, "START u" + userId + " {" + intent.toShortString( true , true , true , false )
 
    ...
 
  }
 
  ...
 
}


第3点修改说明:
因为这是64位GMS造成的性能问题,所以如果此项目配置稍差,那么以上的sleepTimeMS可能还要加大(side effect:sleep时间过长会导致通过system server启动的Service等操作因为等待执行而timeout甚至发生anr)
当然,如果项目配置好,这个时间可以修改缩短进行测试
这里sleep造成的影响是,延迟第一次开机时间,即退出动画会延长一段时间退出,因为只对第一次开机动画时间有影响,这个对用户影响不是很大

6.0_r2及以上版本:

在AsyncTask加入"///M: @{ ... ///M: @}"部分修改:

[Java] hide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/frameworks/base/core/java/android/os/AsyncTask.java
 
public final boolean cancel( boolean mayInterruptIfRunning) {
 
  ///M: @{
 
  java.lang.StackTraceElement stackTrace[] = new java.lang.Throwable().getStackTrace();
 
  for ( int i = 0 ; i < stackTrace.length; i ++) {
 
    String classMethodName = stackTrace[i].getClassName()+ "." +stackTrace[i].getMethodName();
 
    //"com.google.android.gms.auth.frp.FrpClient.isChallengeSupported"
 
    if (classMethodName.contains( "com.google.android.setupwizard.util.FrpHelper" )) {
 
      android.util.Log.w(LOG_TAG, "Setupwizard canceled this task, getStatus()=" +getStatus());
 
      return false ;
 
    }
 
  }
 
  ///M: @}
 
  mCancelled.set( true );
 
  return mFuture.cancel(mayInterruptIfRunning);
 
}

如果以上修改还有一定几率会出现问题,那么请继续合入5.1的1和2步骤修改

备注:

所有修改合入后请使用user版本进行测试,如果还有问题,请录制视频并提交复现问题的完整mtklog
因为user版本默认无法获取第一次开机log,所以有以下两种方式获取:

1) 修改代码,默认打开mtklog,抓取第一次开机log
2) 使用eng的boot.img替换到user版本,然后使用以下命令获取log:

adb logcat -v threadtime > setuplog.txt

谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值