ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

插件化基础知识之二———成也PackageMnager,败也PackageManager

2020-12-20 18:30:11  阅读:195  来源: 互联网

标签:插件 PackageManager return PackageMnager service sPackageManager null name


前言:

引起对PackageManager的思考的是:插件化实现对未安装的apk进行启动,那么,未安装的apk与已安装的apk有什么区别?这些区别又是谁造成的呢?谈及这个问题时,我们不得不面对PM。

内容目录:

(1).PackageManager的作用

(2).PM的本质以及来源

(3).PM的安装流程以及安装本质

(4)备注

1.PackageManager的作用

1.安装和卸载应用

2.获取关于应用的各种信息,比如Application的名称,四大组件的信息。

之所以有这种功能,是在安装app时,首先读取了AndroidManifest中的各个节点信息。

3.获取系统中各种分类应用(比如已安装应用,最近使用的应用等)

4.权限的获取与处理

具体的方法如下:

https://blog.csdn.net/da_caoyuan/article/details/52908797

2.PM的本质以及来源

(1).PackageManager的获取可以从Activity直接获取:

PackageManager packageManager = getPackageManager();

(2)进入后是ContextWrapper的调用,实际上,ContextWrapper只是Context的包装类,而实现类是ContexImpl.

  public PackageManager getPackageManager() {
        if (mPackageManager != null) {
            return mPackageManager;
        }

        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm != null) {
            // Doesn't matter if we make more than one instance.
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }

        return null;
    }

(3)PackageManger是ApplicationPackageManager,而ApplicationPackageManager实际上只是一个包装类,用来包装IPackageManager。而IPackageManger是AIDL通信的接口,对应于PackageManagerService。

  //通过这两个方法可以看出,实际上的实现都是mPM
private int installExistingPackageAsUser(String packageName, int installReason, int userId)
            throws NameNotFoundException {
        try {
            int res = mPM.installExistingPackageAsUser(packageName, userId, 0 /*installFlags*/,
                    installReason);
            if (res == INSTALL_FAILED_INVALID_URI) {
                throw new NameNotFoundException("Package " + packageName + " doesn't exist");
            }
            return res;
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    public void verifyPendingInstall(int id, int response) {
        try {
            mPM.verifyPendingInstall(id, response);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }

    }

(4)接下来,咱们来看牛13的ActivityThread(它的牛逼,看过应用冷启动流程的同学应该知悉,不知道的同学可以查查资料)。

//ServiceManager是对SystemService进行管理的类,“package”对应于PackageManagerService,关于
ServiceManager可以看下源码
public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
            return sPackageManager;
        }
        IBinder b = ServiceManager.getService("package");
        //Slog.v("PackageManager", "default service binder = " + b);
        sPackageManager = IPackageManager.Stub.asInterface(b);
        //Slog.v("PackageManager", "default service = " + sPackageManager);
        return sPackageManager;
    }

(4.1)关于ServiceManager.getService,实际上在系统启动时,启动系统服务,会将AM等各个服务添加到服务管理类中。


/**
     * Returns a reference to a service with the given name.
     *
     * @param name the name of the service to get
     * @return a reference to the service, or <code>null</code> if the service doesn't exist
     */
    public static IBinder getService(String name) {
        try {
            IBinder service = sCache.get(name);
            if (service != null) {
                return service;
            } else {
                return Binder.allowBlocking(rawGetService(name));
            }
        } catch (RemoteException e) {
            Log.e(TAG, "error in getService", e);
        }
        return null;
    }

4.备注

(1).系统源码的在线查看,用的是Android社区源码查看

http://www.androidos.net.cn/

标签:插件,PackageManager,return,PackageMnager,service,sPackageManager,null,name
来源: https://blog.csdn.net/FullStackDeveloper/article/details/109168140

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有