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

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

5、安装插件


调用 VirtualCore.get().installPackage(getFilesDir() + "/app.apk", flags) 方法安装插件 , 该方法第一个参数是 APK 文件的路径 , 即 /data/user/0/com.example.myapp/files/app.apk , 第二个参数是 int 整型 72 ;


 

private void installPackage() {
        // int COMPARE_VERSION = 0X01 << 3;
        // int SKIP_DEX_OPT = 0x01 << 6;
        // 或运算结果 72
        int flags = InstallStrategy.COMPARE_VERSION | InstallStrategy.SKIP_DEX_OPT;
        // 安装 SD 卡根目录中的 app.apk 文件
        // /storage/emulated/0/app.apk
        VirtualCore.get().installPackage(getFilesDir() + "/app.apk", flags);
    }



6、启动插件


调用 VirtualCore.get().getLaunchIntent("kim.hsl.svg", 0) 获取已安装插件应用的启动意图 Intent 实例对象 , 根据包名获得 ;


调用 VActivityManager.get().startActivity(intent, 0) 方法 , 启动插件应用 ;


private void startApp() {
        // 打开应用
        Intent intent =  VirtualCore.get().getLaunchIntent("kim.hsl.svg", 0);
        /*VirtualCore.get().setUiCallback(intent, null);
        try {
            VirtualCore.get().preOpt("kim.hsl.svg");
        } catch (Exception e) {
            e.printStackTrace();
        }*/
        VActivityManager.get().startActivity(intent, 0);
        finish();
    }






二、完整源码



1、自定义 Application 源码


package com.example.myapp;
import android.app.Application;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import com.lody.virtual.client.core.VirtualCore;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class VApp extends Application {
    private static VApp gApp;
    public static VApp getApp() {
        return gApp;
    }
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        try {
            VirtualCore.get().startup(base);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onCreate() {
        gApp = this;
        super.onCreate();
        /*new Thread(){
            @Override
            public void run() {
                File file = new File(getFilesDir(), "app.apk");
                // 如果文件不存在 , 则拷贝文件
                if (!file.exists()) {
                    // 拷贝文件到内置存储
                    copyFile();
                }
            }
        }.start();*/
        File file = new File(getFilesDir(), "app.apk");
        // 如果文件不存在 , 则拷贝文件
        if (!file.exists()) {
            // 拷贝文件到内置存储
            copyFile();
            Toast.makeText(this, file.getAbsolutePath() +  " 文件拷贝完毕 , 可以安装插件", Toast.LENGTH_LONG).show();
            Log.i("HSL", file.getAbsolutePath() +  " 文件拷贝完毕 , 可以安装插件");
        } else {
            Toast.makeText(this, file.getAbsolutePath() + " 文件已存在 , 可以安装插件", Toast.LENGTH_LONG).show();
            Log.i("HSL", file.getAbsolutePath() + " 文件已存在 , 可以安装插件");
        }
    }
    /**
     * 将 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", "文件拷贝完毕");
        }
    }
}


2、MainActivity 主界面源码


package com.example.myapp;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.lody.virtual.client.core.InstallStrategy;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.ipc.VActivityManager;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 是否自动安装并启动插件应用
        boolean isAuto = true;
        if (isAuto) {
            new Thread() {
                @Override
                public void run() {
                    // 安装插件
                    installPackage();
                    SystemClock.sleep(3000);
                    //启动插件
                    startApp();
                }
            }.start();
        }
    }
    /**
     * 安装应用
     * @param view
     */
    public void onClick0(View view) {
        //installPackage();
    }
    private void installPackage() {
        // int COMPARE_VERSION = 0X01 << 3;
        // int SKIP_DEX_OPT = 0x01 << 6;
        // 或运算结果 72
        int flags = InstallStrategy.COMPARE_VERSION | InstallStrategy.SKIP_DEX_OPT;
        // 安装 SD 卡根目录中的 app.apk 文件
        // /storage/emulated/0/app.apk
        VirtualCore.get().installPackage(getFilesDir() + "/app.apk", flags);
    }
    /**
     * 启动应用
     * @param view
     */
    public void onClick(View view) {
        //startApp();
    }
    private void startApp() {
        // 打开应用
        Intent intent =  VirtualCore.get().getLaunchIntent("kim.hsl.svg", 0);
        /*VirtualCore.get().setUiCallback(intent, null);
        try {
            VirtualCore.get().preOpt("kim.hsl.svg");
        } catch (Exception e) {
            e.printStackTrace();
        }*/
        VActivityManager.get().startActivity(intent, 0);
        finish();
    }
}




3、执行效果

image.png






目录
相关文章
|
3月前
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
45 3
|
4月前
|
Java Android开发 Windows
使用keytool查看Android APK签名
本文介绍了如何使用Windows命令行工具和keytool查看APK的签名信息,并提供了使用AOSP环境中的signapk.jar工具对APK进行系统签名的方法。
418 0
使用keytool查看Android APK签名
|
4月前
|
Android开发
解决android apk安装后出现2个相同的应用图标
解决android apk安装后出现2个相同的应用图标
380 2
|
4月前
|
Android开发
将AAB(Android App Bundle)转换为APK
将AAB(Android App Bundle)转换为APK
287 1
|
4月前
|
Android开发 开发者
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
344 1
|
4月前
|
监控 Java 开发工具
### 绝招揭秘!Android平台GB28181设备接入端如何实现资源占用和性能消耗的极限瘦身?
【8月更文挑战第14天】本文介绍在Android平台优化GB28181标准下设备接入的性能方法,涵盖环境搭建、SDK集成与初始化。重点讲解内存管理技巧如软引用、按需加载资源,以及通过硬件加速解码视频数据和图像缩放来减轻CPU与GPU负担。同时采用线程池异步处理视频流,确保UI流畅性。这些策略有助于提高应用效率和用户体验。
52 0
|
5月前
|
Android开发
【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk
【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk
154 0
|
6月前
|
Android开发
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
339 0
|
7月前
|
Android开发 开发者
Android Split APK介绍
【2月更文挑战第5天】
|
7月前
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
88 6