android7.0冻结开机动画无法进入Launcher

说明:/data/system/users/0目录下面的文件应该是自动扫描更新的。正常开机的机器,删除此目录下的文件,重启后也会正常进入到Launcher。并不会引起不能进入Launcher情况。

问题排查用到的知识点

/data/system/users/0/package-restrictions.xml

这个文件存储了所有应用程序的运行状态,开机立即读取,经过系统行为的判断,如果系统必须启动的APP被禁用了,则不能启动系统,一直重复重复的某个环节


通过pm命令:
pm enable [–user USER_ID] PACKAGE_OR_COMPONENT恢复为激活状态
pm disable [–user USER_ID] PACKAGE_OR_COMPONENT修改为禁用状态
pm list packages -d查看禁用的列表 (返回的package name 的列表)
查package信息(打印出来的是清单文件信息)
dumpsys package 包名


/system/priv-app 系统app目录主要是底层app,如setting 、systemUI、TelephonyProvider

/system/app 系统app目录 ,主要是三方定制app,如launcher 、Email、Calendar

/data/app 普通应用,push apk至该目录,reboot设备PM会自动扫描安装该目录下的app,正常的用户安装也是把apk文件存储在这个目录下面

日志分析

主要看日志确定几个过程是否正常,找到问题可能的点

  • 系统是否启动即FW是否就绪
  • PMS扫描是否完成
  • launcher启动的intent是否发出
  • socket、AMS、zygote工作是否正常,launcher process是否start

没有找到intent,可能是launcher没有编译进去,如果编译进去了PackageManager是否完成扫描,没有扫描检查其他system/app或者/system/priv-app 有没有扫描

Android7.0检查setting是否被禁用,因为在Android 7.0中,启动过程中有了新的一步。一旦您的手机完全启动并且Android正在运行,就有一种方法可供开发人员在您登录前允许通信。其他所有内容都会被锁定,您无法与任何其他应用进行交互。谷歌甚至为需要立即运行的应用程序插入了一个名为“ Device Storage”的新存储区域,因为他们无法访问正常的凭据保护文件系统

Android系统正常启动流程主要Log

启动android第一个进程init,通过解析init.rc脚本,生成文件系统,启动vold、media、SurfaceFlinger等Nativie服务。在这个阶段你可以看到带“Android”文字静态logo和带“android”文字的开机动画

[    3.947876] init: /dev/hw_random not found

挂载文件系统,一些挂载出错,主要是原因是文件不存在

[    4.049219] EXT4-fs (actc): mounted filesystem with ordered data mode. Opts: noauto_da_alloc
[    4.070701] EXT4-fs (acte): mounted filesystem with ordered data mode. Opts: nodelalloc

启动守护进程installd服务:apk安装的服务

16:00:06.510 I/installd( 1342): installd firing up

启动volume服务:主要是用来管理usb/sd卡等外部存储设备。平台可以对外部存储设备进行操作和轮询状态,当外部存储设备状态发生变化时,volume 服务也会实时报告平台

  I/Vold    ( 1326): Vold 2.1 (the revenge) firing up
 D/Vold    ( 1326): Volume sdcard state changing -1 (Initializing) -> 0 (No-Media)

启动SurfaceFlinger服务:合成图像并显示到屏幕。启动该服务过程中会触发init启动一个bootanimation进程,其会开始启动动画显示,也就是我们看到的带“android”字样的启动动画

 I/SurfaceFlinger( 1333): SurfaceFlinger is starting
I/SurfaceFlinger( 1333): SurfaceFlinger's main thread ready to run. Initializing graphics H/W...

bootanimation进程启动,如前所述,会启动带“android”字样的动画,直到luncher界面以后会停止动画

E/BootAnimation( 1299): BootAnimation::music:boot

启动mediaserver服务:音视频多媒体服务,通过binder的进程间通信方式来完成其他进程(如音乐播放器)的请求

I/mediaserver( 1341): ServiceManager: 0xb7460418

