文章目录
一、安装应用源码分析
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
关注
打赏
热门博文
- 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 )
- 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )
- 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 )
- 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑧ ( 控制 Gradle 执行任务顺序 | Task#shouldRunAfter 函数 | 三个函数使用场景对比 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑦ ( 控制 Gradle 执行任务顺序 | Task#dependsOn 函数 | Task#mustRunAfter 函数 )
- 【数学分析】集合 ① ( 集合概念 | 集合表示 | 常用的数集合 | 集合的表示 )
- 【数学分析】学科简介 ( 初等数学缺陷 | 微分与积分 | 学习数学分析的目的 | 数学分析与高等数学对比 )
- 【Android Gradle 插件】自定义 Gradle 任务 ③ ( Gradle 自定义任务创建方法 Project#task 函数 | Task#doFirst 函数用法 )