生活随笔
收集整理的這篇文章主要介紹了
Android系统启动流程分析之安装应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2016六月 21
原 Android系統啟動流程分析之安裝應用
分類:Android系統源碼研究
?(295)??(0)??舉報??收藏
跟隨上一篇博客Android系統的啟動流程簡要分析繼續分析android系統的啟動.上一篇文章里講了,SystemServer在main方法里創建了一個線程ServerThread,并調用 initAndLoop方法. [java]?view plain?copy ServerThread?thr?=?new?ServerThread();?? thr.initAndLoop();?? 在initAndLoop方法里加載各種服務,比如WindowManagerService(Wms)、ActivityManagerService(Ams)、PackageManagerService(Pms)等. 看下啟動PackageManagerServer的代碼 [java]?view plain?copy pm?=?PackageManagerService.main(context,?installer,?factoryTest?!=?SystemServer.FACTORY_TEST_OFF,?onlyCore);?? 這個pm是IPackageManager的實例,IPackageManager是由IPackageManager.aidl文件編譯生成的. PackageManagerService繼承自IPackageManager.Stub [java]?view plain?copy public?class?PackageManagerService?extends?IPackageManager.Stub?{?? PackageManagerService調用main方法,傳入四個參數 context 上下文 installer 安裝器 factoryTest != SystemServer.FACTORY_TEST_OFF 是否為正常的工廠模式 onlyCore 為true表示在加密的設備只啟動核心的程序
那么查看PackageManagerService的main方法.
PackageManagerService定義在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中.
main方法是這樣的
[java]?view plain?copy public?static?final?IPackageManager?main(Context?context,?Installer?installer,?boolean?factoryTest,?boolean?onlyCore)?{?? ????????PackageManagerService?m?=?new?PackageManagerService(context,?installer,?factoryTest,?onlyCore);?? ????????ServiceManager.addService("package",?m);?? ????????return?m;?? ????}??
根據傳入的四個參數創建PackageManagerService的實例,
然后通過ServiceManager添加這個PackageManagerService實例. 既然創建了這個實例,那么就調用了它的有參構造函數 1.在構造函數里會掃描制定目錄的apk文件 [java]?view plain?copy ?? ????????????????mFrameworkInstallObserver?=?new?AppDirObserver(frameworkDir.getPath(),?OBSERVER_EVENTS,?true,?false,?false);?? ????????????????mFrameworkInstallObserver.startWatching();?? ????????????????scanDirLI(frameworkDir,?PackageParser.PARSE_IS_SYSTEM?|?PackageParser.PARSE_IS_SYSTEM_DIR?|?PackageParser.PARSE_IS_PRIVILEGED,?scanMode?|?SCAN_NO_DEX,?0);?? ?????????????????? ?????????????????? ????????????????File?privilegedAppDir?=?new?File(Environment.getRootDirectory(),?"priv-app");?? ????????????????mPrivilegedInstallObserver?=?new?AppDirObserver(privilegedAppDir.getPath(),?OBSERVER_EVENTS,?true,?true,?false);?? ????????????????mPrivilegedInstallObserver.startWatching();?? ????????????????scanDirLI(privilegedAppDir,?PackageParser.PARSE_IS_SYSTEM?|?PackageParser.PARSE_IS_SYSTEM_DIR?|?PackageParser.PARSE_IS_PRIVILEGED,?scanMode,?0);?? ?? ?????????????????? ????????????????File?systemAppDir?=?new?File(Environment.getRootDirectory(),?"app");?? ????????????????mSystemInstallObserver?=?new?AppDirObserver(systemAppDir.getPath(),?OBSERVER_EVENTS,?true,?false,?false);?? ????????????????mSystemInstallObserver.startWatching();?? ????????????????scanDirLI(systemAppDir,?PackageParser.PARSE_IS_SYSTEM?|?PackageParser.PARSE_IS_SYSTEM_DIR,?scanMode,?0);?? ?? ?????????????????? ????????????????File?vendorAppDir?=?new?File("/vendor/app");?? ????????????????mVendorInstallObserver?=?new?AppDirObserver(vendorAppDir.getPath(),?OBSERVER_EVENTS,?true,?false,?false);?? ????????????????mVendorInstallObserver.startWatching();?? ????????????????scanDirLI(vendorAppDir,?PackageParser.PARSE_IS_SYSTEM?|?PackageParser.PARSE_IS_SYSTEM_DIR,?scanMode,?0);?? 掃描調用的方法是scanDirLI,傳入四個參數,context(上下文),flag(標志),scanMode(掃描模式),currentTime(當前時間). 2.在scanDirLI方法內部會調用 [java]?view plain?copy PackageParser.Package?pkg?=?scanPackageLI(file,?flags?|?PackageParser.PARSE_MUST_BE_APK,?scanMode,?currentTime,?null);?? 3.scanPackageLI通過解析安裝包parsePackage獲取到安裝包的信息結構 [java]?view plain?copy PackageParser?pp?=?new?PackageParser(scanPath)?? ????????pp.setSeparateProcesses(mSeparateProcesses);?? ????????pp.setOnlyCoreApps(mOnlyCore);?? ????????final?PackageParser.Package?pkg?=?pp.parsePackage(scanFile,?scanPath,?mMetrics,?parseFlags);?? 4.之后調用parsePackage的重載方法解析,將應用信息保存在PackageManagerService,比如VersionCode、VersionName等 [java]?view plain?copy try?{?? ????????????? ???????????pkg?=?parsePackage(res,?parser,?flags,?errorText);?? ???????}?catch?(Exception?e)?{?? ???????????errorException?=?e;?? ???????????mParseError?=?PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;?? ???????}?? 5.回到第3步,調用scanPackageLI的重載方法 [java]?view plain?copy PackageParser.Package?scannedPkg?=?scanPackageLI(pkg,?parseFlags,?scanMode?|?SCAN_UPDATE_SIGNATURE,?currentTime,?user);6.?? 6.然后調用createDataDirsLI方法 [java]?view plain?copy ?? ret?=?createDataDirsLI(pkgName,?pkg.applicationInfo.uid,?pkg.applicationInfo.seinfo);?? 7.在createDataDirsLI方法里調用mInstaller的install方法進行安裝. [java]?view plain?copy int?res?=?mInstaller.install(packageName,?uid,?uid,?seinfo);??
版權聲明:本文為博主原創文章,轉載請注明出處:鄧志勇博客 http://blog.csdn.net/qq_31530015/
總結
以上是生活随笔為你收集整理的Android系统启动流程分析之安装应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。