专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
复利大王  ·  某一线女网红下海? ·  昨天  
复利大王  ·  好牛的幼儿园 ·  2 天前  
复利大王  ·  湘ya一骨科的瓜? ·  2 天前  
复利大王  ·  老同学中捞一捞能不能找到免费P友 ·  2 天前  
复利大王  ·  不讲武德!中x银行? ·  2 天前  
51好读  ›  专栏  ›  刘望舒

Android包管理机制(五)APK是如何被解析的

刘望舒  · 掘金  · android  · 2018-10-18 06:49

正文

请到「今天看啥」查看全文


Android包管理机制(三)PMS处理APK的安装 这篇文章中,我们知道安装APK时需要调用PMS的installPackageLI方法: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

private void installPackageLI(InstallArgs args, PackageInstalledInfo res) {
    ...
    PackageParser pp = new PackageParser();//1
    pp.setSeparateProcesses(mSeparateProcesses);
    pp.setDisplayMetrics(mMetrics);
    pp.setCallback(mPackageParserCallback);
    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "parsePackage");
    final PackageParser.Package pkg;
    try {
        pkg = pp.parsePackage(tmpPackageFile, parseFlags);//2
    }
    ...
 }   
复制代码

可以看到安装APK时,需要先在注释1处创建PackageParser,然后在注释2处调用PackageParser的parsePackage方法来解析APK。

2.PackageParser解析APK

Android5.0引入了Split APK机制,这是为了解决65536上限以及APK安装包越来越大等问题。Split APK机制可以将一个APK,拆分成多个独立APK。 在引入了Split APK机制后,APK有两种分类:

  • Single APK:安装文件为一个完整的APK,即base APK。Android称其为Monolithic。
  • Mutiple APK:安装文件在一个文件目录中,其内部有多个被拆分的APK,这些APK由一个 base APK和一个或多个split APK组成。Android称其为Cluster。

了解了APK,我们接着学习PackageParser解析APK,查看PackageParser的parsePackage方法: frameworks/base/core/java/android/content/pm/PackageParser.java

 public Package parsePackage(File packageFile, int flags, boolean useCaches)
            throws PackageParserException {
        Package parsed = useCaches ? getCachedResult(packageFile, flags) : null;
        if (parsed != null) {
            return parsed;
        }
        if (packageFile.isDirectory()) {//1
            parsed = parseClusterPackage(packageFile, flags);
        } else {
            parsed = parseMonolithicPackage(packageFile, flags);
        }
        cacheResult(packageFile, flags, parsed);

        return parsed;
    }
复制代码

注释1处,如果要解析的packageFile是一个目录,说明是Mutiple APK,就需要调用parseClusterPackage方法来解析,如果是Single APK则调用parseMonolithicPackage方法来解析。这里以复杂的parseClusterPackage方法为例,了解了这个方法,parseMonolithicPackage方法自然也看的懂。

frameworks/base/core/java/android/content/pm/PackageParser.java

 private Package parseClusterPackage(File packageDir, int flags) throws PackageParserException {
	        final PackageLite lite = parseClusterPackageLite(packageDir, 0);//1
        if (mOnlyCoreApps && !lite.coreApp) {//2
            throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
                    "Not a coreApp: " + packageDir);
        }
        ...
        try {
            final AssetManager assets = assetLoader.getBaseAssetManager();
            final File baseApk = new File(lite.baseCodePath);
            final Package pkg = parseBaseApk(baseApk, assets, flags);//3
            if (pkg == null) {
                throw new PackageParserException(INSTALL_PARSE_FAILED_NOT_APK,
                        "Failed to parse base APK: " + baseApk);
            }
            if (!ArrayUtils.isEmpty(lite.splitNames)) {
                final






请到「今天看啥」查看全文


推荐文章
复利大王  ·  某一线女网红下海?
昨天
复利大王  ·  好牛的幼儿园
2 天前
复利大王  ·  湘ya一骨科的瓜?
2 天前
复利大王  ·  老同学中捞一捞能不能找到免费P友
2 天前
复利大王  ·  不讲武德!中x银行?
2 天前
全球健身指导  ·  为什么男人更喜欢少妇?
8 年前
新京报书评周刊  ·  拒绝思考即是恶
7 年前