android7.0凍結開機動畫無法進入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


但是要注意:
一些定製的系統可能限制用戶自由使用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開機流程改動較大


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章