Android 框架实现分析 - 应用 - 细节

  1. 关键目录

  2.         应用信息存放结构:
  3. /etc/
    1. permissions/
      1. *.xml(系统权限信息)
  4. /data/(android_data_dir,ENV:ANDROID_DATA)
    1. app/(android_app_dir,APP_SUBDIR)
    2. app-private/(android_app_private_dir,PRIVATE_APP_SUBDIR)
    3. app-lib/(android_app_lib_dir,APP_LIB_SUBDIR)
      1. com.pptv.atv/
    4. app-asec/
    5. data/(主用户数据,PRIMARY_USER_PREFIX)
      1. com.pptv.atv/
        1. lib/(PKG_LIB_POSTFIX)
    6. user/(其他用户数据,SECONDARY_USER_PREFIX)
      1. 0 -> /data/data/
      2. 10/(用户ID)
        1. com.pptv.atv/
    7. dalvik-cache/
    8. media/(android_media_dir,MEDIA_SUBDIR)
  5. /mnt/asec/(android_asec_dir,ENV: ASEC_MOUNTPOINT)
  6. /system/(android_system_dirs[0],ENV: ANDROID_ROOT)
  7. /vendor/app/(android_system_dirs[1])
  8. 搜索目录

  9.         首先搜索系统目录,解析参数都有PARSE_IS_SYSTEM|PARSE_IS_SYSTEM_DIR,搜索的系统目录有:
  10. /vendor/overlay
    1. SCAN_TRUSTED_OVERLAY
  11. /system/framework
    1. PARSE_IS_PRIVILEGED
    2. SCAN_NO_DEX
  12. /system/priv-app
    1. PARSE_IS_PRIVILEGED
  13. /system/app
  14. /vendor/app
  15.         当mOnlyCore为假时,还会搜索下面的目录:
  16. /data/app
  17. /data/app-private
    1. PARSE_FORWARD_LOCK
  18. 安装目录

  19. 权限情况

  20. 所有者:                 system  system
  21. 所有者(软连接):       install install
  22. 读写标志位:            755
  23. 读写标志位(软连接):  777
  24. 读写标志位(文件):        644
  25. 修改时间(目录):      1970-01-02 00:30
  26. 修改时间(软连接):        1970-01-02 00:30
  27. 修改时间(文件):      Apk里面的时间

预装(MediaBoxLauncher)

  1. /system/
    1. app/
      1. MediaBoxLauncher.apk
    2. lib/
  2. /data/ (读写标志位:775)
    1. dalvik-cache/
      1. system@[email protected]@classes.dex (用户:system 组:u0_a31000)
    2. data/ (读写标志位:775)
      1. com.amlogic.mediaboxlauncher/ (读写标志位:751)
        1. lib -> /data/app-lib/com.amlogic.mediaboxlauncher (无效的符号链接)
    3. user/ (读写标志位:711)
      1. 0 -> /data/data/ (用户组:root)

通过包管理器安装(PPTV)

  1. /data/
    1. app/
      1. com.pplive.androidtv-1.apk (自动修改名字为包名)
    2. dalvik-cache/
      1. data@[email protected]@classes.dex (用户:system 组:all_a47)
    3. data/
      1. com.pplive.androidtv/ (用户组:u0_a47,读写标志位:751)
        1. lib -> /data/app-lib/com.pplive.androidtv-1
    4. app-lib/
      1. com.pplive.androidtv-1/
        1. libpplive_dmr_jni.so

拷贝到/data/app目录重启安装(MX Player

  1. /data/
    1. app/
      1. MX_Player_v1.7.13_7po.apk
    2. dalvik-cache/
      1. data@app@[email protected] (用户:system 组:all_a49)
    3. data/
      1. com.mxtech.videoplayer.ad/ (用户组:u0_a49)
        1. lib -> /data/app-lib/MX_Player_v1.7.13_7po (符号链接,install 用户、组)
    4. app-lib/
      1. MX_Player_v1.7.13_7po/
        1. libavcodec.so

数据目录

  1. 应用的数据目录为:/data/data/,平台应用(名称:android)除外,其数据目录为:/data/system。
  2. 如果数据目录已经存在,但是UID与应用ID不同,此时有两种情况:1)目录UID为0,可能是上次安装中途宕机,修复UID;2)对于系统应用或者启动扫描中发现的应用,删除重建。

