【Android 插件化】VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(一)

简介: 【Android 插件化】VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(一)

文章目录

前言

一、VirtualApp 安装并启动资源中自带的 APK 插件流程

1、依赖 VirtualApp 库

2、插件 APK 准备

3、启动插件引擎

4、拷贝 APK 到存储目录

5、安装插件

6、启动插件

二、完整源码

1、自定义 Application 源码

2、MainActivity 主界面源码

3、执行效果


前言

在 【Android 插件化】VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 ) 和 【Android 插件化】VirtualApp 接入 ( 安装 APK 插件应用 | 启动插件 APK 应用 | MainActivity 安装启动插件完整代码 ) 博客中 , 简要介绍了应用接入 VirtualApp 的流程 ;


下面开始封装一个 APK 插件到应用中 , 并启动该 APK 插件 ;






一、VirtualApp 安装并启动资源中自带的 APK 插件流程



1、依赖 VirtualApp 库


工程中 , 添加 VirtualApp 的 依赖库 , 该依赖库是 Android Library 类型的 ;

image.png



在 Module 下的 build.gradle 中设置 VirtualApp 依赖库 依赖 ;


dependencies {
    implementation project(':lib')
}



2、插件 APK 准备


将插件 APK 文件 , 放置在 assets 资源目录下 ;

image.png




3、启动插件引擎


在自定义的 Application 中的 protected void attachBaseContext(Context base) 方法中 , 通过调用 VirtualCore.get().startup(base) 方法 , 启动插件化引擎 ;


public class VApp extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        try {
            VirtualCore.get().startup(base);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}



4、拷贝 APK 到存储目录


将 VirtualApp\myapp\src\main\assets\app.apk 文件 , 拷贝到 /data/user/0/com.example.myapp/files/app.apk 位置 ;


之后可以加载 /data/user/0/com.example.myapp/files/app.apk 插件文件 ;


拷贝过程如下 :


 

/**
     * 将 VirtualApp\myapp\src\main\assets\app.apk 文件 ,
     * 拷贝到 /data/user/0/com.example.myapp/files/app.apk 位置
     */
    public void copyFile() {
        try {
            InputStream inputStream = getAssets().open("app.apk");
            FileOutputStream fileOutputStream = new FileOutputStream(new File(getFilesDir(), "app.apk"));
            byte[] buffer = new byte[1024 * 4];
            int readLen = 0;
            while ( (readLen = inputStream.read(buffer)) != -1 ) {
                fileOutputStream.write(buffer, 0, readLen);
            }
            inputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            Log.i("HSL", "文件拷贝完毕");
        }
    }


目录
相关文章
|
6月前
|
SQL 人工智能 移动开发
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
|
8月前
|
Android开发
Android手写占位式插件化框架之apk解析原理系统源码分析
Android手写占位式插件化框架之apk解析原理系统源码分析
76 0
|
11月前
|
Android开发
AS插件-Android Drawable Importer
AS插件-Android Drawable Importer
80 0
|
11月前
|
Go Android开发
AS插件-android-selector-chapek
AS插件-android-selector-chapek
51 0
|
11月前
|
Android开发
AS插件-Android Parcelable code generator.
AS插件-Android Parcelable code generator.
90 0
|
11月前
|
XML Android开发 数据格式
AS插件-Android Layout ID Converter
AS插件-Android Layout ID Converter
63 0
|
语音技术 开发工具 Android开发
|
21天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
97 0