文章目录
一、安装应用源码分析
1、HomePresenterImpl 添加应用
- 一、安装应用源码分析
- 1、HomePresenterImpl 添加应用
- 2、AppRepository.addVirtualApp 安装 SD 卡 APK 应用
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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?