說明:/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啓動變化
-
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開機流程改動較大