您当前的位置: 首页 >  android

韩曙亮

暂无认证

  • 2浏览

    0关注

    1068博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )

韩曙亮 发布时间:2021-10-15 22:52:03 ,浏览量:2

文章目录
  • 一、安装应用源码分析
    • 1、HomePresenterImpl 添加应用
    • 2、AppRepository.addVirtualApp 安装 SD 卡 APK 应用

一、安装应用源码分析 1、HomePresenterImpl 添加应用

mPresenter.addApp(info); 实际上调用的是 io.virtualapp.home.HomePresenterImpl 类的 addApp() 方法 , 安装应用 , 传入 AppInfoLite info 参数 , 封装如下值 :

packageName : com.example.filepath , path : /storage/emulated/0/./app-debug.apk , fastOpen : false

通过 VirtualCore.get().getInstalledAppInfo(info.packageName, 0); 代码 , 获取该应用是否安装过 ,

  • 如果应用安装过 , 则该安装操作是克隆应用 ;
  • 如果应用没有安装过 , 则该安装操作是从 SD 卡安装 ; 如果是从 SD 卡安装 , 则调用 InstallResult res = mRepo.addVirtualApp(info); 进行安装操作 ;
class HomePresenterImpl implements HomeContract.HomePresenter {
    @Override
    public void addApp(AppInfoLite info) {
        class AddResult {
            private PackageAppData appData;
            private int userId;
            private boolean justEnableHidden;
        }
        AddResult addResult = new AddResult();
        VUiKit.defer().when(() -> {
            // 获取安装的应用信息 , 该应用之前是否安装过
            // 这里应该是判断 克隆应用 / SD 卡 APK 文件
            InstalledAppInfo installedAppInfo = VirtualCore.get().getInstalledAppInfo(info.packageName, 0);

            // 是否隐藏 , 如果之前有安装过 , 即这是第二次安装 , 则需要隐藏 , 命中 if (addResult.justEnableHidden) 分支
            addResult.justEnableHidden = installedAppInfo != null;
            if (addResult.justEnableHidden) { // 克隆应用
                int[] userIds = installedAppInfo.getInstalledUsers();
                int nextUserId = userIds.length;
                /*
                  Input : userIds = {0, 1, 3}
                  Output: nextUserId = 2
                 */
                for (int i = 0; i  {
            addResult.appData = PackageAppDataStorage.get().acquire(info.packageName);
        }).done(res -> {
            boolean multipleVersion = addResult.justEnableHidden && addResult.userId != 0;
            if (!multipleVersion) {
                PackageAppData data = addResult.appData;
                data.isLoading = true;
                mView.addAppToLauncher(data);
                handleOptApp(data, info.packageName, true);
            } else {
                MultiplePackageAppData data = new MultiplePackageAppData(addResult.appData, addResult.userId);
                data.isLoading = true;
                mView.addAppToLauncher(data);
                handleOptApp(data, info.packageName, false);
            }
        });
    }
}
2、AppRepository.addVirtualApp 安装 SD 卡 APK 应用

InstallResult res = mRepo.addVirtualApp(info); 方法调用的是 AppRepository 类的 addVirtualApp 方法 ;

public class AppRepository implements AppDataSource {
    @Override
    public InstallResult addVirtualApp(AppInfoLite info) {
    	// int COMPARE_VERSION = 0X01             
关注
打赏
1663594092
查看更多评论
0.0432s