启动AudioFlinger服务:由mediaserver服务启动,是Android音频系统的两大服务之一,AudioFlinger向下访问AudioHardware,实现输出音频数据,控制音频参数。同时,AudioFlinger向上通过IAudioFinger接口提供服务

I/AudioFlinger( 1341): Using default 3000 mSec as standby time.

系统初始化时会开启一个CameraService的守护进程,为上层应用提供camera对应的功能接口。并与与硬件抽象层之间通过回调函数传递数据

 I/CameraService( 1341): CameraService started (pid=1341)
 D/CameraService( 1341): CameraService::init
 I/CameraService( 1341): Loaded "Actions CameraHal Module" camera module

Zygote进程启动:
1.生成Dalvik虚拟机,运行java程序
2.将需要的类与资源加载到内存中,新运行的程序可直接使用这些资源,不必重新加载,加快了运行速度
3.生成SystemService进程,该进程用来生成运行Android平台需要的一些主要的java核心服务
4.生成新的android应用程序


将需要的类、资源(xml文件、图像等)加载到内存中

I/Zygote  ( 1335): Preloading classes...
E/cutils-trace( 1335): Error opening trace file: No such file or directory 
D/dalvikvm( 1335): GC_EXPLICIT freed 40K, 8% free 522K/564K, paused 0ms+0ms, total 3ms
D/dalvikvm( 1335): GC_EXPLICIT freed 5K, 3% free 601K/616K, paused 0ms+1ms, total 7ms
D/dalvikvm( 1335): Note: class Landroid/app/ActivityManagerNative; has 179 unimplemented (abstract) method
I/Zygote  ( 1335): ...preloaded 2777 classes in 4497ms.

I/Zygote  ( 1335): Preloading resources...
W/Resources( 1335): Preloaded drawable resource #0x1080096 (android:drawable/toast_frame) that varies with configuration!!
W/Resources( 1335): Preloaded drawable resource #0x1080105 (android:drawable/btn_check_on_pressed_holo_light) that varies with configuration!!
W/Resources( 1335): Preloaded drawable resource #0x1080104 (android:drawable/btn_check_on_pressed_holo_dark) that varies with configuration!!
W/Resources( 1335): Preloaded drawable resource #0x1080102 (android:drawable/btn_check_on_holo_light) that varies with configuration!!

启动SystemServer进程,该进程会启动电源管理器、Activity管理器、窗口管理器等java核心服务

I/SystemServer( 3146): Entered the Android system server!

启动PowerManagerService:电源管理服务

 D/Sensors ( 3146): AccelerationSensor::AccelerationSensor()
 D/Sensors ( 3146): AccelerationSensor::~enable(0, 0)
 I/Installer( 3146): connecting...
 I/installd( 1342): new connection
 I/SystemServer( 3146): Power Manager

启动ActivityManagerService:创建Activity管理器的服务

I/SystemServer( 3146): Activity Manager

启动DisplayManagerService:显示管理服务

I/SystemServer( 3146): Display Manager

启动PackageManagerService:包管理器服务。遍历/system/priv-app、/system/app等目录下的apk的权限和安装信息等

 I/SystemServer( 3146): Package Manager
 V/PackageManager( 3146): BuiltinPkg file :/system/etc/builtinapk
 I/PackageManager( 3146): Non-xml file /system/etc/permissions/extras in /system/etc/permissions directory, ignoring
 D/SELinuxMMAC( 3146): Couldn't find install policy /data/security/mac_permissions.xml
 D/SELinuxMMAC( 3146): Using install policy file /system/etc/security/mac_permissions.xml

启动UserManagerService:用户管理服务

I/SystemServer( 3146): User Service
I/SystemServer( 3146): Account Manager

启动LightsService:光系统管理服务

 I/SystemServer( 3146): Content Manager
 I/SystemServer( 3146): System Content Providers
 D/lights  ( 3146): #######open_lights  (backlight)######
 D/lights  ( 3146): #######open_lights  (backlight) OK######
 I/SystemServer( 3146): Lights Service

