最近客户纠结开机慢的问题,以此记录方便日后查看
- 客户期望的是17s,我特意拿了pixel4xl看开机logo大约13s,看到系统界面差不多18s左右,看来客户的要求是有依据的
- 这类问题的分析,我们首先要收集信息
1、eventlog里面打印的时间boot_progress,这里打印的是进入用户空间的各个阶段的时间
E:\work\gatalllog\getlog_20220112\events.log (匹配11次)
行 3: 01-03 02:19:40.237 I/boot_progress_start( 707): 2340
行 282: 01-03 02:19:40.459 I/boot_progress_preload_start( 707): 2562
行 532: 01-03 02:19:41.013 I/boot_progress_preload_end( 707): 3116
行 540: 01-03 02:19:41.533 I/boot_progress_system_run( 1110): 3636
行 555: 01-03 02:19:41.976 I/boot_progress_pms_start( 1110): 4079
行 556: 01-03 02:19:42.078 I/boot_progress_pms_system_scan_start( 1110): 4181
行 837: 01-03 02:19:42.837 I/boot_progress_pms_data_scan_start( 1110): 4939
行 838: 01-03 02:19:42.845 I/boot_progress_pms_scan_end( 1110): 4948
行 841: 01-03 02:19:42.941 I/boot_progress_pms_ready( 1110): 5044
行 871: 01-04 14:09:25.224 I/boot_progress_ams_ready( 1110): 6428
行 957: 01-04 14:09:25.871 I/boot_progress_enable_screen( 1110): 7075
2、这里告诉系统已经启动完成
01-11 16:57:07.724 I/WindowManager( 1388): ******* TELLING SURFACE FLINGER WE ARE BOOTED!
01-11 16:57:07.724 I/SurfaceFlinger( 892): Boot is finished (6505 ms)
3、观察现象特意注意到了开机动画结束到launcher启动中间有4s的黑屏。查看log 这刚刚好4s左右,说明这个阶段一致卡在userunlock的地方。想了解具体逻辑的可以看FallbackHome部分代码
行 961: 12-16 19:48:36.866 I/am_create_activity( 1207): [0,247417627,1,com.android.settings/.FallbackHome,android.intent.action.MAIN,NULL,NULL,276824320]
行 991: 12-16 19:48:37.084 I/am_proc_start( 1207): [0,1993,1000,com.android.settings,activity,{com.android.settings/com.android.settings.FallbackHome}]
行 997: 12-16 19:48:37.108 I/am_restart_activity( 1207): [0,247417627,1,com.android.settings/.FallbackHome]
行 998: 12-16 19:48:37.109 I/am_set_resumed_activity( 1207): [0,com.android.settings/.FallbackHome,minimalResumeActivityLocked]
行 1004: 12-16 19:48:37.167 I/am_on_create_called( 1993): [0,com.android.settings.FallbackHome,performCreate]
行 1005: 12-16 19:48:37.168 I/am_on_start_called( 1993): [0,com.android.settings.FallbackHome,handleStartActivity]
行 1006: 12-16 19:48:37.168 I/am_on_resume_called( 1993): [0,com.android.settings.FallbackHome,RESUME_ACTIVITY]
行 1007: 12-16 19:48:37.175 I/am_on_top_resumed_gained_called( 1993): [0,com.android.settings.FallbackHome,topStateChangedWhenResumed]
行 1009: 12-16 19:48:37.242 I/sysui_multi_action( 1207): [319,274,322,389,325,6,757,761,758,7,759,3,806,com.android.settings,871,com.android.settings.FallbackHome,905,0,945,263,1320,5,1321,2]
行 1010: 12-16 19:48:37.246 I/am_activity_launch_time( 1207): [0,247417627,com.android.settings/.FallbackHome,389]
行 1094: 12-16 19:48:40.653 I/am_finish_activity( 1207): [0,247417627,1,com.android.settings/.FallbackHome,app-request]
行 1095: 12-16 19:48:40.654 I/am_pause_activity( 1207): [0,247417627,com.android.settings/.FallbackHome,userLeaving=false]
行 1096: 12-16 19:48:40.656 I/am_on_top_resumed_lost_called( 1993): [0,com.android.settings.FallbackHome,topStateChangedWhenResumed]
行 1097: 12-16 19:48:40.657 I/am_on_paused_called( 1993): [0,com.android.settings.FallbackHome,performPause]
行 1184: 12-16 19:48:40.922 I/am_destroy_activity( 1207): [0,247417627,1,com.android.settings/.FallbackHome,finish-idle]
行 1185: 12-16 19:48:40.923 I/am_on_stop_called( 1993): [0,com.android.settings.FallbackHome,LIFECYCLER_STOP_ACTIVITY]
行 1187: 12-16 19:48:40.930 I/am_on_destroy_called( 1993): [0,com.android.settings.FallbackHome,performDestroy]
4、如何解决这4s的黑屏,让launcher丝滑早点启动。于是想到了direct-boot模式。settings就是设置了这个模式FallbackHome才能在用户还没unlock的时候启动的
https://developer.android.google.cn/training/articles/direct-boot#java
- 具体做法就是:
1、清单中将 android:directBootAware 属性设为 true
2、写了一个简单的例子
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivityTAG";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED));
if (getSystemService(UserManager.class).isUserUnlocked()){
Log.d(TAG,"cxylog-->class{MainActivity}_method{onCreate}:unlocked do access storage ");
}else{
Log.d(TAG,"cxylog-->class{MainActivity}_method{onCreate}:not unlocked do access storage later");
}
}
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (getSystemService(UserManager.class).isUserUnlocked()){
Log.d(TAG,"cxylog-->class{MainActivity}_method{onReceive}:unlocked do access storage ");
}
}
};
}
3、如需在没有unlock的时候访问设备加密存储,通过调用 [Context.createDeviceProtectedStorageContext()](https://developer.android.google.cn/reference/android/content/Context#createDeviceProtectedStorageContext()) 创建另一个 [Context](https://developer.android.google.cn/reference/android/content/Context) 实例。通过此上下文发出的所有存储 API 调用均访问设备加密存储
Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...









网友评论