UID分配

  1. 范围
  1. 说明
  1. 1000~9999
  1. 系统保留,mOtherUserIds
  2. addUserIdLPw()
  3. getUserIdLPr()
  4. removeUserIdLPw()
  5. replaceUserIdLPw()
  1. 10000~19999
  1. 应用ID(APPLICATION_UID),mUserIds,包括共享应用ID,保存的Object是PackageSetting或者SharedUserSetting
  2. newUserIdLPw()
  3. addUserIdLPw()
  4. getUserIdLPr()
  5. removeUserIdLPw()
  6. replaceUserIdLPw()
  1. 50000~59999
  1. 共享应用组ID(SHARED_APPLICATION_GID),与UID一一对应
  1. 99000~99999
  1. 沙箱进程(ISOLATED_UID)

内建共享库

  1. frameworks/base/data/etc/platform.xml:
  2. /system/etc/permissions/platform.xml:
  3. -------------------------------------------------------------------------
  4.    
  5.             file="/system/framework/android.test.runner.jar" />
  1. 内建共享库是java library,内建共享库一部分定义在etc/permissions/*.xml中,如:
  2. 另一部分由System App定义,此时SharedLibraryEntry只记录packageName。
  3. 对于非PARSE_IS_SYSTEM_DIR,调用updateSharedLibrariesLPw()将usesLibraries、usesOptionalLibraries转换为库路径:usesLibraryFiles。
  4. 应用使用共享库的代码:
  5. LoadedApk.getClassLoader()

应用重命名

  1. Manifest的“original-package”指定老名字,可以多个。
  2. 只有系统应用可以重命名,不能改变SharedUserId。重命名其实是保持老的名字,重命名情况记录在Settings.mRenamedPackages(Map)中,以新名字为索引,老名字为值。
  3. 因为有重命名机制,所以在判断覆盖安装时,要判断将要安装应用的老名字的应用是否存在。
  4. 老名字记录在mTransferedPackages中,PackageSetting的origPackage成员不一直跟踪老的包。

本地库

  1. 本地库目录一般为:/data/data//lib。

签名

  1. Signing Your Apps
  2. android应用程序的签名(Signature)
  3. Android的权限机制之—— “沙箱”机制sharedUserId和签名
  4. Android 安全架构及权限控制机制剖析
  5. 浅析Android权限机制(一)
  6. Android服务之PackageManagerService启动源码分析4
  7. Android4.2多用户模式的结构与实现

Apk文件中:

  1. 在JarFile打开Jar包时,首先收集并读取下列项目:
  2. META-INF/MANIFEST.MF
  3. *.SF/*.DSA/*.RSA/*.EC
  4. 然后验证证书,对每一个*.DSA/*.RSA/*.EC文件,都对应一个*.SF签名文件,验证并记录(以签名文件为索引):
  5. 证书链Certificate[]
  6. 签名项目HashMap(每个使用该证书签名的文件都有一项)
  7. 对于Apk包,所有的文件都应该用同一个证书签名,在PackageParser中,对于SYSTEM Apk只验证AndroidManifest.xml;在Package的mSignatures记录证书的Encode字节,mSigningKeys记录证书的公钥。
  8. 除了验证证书公钥集mSigningKey,应用可以自定义多个公钥集mKeySetMapping。
  9. KeySetManager管理所有的公钥和公钥集,首先给PublicKey编号ID,存储在mPublicKeys中,PublicKey集合(Set)转换为ID集合,对这个集合再次编号,存储在mKeySetMapping中,同时对外返回类似句柄的KeySet。
  10. 签名检查(compareSignatures)检查Signatures完全相同。

组件

  1. 四大组件包括“内容提供者”、“服务”、“广播”、“活动”;分别记录到mProviders、mServices、mBroadcasts、mActivities中,用于将来被Intent检索。
  2. 内容提供者还被记录到mProvidersByAuthority中。对于syncable的内容提供者,只有第一个Authority的syncable有效。
  3. 保护广播记录在mProtectedBroadcasts中。
  4. Android理解:显式和隐式Intent
  5. Android Activity和Intent机制学习笔记
  6. 通过下面四个成员分别保存四类组件的所有对象。
  7. mActivities : ActivityIntentResolver
  8. mReceivers : ActivityIntentResolver
  9. mServices : ServiceIntentResolver
  10. mProviders : ProviderIntentResolver
  11. 在scanPackageLI函数中安装包的时候,将组件分别加入到对应的集合中。

权限

  1. 类型:
  2. TYPE_NORMAL,应用定义
  3. TYPE_BUILTIN,预定义权限
  4. TYPE_DYNAMIC

        预定义权限在frameworks/base/data/etc/platform.xml以及其他权限描述文件中描述。

  1. frameworks/base/data/etc/platform.xml:
  2. /system/etc/permissions/platform.xml:
  3. -------------------------------------------------------------------------
  4.    
  5.        
  6.    
  7.    
  8.        
  9.     ……
  10.    
  11.    
  12.    

        在运行时,搜索/system/etc/permissions/下的所有xml文件并解析(platform.xml总是最后解析)。其中权限“permission”记录到Settings.mPermissions中,系统权限的授权“assign-permission”记录到mSystemPermissions中,以UID为索引,值为HashSet类型,包含多个权限名称。

        Android 系统在 system/core/private/android_filesystem_config.h 中定义了用户、用户组的具体ID号。

  1.             android:icon="drawable resource"
  2.             android:label="string resource"
  3.             android:name="string"
  4.             android:permissionGroup="string"
  5.             android:protectionLevel=["normal" | "dangerous" |
  6.                                      "signature" | "signatureOrSystem"] />
  7.                   android:icon="drawable resource"
  8.                   android:label="string resource"
  9.                   android:name="string" />
  10.                  android:label="string resource" ]
  11.                  android:name="string" />

        应用可以自定义权限。权限组记录在mPermissionGroups中,而权限和权限树记录在Settings的mPermissions和mPermissionTrees中。

        权限检查时(checkUidPermission),对于普通应用(或者共享的UID),通过GrantedPermissions检查权限,系统UID通过系统权限的授权记录检查权限

ActivityManager权限检查流程:

  1. UID为0或者SYSTEM_UID(1000),直接通过
  2. UID为Isolated,失败
  3. 权限使用者与所有者相同,通过
  4. 权限没有导出,失败
  5. PackageManager检查

授权:

  1. PROTECTION_NORMAL || PROTECTION_DANGEROUS
    1. required
    2. origPermissions.contains(perm)
    3. isSystemApp(ps) && !isUpdatedSystemApp(ps)
  2. PROTECTION_SIGNATURE
    1. SIGNATURE_MATCH(bp.packageSetting.signatures.mSignatures, pkg.mSignatures)
    2. SIGNATURE_MATCH(mPlatformPackage.mSignatures,pkg.mSignatures)
    3. PROTECTION_FLAG_SYSTEM
      1. isSystemApp(pkg)
        1. isUpdatedSystemApp(pkg)
          1. origGp.grantedPermissions.contains(perm)
          2. sysPs.pkg.requestedPermissions
        2. isPrivilegedApp()
    4. PROTECTION_FLAG_DEVELOPMENT
      1. origPermissions.contains(perm)

权限收养:

  1. Manifest的“adopt-permissions”指定从哪个应用收养权限
  2. 只有系统应用更新时,可以收养权限
  3. 实际操作是:改变权限的所有者

Instrumentation

        记录在mInstrumentation中。

资源覆盖

        通过在Manifest中定义“overlay”小节覆盖其他应用的资源,目前只对/vender/overlay目录的存在的应用,该机制有效。

        资源覆盖情形记录在mOverlays两层映射中。第一层以覆盖目标(OverlayTarget)为索引,第二层以覆盖源为索引,以PackageParser.Package为值。

        通过installd(调用idmap)建立资源ID映射,映射保存在/data/resource-cache/a@[email protected]@idmap中。

        覆盖目标的applicationInfo.resourceDirs被设置为覆盖源的sourceDir的有序集合,按照mOverlayPriority排序。

        在system/core/libutils/README中有对资源覆盖的详细描述。

框架设计

  1. private abstract class HandlerParams {
  2.     ……
  3.     final boolean startCopy() {
  4.         ……
  5.     }
  6.     final boolean serviceError() {
  7.         ……
  8.     }
  9.     abstract void handleStartCopy() throws RemoteException;
  10.     abstract void handleServiceError();
  11.     abstract void handleReturnCode();
  12. };
  1. class PackageHandler extends Handler {
  2.     final ArrayList mPendingInstalls =
  3.         new ArrayList();
  4. };
  1. class InstallParams extends HandlerParams;
  1. static abstract class InstallArgs {
  2.     abstract void createCopyFile();
  3.     abstract int copyApk(IMediaContainerService imcs, boolean temp) throws RemoteException;
  4.     abstract int doPreInstall(int status);
  5.     abstract boolean doRename(int status, String pkgName, String oldCodePath);
  6.     abstract int doPostInstall(int status, int uid);
  7.     abstract String getCodePath();
  8.     abstract String getResourcePath();
  9.     abstract String getNativeLibraryPath();
  10.     // Need installer lock especially for dex file removal.
  11.     abstract void cleanUpResourcesLI();
  12.     abstract boolean doPostDeleteLI(boolean delete);
  13.     abstract boolean checkFreeStorage(IMediaContainerService imcs) throws RemoteException;
  14. };

应用状态

        应用状态对应于用户,每个用户有一个状态集PackageUserState。应用状态包括:

  1. stopped
  2. notLaunched
  3. installed
  4. blocked
  5. enabled

安装位置

        com.android.defcontainer.DefaultContainerService的getMinimalPackageInfo获取建议安装位置。源代码位于:frameworks/base/packages/DefaultContainerService。

        其中recommendAppInstallLocation的逻辑为:

  1. 指定安装在内部/外部
    1. PREFER_INTERNAL
    2. PREFER_EXTERNAL
  2. 应用需要安装在内部/外部/自动
    1. PREFER_INTERNAL
    2. PREFER_EXTERNAL(checkBoth)
    3. PREFER_INTERNAL(checkBoth)【默认内部】
  3. 用户设置安装在内部/外部/自动
    1. PREFER_INTERNAL
    2. PREFER_EXTERNAL(checkBoth)
  4. PREFER_INTERNAL【没有如何指示】
  5. emulated【模拟外部存储】
  6. fitsOnInternal【下列条件成立】
    1. checkBoth或者PREFER_INTERNAL
    2. 内部存储没有超过上限
  7. fitsOnSd【下列条件成立】
    1. 不是模拟外部存储
    2. checkBoth或者PREFER_EXTERNAL
    3. 外部存储没有超过上限
  8. 如果PREFER_INTERNAL
    1. 如果fitsOnInternal
      1. 》建议安装在内部
  9. 否则不是模拟外部存储并且PREFER_EXTERNAL
    1. 如果fitsOnSd
      1. 》建议安装在外部
  10. 如果checkBoth
    1. 如果fitsOnInternal
      1. 》建议安装在内部
  11. 否则不是模拟外部存储并且fitsOnSd
    1. 》建议安装在外部
  12. 》失败

        完整逻辑在installLocationPolicy实现:

  1. 如果是已经存在的应用
    1. 如果是系统应用
      1. 》确定安装在内部
    2. 否则
      1. 如果指定安装在外部
        1. 》确定安装在外部
      2. 如果应用需要安装在内部
        1. 》确定安装在内部
      3. 否则如果需要安装在外部
      4. 否则
        1. 之前安装在外部
          1. 》确定安装在外部
        2. 》确定安装在内部
  2. 如果指定安装在外部
    1. 》确定安装在外部
  3. 》参照建议的安装位置

安装应用

PackageManagerServices.installPackage()

  1. installPackageWithVerification()
    1. installPackageWithVerificationAndEncryption()
      1. if (isUserRestricted(DISALLOW_INSTALL_APPS))
        1. return
      2. new InstallParams()
      3. PackageHandler.obtainMessage(INIT_COPY)
      4. PackageHandler.sendMessage()

PackageManagerServices.InstallParams.handleStartCopy()

  1. DeviceStorageMonitorService.getMemoryLowThreshold()
  2. Context.grantUriPermission()
  3. if (encryptionParams || !"file")
    1. createTempPackageFile()【/data/app-private/vmdlxxx.tmp】
    2. IMediaContainerService.copyResource()
  4. IMediaContainerService.getMinimalPackageInfo()
  5. if (RECOMMEND_FAILED_INSUFFICIENT_STORAGE)
    1. IMediaContainerService.calculateInstalledSize()
    2. Installer.freeCache()
    3. IMediaContainerService.getMinimalPackageInfo()
  6. Context.revokeUriPermission()
  7. installLocationPolicy()
  8. PackageManagerServices.createInstallArgs()
    1. new AsecInstallArgs
    2. new FileInstallArgs
  9. if (mRequiredVerifierPackage)
    1. getPackageUid()
    2. new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION)
    3. PackageManagerServices.queryIntentReceivers()
    4. new PackageVerificationState()
    5. mPendingVerification.append()
    6. PackageManagerServices.matchVerifiers()
    7. for (sufficientVerifiers)
      1. Context.sendBroadcastAsUser();
    8. matchComponentForVerifier()
    9. Context.sendOrderedBroadcastAsUser()
  10. else
    1. InstallArgs.copyApk()
      1. createCopyFile()
      2. File.createNewFile()【/data/app/vmdlyyy.tmp】
      3. setPermissions()
      4. IMediaContainerService.copyResource()
      5. if (isFwdLocked())
        1. PackageHelper.extractPublicFiles()【拷贝manifest, resources.arsc and res directory到新zip文件【/data/app/vmdlyyy.zip.tmp】】
      6. NativeLibraryHelper.removeNativeBinariesFromDirLI()【删除旧文件】
      7. copyNativeLibrariesForInternalApp()
        1. File.mkdir()【/data/app-lib/vmdlyyy/】
        2. new NativeLibraryHelper.ApkHandle()
        3. NativeLibraryHelper.findSupportedAbi()
        4. NativeLibraryHelper.copyNativeBinariesIfNeededLI()

PackageManagerServices.InstallParams.handleReturnCode()

  1. PackageManagerServices.processPendingInstall()【见步骤三】

PackageManagerServices.processPendingInstall()

  1. mHandler.post(new Runnable())【异步执行】
    1. new PackageInstalledInfo()
    2. new PackageRemovedInfo()
    3. InstallArgs.doPreInstall()
    4. installPackageLI()【见步骤四】
    5. InstallArgs.doPostInstall()
    6. new PostInstallData()
    7. mRunningInstalls.put()
    8. if (doRestore)
      1. IBackupManager.restoreAtInstall()
    9. if (!doRestore)
      1. mHandler.sendMessage(POST_INSTALL)

PackageManagerServices.installPackageLI()

  1. new PackageParser()
  2. PackageParser.parsePackage()【解析】
  3. PackageParser.collectCertificates()【收集签名】
  4. replace=?【判断是否覆盖安装】
  5. InstallArgs.doRename()【临时文件重命名为正式名称】
  6. setApplicationInfoPaths()【设置路径到ApplicationInfo】
  7. if (replace)
    1. replacePackageLI()见步骤七】
  8. else
    1. installNewPackageLI()【见步骤六】
  9. PackageSetting.queryInstalledUsers()

PackageManagerServices.installNewPackageLI()

  1. scanPackageLI()【见步骤八】
  2. updateSettingsLI()【见步骤九】
  3. if (!INSTALL_SUCCEEDED)
    1. deletePackageLI()

PackageManagerServices.replacePackageLI()

  1. synchronized(mPackages)
    1. mPackages.get()【查找老的】
    2. if (compareSignatures())【检查签名一致】
      1. return INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
    3. Settings.mPackages.get()
    4. UserManager.getUserIds()
    5. if (isSystemApp())【系统应用】
      1. replaceSystemPackageLI()
        1. synchronized (mPackages)
          1. mPackages.get()
          2. Settings.mPackages.get()
        2. killApplication()
        3. removePackageLI()【见步骤十】
        4. synchronized (mPackages)
          1. if (!Settings.disableSystemPackageLPw())【二次替换】
            1. createInstallArgs()
        5. scanPackageLI()【见步骤八】
        6. updateSettingsLI()【见步骤九】
        7. if (!INSTALL_SUCCEEDED)
          1. if (newPackage)
            1. removeInstalledPackageLI()【见步骤十】
          2. scanPackageLI()
          3. synchronized(mPackages)
            1. if (updatedSettings) 【调用过updateSettingsLI】
              1. Settings.enableSystemPackageLPw()
              2. Settings.setInstallerPackageName()
            2. Settings.writeLPr()
    6. else【非系统应用】
      1. replaceNonSystemPackageLI()
        1. if (!deletePackageLI(DELETE_KEEP_DATA)) 【见步骤十】
          1. INSTALL_FAILED_REPLACE_COULDNT_DELETE
        2. else
          1. scanPackageLI()【见步骤八】
          2. if (newPackage)
            1. updateSettingsLI()【见步骤九】
          3. else
            1. INSTALL_FAILED_INVALID_APK
        3. if (!INSTALL_SUCCEEDED) 【替换失败,需要恢复】
          1. if(updatedSettings)【调用过updateSettingsLI】
            1. deletePackageLI(DELETE_KEEP_DATA) 【见步骤十】
          2. if(deletedPkg)
            1. scanPackageLI()【见步骤八】
          3. synchronized (mPackages)
            1. updatePermissionsLPw()【】
            2. Settings.writeLPr()

PackageManagerServices.scanPackageLI()

  1. if (mCustomResolverComponentName==pkg.packageName)
    1. setUpCustomResolverActivity()
  2. synchronized (mPackages)
    1. if (!PARSE_IS_SYSTEM_DIR)
      1. updateSharedLibrariesLPw()【查找引用的共享库】
    2. if (pkg.mSharedUserId)
      1. Settings.getSharedUserLPw()【获取共享用户,没有创建新的】
    3. if (pkg.mOriginalPackages)
      1. if (pkg.mOriginalPackages.contains(renamed))【已经改名过】
        1. PackageParser.Package.setPackageName()
      2. else【寻找origPackage】
        1. for (pkg.mOriginalPackages)
          1. Settings.peekPackageLPr()
          2. verifyPackageUpdateLPr()
          3. if (origPackage.sharedUser)
            1. 【判断sharedUser相同】
    4. Settings.getPackageLPw()【获取或者创建PackageSetting,不添加】
    5. if (pkgSetting.origPackage)【第一次改名】
      1. PackageParser.Package.setPackageName()
    6. if (!verifySignaturesLP())【签名验证失败,改变了】
      1. if (!PARSE_IS_SYSTEM_DIR)【非系统预装应用不可以改变签名】
        1. return null
      2. if (pkgSetting.sharedUser)【系统预装改变签名,sharedUser不能变】
        1. if (compareSignatures()!= SIGNATURE_MATCH)
          1. return null
    7. if (SCAN_NEW_INSTALL)【新装应用,检查providers的authority冲突】
    8. if (pkg.mAdoptPermissions)【权限收养】
      1. for (pkg.mAdoptPermissions)
        1. if (verifyPackageUpdateLPr())
          1. Settings.transferPermissionsLPw()
  3. if (mPlatformPackage == pkg)
    1. system package special dataDir【/data/system/】
  4. else
    1. getDataPathForPackage()【/data/data/com.xxx.yyy/】
    2. if (dataPath.exists())
      1. if (currentUid != pkg.applicationInfo.uid)
        1. if (currentUid == 0)
          1. Installer.fixUid()
        2. if (PARSE_IS_SYSTEM || SCAN_BOOTING)
          1. removeDataDirsLI()
          2. createDataDirsLI()
    3. else
      1. createDataDirsLI()
      2. setInternalAppNativeLibraryPath()
  5. if (pkg.applicationInfo.nativeLibraryDir())
    1. if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg))
      1. NativeLibraryHelper.removeNativeBinariesFromDirLI()
    2. else if (!isForwardLocked(pkg) && !isExternal(pkg))
      1. copyNativeLibrariesForInternalApp()【好像InstallArgs.copyApk已经做过这些操作了】
    3. synchronized (mInstallLock)
      1. for (UserManager.getUserIds())
        1. Installer.linkNativeLibraryDirectory()
  6. synchronized (mPackages)
    1. if (FLAG_SYSTEM)
      1. if (pkg.libraryNames)【系统应用有共享库】
        1. for (pkg.libraryNames)
          1. new SharedLibraryEntry()
        2. if (!SCAN_BOOTING)
          1. updateAllSharedLibrariesLPw()
  7. if (INSTALL_REPLACE_EXISTING)
    1. if (isForwardLocked(pkg) || isExternal(pkg))
      1. sendResourcesChangedBroadcast()
    2. killApplication()
  8. synchronized (mPackages)【后面不会失败】
    1. if (SCAN_MONITOR)
      1. mAppDirs.put(pkg.mPath, pkg)
    2. Settings.insertPackageSettingLPw()
    3. mPackages.put()
    4. mSettings.mPackagesToBeCleaned【从中删除当前pkgName项】
    5. KeySetManager.addSigningKeySetToPackage()
    6. for (pkg.mKeySetMapping)
      1. KeySetManager.addDefinedKeySetToPackage()
    7. mProvidersByAuthority
    8. mServices
    9. mReceivers
    10. mActivities
    11. mPermissionGroups
    12. mSettings.mPermissionTrees
    13. mSettings.mPermissions
    14. mInstrumentation
    15. mProtectedBroadcasts
    16. mOverlays
      1. if (pkg.mOverlayTarget)
        1. createIdmapForPackagePairLI()
      2. else if (mOverlays.containsKey(pkg.packageName)
        1. createIdmapsForPackageLI()
          1. for (mOverlays.get())
            1. createIdmapForPackagePairLI()

PackageManagerServices.updateSettingsLI()

  1. Settings.setInstallStatus(PKG_INSTALL_INCOMPLETE)
  2. Settings.writeLPr()
  3. moveDexFilesLI()
  4. updatePermissionsLPw()
    1. for (Settings.mPermissionTrees)
      1. if (!hasPermission())
        1. it.remove()
    2. for (Settings.mPermissions)
      1. if (!hasPermission())
        1. it.remove()
    3. if (UPDATE_PERMISSIONS_ALL)
      1. for (mPackages)
        1. grantPermissionsLPw()
    4. if (pkgInfo)
      1. grantPermissionsLPw()
  5. if (isSystemApp())
    1. for (res.origUsers)
      1. PackageSetting.setEnabled()
    2. for (allUsers)
      1. PackageSetting.setInstalled()
  6. Settings.setInstallStatus(PKG_INSTALL_COMPLETE)
  7. Settings.setInstallerPackageName()
  8. Settings.writeLPr()

PackageManagerServices.deletePackageLI()

数据

  1. mHandlerThread : HandlerThread(后台线程)
  2. mHandler : PackageHandler
    1. mBound : boolean
    2. mPendingInstalls : ArrayList
  3. mContext : Context
  4. mFactoryTest : boolean
  5. mOnlyCore : boolean
  6. mNoDexOpt : Boolean
  7. mMetrics : DisplayMetrics
  8. mDefParseFlags : int
  9. mSeparateProcesses : String[]
  10. 目录
    1. mAppDataDir : File
    2. mUserAppDataDir : File
    3. mAsecInternalPath : String
    4. mAppInstallDir : File
    5. mAppLibInstallDir : File
    6. mDrmAppPrivateInstallDir : File
    7. mInstallLock : Object
  11. FileObserver
    1. mFrameworkInstallObserver
    2. mSystemInstallObserver
    3. mPrivilegedInstallObserver
    4. mVendorInstallObserver
    5. mVendorOverlayInstallObserver
    6. mAppInstallObserver
    7. mDrmAppInstallObserver
  12. mInstaller : Installer
  13. mAppDirs : HashMap(第三方APP安装目录,索引键为zip包CodePath)
  14. mScanningPath : File(用于错误日志)
  15. mLastScanError : int(用于错误日志)
  16. mPackages : HashMap(索引键为包名,也用于LP锁)
  17. mOverlays : HashMap>(索引键为包名、包路径)
  18. mSettings : Settings
  19. mRestoredSettings : boolean
  20. 权限(etc/permissions/*.xml)
    1. mGlobalGids : int[]
    2. mSystemPermissions : SparseArray>
    3. mSharedLibraries : HashMap
    4. mAvailableFeatures : HashMap
    5. mFoundPolicyFile : boolean
  21. mTmpSharedLibraries : String[]
  22. mShouldRestoreconData : boolean
  23. resolving pleasure
    1. mActivities : ActivityIntentResolver
    2. mReceivers : ActivityIntentResolver
    3. mServices : ServiceIntentResolver
    4. mProviders : ProviderIntentResolver
  24. mProvidersByAuthority : HashMap(索引键为provider base name)
  25. mInstrumentation : HashMap
  26. mPermissionGroups : HashMap(索引键为权限名)
  27. mTransferedPackages : HashSet
  28. mProtectedBroadcasts : HashSet(只在系统内有效的广播)
  29. mPendingVerification : SparseArray(等待验证的包)
  30. mDeferredDexOpt : HashSet
  31. mPendingVerificationToken : int
  32. mSystemReady : boolean
  33. mSafeMode : boolean
  34. mHasSystemUidErrors : boolean
  35. mAndroidApplication : ApplicationInfo
  36. mResolveActivity : ActivityInfo
  37. mResolveInfo : ResolveInfo
  38. mResolveComponentName : ComponentName
  39. mPlatformPackage : PackageParser.Package
  40. mCustomResolverComponentName : ComponentName
  41. mResolverReplaced : boolean
  42. mPendingBroadcasts : PendingPackageBroadcasts
    1. mUidMap : SparseArray>>(for each user id, a map of components within that package>)
  43. mContainerService : IMediaContainerService
  44. sUserManager : UserManagerService
  45. mDirtyUsers : HashSet
  46. mDefContainerConn : DefaultContainerConnection(连接IMediaContainerService)
  47. mRunningInstalls : SparseArray(keeping of restore-after-install operations)
    1. PostInstallData
      1. args : InstallArgs
      2. res : PackageInstalledInfo
  48. mNextInstallToken : int
  49. mRequiredVerifierPackage : String

方法

方法名后面的LI表示加上了Install锁,LP表示加上了Package锁。

  1. getRequiredVerifierLPr()
  2. isVerificationEnable()
    1. DEFAULT_VERIFY_ENABLE
    2. INSTALL_FROM_ADB
    3. ActivityManager.isRunningInTestHarness()
    4. Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB
    5. Settings.Global.PACKAGE_VERIFIER_ENABLE

你可能感兴趣的:(Android,框架实现分析,android)