启动BatteryService:电池服务

 I/SystemServer( 3146): Battery Service

启动VibratorService:振动器系统管理服务

I/SystemServer( 3146): Vibrator Service

启动AlarmManagerService:定时器服务

[  33.765371] request_suspend_state: wakeup (3->0) at 33747188755
E/ConsumerIrService( 3146): Can't open consumer IR HW Module, error: -2
I/SystemServer( 3146): Alarm Manager

启动InputManagerService:输入子系统管理服务

I/SystemServer( 3146): Init Watchdog
I/SystemServer( 3146): Input Manager

启动WindowManagerService:窗口管理服务

I/InputManager( 3146): Initializing input manager, mUseDevInputEventForAudioJack=false
I/SystemServer( 3146): Window Manager

启动BluetoothManagerService:蓝牙服务

I/WindowManager( 3146): No existing display settings /data/system/display_settings.xml; starting empty
I/WindowManager( 3146): No keyguard interface!
D/BluetoothManagerService( 3146): Loading stored name and address
I/SystemServer( 3146): Bluetooth Manager Service

启动AccessibilityManager:

I/SystemServer( 3146): Input Method Service
D/EventHub( 3146): No input device configuration file found for device 'gslX680'.
I/SystemServer( 3146): Accessibility Manager

启动MountService:管理sd挂载服务

I/ActivityManager( 3146): Config changes=1df8 {1.0 ?mcc?mnc zh_CN ldltr sw480dp w800dp h480dp 160dpi lrg long
I/SystemServer( 3146): Mount Service

启动LockSettingsService:管理锁屏的服务

I/SystemServer( 3146): LockSettingsService

启动NetworkManagementService:网络管理服务

 I/SystemServer( 3146): Device Policy
 I/SystemServer( 3146): Status Bar
 I/SystemServer( 3146): Clipboard Service
 I/SystemServer( 3146): NetworkManagement Service

启动NetworkStatsService:网络状态服务

I/SystemServer( 3146): NetworkStats Service

启动NetworkPolicyService:网络策略服务

W/MountService( 3146): getSecureContainerList() called when storage not mounted
I/SystemServer( 3146): NetworkPolicy Service

启动WifiP2pService:管理P2P连接服务

I/SystemServer( 3146): Wi-Fi P2pService

启动WifiService:wifi管理服务

D/WifiHW  ( 3146): Unable to unload driver module "wlan_kk": No such file or directory
D/EthernetService( 3146): EthernetService construct starting
E/Netd    ( 1330): Failed to open /proc/sys/net/ipv6/conf/eth0/disable_ipv6: No such file or directory
F/SystemServer( 1627): java.lang.SecurityException: Unable to find app for caller android.app.ActivityThread$ApplicationThread@41924790 (pid=1627) when registering receiver android.app.LoadedApk$ReceiverDispatcher$InnerReceiver@41a2ed50

启动EtherhetService:wifi管理服务

I/SystemServer( 3146): Ethernet Service

启动ConnectivityService:数据连接管理服务

D/ethernet( 3146): Unable to unload driver module "asix": No such file or directory
I/SystemServer( 3146): Connectivity Service

启动NotificationManager:通知管理器服务

 I/SystemServer( 3146): UpdateLock Service
 I/SystemServer( 3146): Notification Manager

启动DeviceStorageMonitorService:设备存储监视服务

I/SystemServer( 3146): Device Storage Monitor

启动LocationManager:定位管理器服务

I/SystemServer( 3146): Location Manager

启动SearchService:定位搜索器服务

 I/SystemServer( 3146): Country Detector
 I/SystemServer( 3146): Search Service

启动WallpaperService壁纸管理服务

 I/SystemServer( 3146): Wallpaper Service

启动AudioService:音频管理服务

I/SystemServer( 3146): Audio Service

启动UsbService:usb管理服务

E/UsbDeviceManager( 3146): failed to write to /sys/class/android_usb/android0/f_rndis/ethaddr
I/SystemServer( 3146): Serial Service

启动SerialService:串口管理服务

 I/SystemServer( 3146): Twilight Service
 I/SystemServer( 3146): UI Mode Manager Service
 I/SystemServer( 3146): Backup Service

启动BackupService:备份管理服务

 I/SystemServer( 3146): Twilight Service
 I/SystemServer( 3146): UI Mode Manager Service
 I/SystemServer( 3146): Backup Service

启动AppWidgetService:桌面管理服务

I/SystemServer( 3146): AppWidget Service

启动PrintService:打印管理服务

I/SystemServer( 3146): Print Service

启动KeyguardService服务管理锁屏

V/KeyguardService( 3198): onCreate()

启动SystemUIService服务,管理StatusBar(状态栏)、NavigationBar(导航栏)

 I/fsck_msdos( 1326): ** Phase 2 - Check Cluster Chains
 E/ActionOMXPlugin( 1341): In ActionOMXPlugin: libOMX_Core.so is openning!
 E/ActionOMXPlugin( 1341): In ActionOMXPlugin: libAction_OMX_Core.so is openning!
 D/SystemUIService( 3198): loading: class

FW启动完毕(也就是ready之后),启动launcher,android动画结束,进入home界面

 I/ActivityManager( 3146): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher} from pid 0
 I/LatinIME( 3315): Hardware accelerated drawing: false
 I/ActivityManager( 3146): Start proc com.android.launcher for activity com.android.launcher/com.android.launcher2.Launcher: pid=3371 uid=10013 gids={50013}


