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啟動變化
-
launcher需要通過FallbackHome啟動, FallbackHome是settings中的一個透明activity,settings的android:directBootAware為true
透明activity
但是要注意:
一些定製的系統可能限制使用者自由使用settings功能,會通過程式碼禁用settings,因此會導致Android7.0上無法啟動launcher,具體表現為找不到intent(No home screen found for ),系統啟動之後一直停留在開機動畫,沒有其他的任何錯誤日誌
- Launcher非directBootAware應用,PMS中的限制導致此時無法啟動Launcher
將Launcher標記為directBootAware應用會導致開機後Launcher crash。因為Launcher中的widget仍舊是非directBootAware的,此時仍舊無法啟動,除非將widget相關的APP都標記為directBootAware
3.launcher啟動流程增加了settings--->FallbackHome--->launcher,比較與Android6.0耗時更多
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開機流程改動較大