动态加载第三方apk实现插件化(无需安装)

本文介绍了如何通过动态加载第三方apk实现插件化,避免安装多个独立应用。主要内容包括理解其原理,即通过访问apk的类和资源文件,以及为第三方Activity赋予生命周期。通过创建PluginManager、实现接口接管生命周期、使用代理ProxyActivity以及在插件工程中创建继承PluginActivity的Activity,将编译后的apk放入主app的assets目录下,从而实现在主app中运行第三方应用的功能。
摘要由CSDN通过智能技术生成

前言:

  • 支付宝中有各种应用例如各种共享单车等,他们并不是直接集成在支付宝app中(也不可能)
  • 那他们是怎么加载如此之多的应用的呢?
  • 当然可以嵌入h5网页实现,但是h5的用户体验和兼容性当然没有原生的好,经过观察这些第三方应用都不是h5页面
  • 那么问题来了,这些应用是如何加载到支付宝上的呢?
  • 答案是:支付宝动态加载了第三方apk应用

原理:

  • 如果我们能访问到第三方apk文件的类、资源文件,是不是就可以直接在主app加载出来,实现第三方app的功能呢?
  • 答案是肯定的,但是在第三方app中,呈现的是一个个Activity,他又通过生命周期进行各种管理
  • 那么主app能直接调用第三方自带生命周期的Activity类吗?很可惜是不能的
  • 主app的生命周期是android系统赋予的,而我们使用主app直接加载第三方类的时候并不存在生命周期,所以我们需要自己赋予他生命周期

目标:

  • 加载第三方apk文件的类、资源
  • 赋予Activity类生命周期

步骤:

  1. 首先我们创建个PluginManager   libs模块 主工程和插件工程都需要依赖他(主要实现资源和类的加载和管理)他包含一下几个类:

    public class PluginApk {
        //插件实体对象
    
        //包信息
        private PackageInfo mPackageInfo;
        //资源对象
        private Resources mResources;
        //asset对象
        private AssetManager mAssetManager;
        //类加载器
        private ClassLoader mClassLoader;
    
        public PluginApk(PackageInfo mPackageInfo, Resources mResources, ClassLoader mClassLoader) {
            this.mPackageInfo = mPackageInfo;
            this.mResources = mResources;
            this.mAssetManager = mResources.getAssets();
            this.mClassLoader = mClassLoader;
        }
    
        public PackageInfo getmPackageInfo() {
            return mPackageInfo;
        }
    
        public Resources getmResources() {
            return mResources;
        }
    
        public AssetManager getmAssetManager() {
            return mAssetManager;
        }
    
        public ClassLoader getmClassLoader() {
            return mClassLoader;
        }
    }
    public class PluginManager {
    
        private final static PluginManager mInstance=new PluginManager();
    
        private PluginManager(){
    
        }
    
        public static PluginManager getmInstance() {
            return mInstance;
        }
    
        private PluginApk pluginApk;
        private Context mContext;
    
        public void init(Context context){
            //初始化上下文
            mContext=context.getApplicationContext();
    
        }
        public void loadApk(String apkPath){
            //读取第三方apk的包信息
            PackageInfo packageInfo= mContext.get
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值