日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/6/17 Android 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、安裝應用源碼分析
    • 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 {@Overridepublic 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 < userIds.length; i++) {if (userIds[i] != i) {nextUserId = i;break;}}addResult.userId = nextUserId;if (VUserManager.get().getUserInfo(nextUserId) == null) {// user not exist, create it automatically.String nextUserName = "Space " + (nextUserId + 1);VUserInfo newUserInfo = VUserManager.get().createUser(nextUserName, VUserInfo.FLAG_ADMIN);if (newUserInfo == null) {throw new IllegalStateException();}}boolean success = VirtualCore.get().installPackageAsUser(nextUserId, info.packageName);if (!success) {throw new IllegalStateException();}} else { // SD 卡 APK 文件 , 如果是第一次安裝 , 則命中該分支InstallResult res = mRepo.addVirtualApp(info);if (!res.isSuccess) {throw new IllegalStateException();}}}).then((res) -> {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 {@Overridepublic InstallResult addVirtualApp(AppInfoLite info) {// int COMPARE_VERSION = 0X01 << 3;// int SKIP_DEX_OPT = 0x01 << 6;int flags = InstallStrategy.COMPARE_VERSION | InstallStrategy.SKIP_DEX_OPT;// fastOpen 值是 false , 該分支沒有命中if (info.fastOpen) {flags |= InstallStrategy.DEPEND_SYSTEM_IF_EXIST;}// 安裝 SD 卡中的 APK 文件return VirtualCore.get().installPackage(info.path, flags);} }

原始數據 AppInfoLite info 如下 :

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

此處找到了可以直接調用的 API 方法 , 調用 VirtualCore.get().installPackage( SD卡絕對路徑 , 0X01 << 3 | 0x01 << 6); API 安裝某個路徑中中的 APK 文件 ;


flags 值參考 : 0X01 << 3 | 0x01 << 6 ;

// int COMPARE_VERSION = 0X01 << 3;// int SKIP_DEX_OPT = 0x01 << 6;int flags = InstallStrategy.COMPARE_VERSION | InstallStrategy.SKIP_DEX_OPT;

InstallStrategy 常量類定義 :

public interface InstallStrategy {int TERMINATE_IF_EXIST = 0x01 << 1;int UPDATE_IF_EXIST = 0x01 << 2;int COMPARE_VERSION = 0X01 << 3;int IGNORE_NEW_VERSION = 0x01 << 4;int DEPEND_SYSTEM_IF_EXIST = 0x01 << 5;int SKIP_DEX_OPT = 0x01 << 6; }

總結

以上是生活随笔為你收集整理的【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。