关于Android7.0 DirectBoot功能

Android7.0下的DirectBoot模式特点

  • 存储空间

1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。

2.Device encrypted storage,主要对应的就是Direct Boot使用的存储空间。在Direct Boot模式下和用户解锁手机后都可以使用的存储空间

  • 应用运行

Direct Boot模式下app是无法运行的

要运行的话需要在AndroidManinfest.xml中设置 android:directBootAware="true"

  • Launcher启动变化
  1. launcher需要通过FallbackHome启动, FallbackHome是settings中的一个透明activity,settings的android:directBootAware为true

     

    透明activity

但是要注意:
一些定制的系统可能限制用户自由使用settings功能,会通过代码禁用settings,因此会导致Android7.0上无法启动launcher,具体表现为找不到intent(No home screen found for ),系统启动之后一直停留在开机动画,没有其他的任何错误日志


  1. Launcher非directBootAware应用,PMS中的限制导致此时无法启动Launcher

将Launcher标记为directBootAware应用会导致开机后Launcher crash。因为Launcher中的widget仍旧是非directBootAware的,此时仍旧无法启动,除非将widget相关的APP都标记为directBootAware


3.launcher启动流程增加了settings--->FallbackHome--->launcher,比较与Android6.0耗时更多

FallbackHome源码

FallbackHome时注册ACTION_USER_UNLOCKED广播,然后进行判断用户是否都已经解锁,如果没有就结束执行。之后就会等待接收ACTION_USER_UNLOCKED广播,继续判断用户是否已经解锁,如果此时已经解锁,就找Home界面,如果没有找到就发延迟消息500ms再找一次,如果找到Launcher就会将FallbackHome finish掉

PMS依赖手机当前的状态,需要user解锁才能正常查询。如果强制修改,不考虑DirectBoot和当前启动状态,即使当前user未解锁,依然可以查询符合条件的component,修改后会有无法开机的现象。因为Launcher不是directBootAware的,当前手机user尚未解锁,涉及存储相关的解锁也未进行

开机绕过FallbackHome涉及的修改面很多,并非通过修改APP或PMS可以实现,还涉及存储区域解锁以及用户状态和ACTION_USER_UNLOCKED广播的修改,对AOSP开机流程改动较大

猜你喜欢

转载自blog.csdn.net/sdkdlwk/article/details/90055296