日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android系统启动流程分析之安装应用

發布時間:2025/3/15 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);??
  • ??????????????????
  • ????????????????//?掃描system/priv-app目錄?????????????
  • ????????????????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);??
  • ??
  • ????????????????//?掃描system/app目錄??????????????????
  • ????????????????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?{??
  • ???????????//?XXXX?todo:?need?to?figure?out?correct?configuration.??
  • ???????????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
  • //?And?now?re-install?the?app.??
  • 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);??



  • 總結

    以上是生活随笔為你收集整理的Android系统启动流程分析之安装应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。