package com.lody.virtual.client.fixer; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; import android.os.Build; import android.text.TextUtils; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.helper.proto.AppSetting; import com.lody.virtual.helper.utils.collection.ArrayMap; import com.lody.virtual.os.VEnvironment; import mirror.android.content.pm.ApplicationInfoL; import mirror.android.content.pm.ApplicationInfoN; /** * @author Lody */ public class ComponentFixer { private static final ArrayMap<String, String[]> sSharedLibCache = new ArrayMap<>(); public static void fixApplicationInfo(AppSetting setting, ApplicationInfo applicationInfo, int userId) { applicationInfo.flags |= ApplicationInfo.FLAG_HAS_CODE; if (TextUtils.isEmpty(applicationInfo.processName)) { applicationInfo.processName = applicationInfo.packageName; } applicationInfo.name = fixComponentClassName(setting.packageName, applicationInfo.name); applicationInfo.publicSourceDir = setting.apkPath; applicationInfo.sourceDir = setting.apkPath; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { applicationInfo.splitSourceDirs = new String[]{setting.apkPath}; applicationInfo.splitPublicSourceDirs = applicationInfo.splitSourceDirs; ApplicationInfoL.scanSourceDir.set(applicationInfo, applicationInfo.dataDir); ApplicationInfoL.scanPublicSourceDir.set(applicationInfo, applicationInfo.dataDir); String hostPrimaryCpuAbi = ApplicationInfoL.primaryCpuAbi.get(VirtualCore.get().getContext().getApplicationInfo()); ApplicationInfoL.primaryCpuAbi.set(applicationInfo, hostPrimaryCpuAbi); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { ApplicationInfoN.deviceEncryptedDataDir.set(applicationInfo, applicationInfo.dataDir); ApplicationInfoN.deviceProtectedDataDir.set(applicationInfo, applicationInfo.dataDir); ApplicationInfoN.credentialEncryptedDataDir.set(applicationInfo, applicationInfo.dataDir); ApplicationInfoN.credentialProtectedDataDir.set(applicationInfo, applicationInfo.dataDir); } applicationInfo.enabled = true; applicationInfo.nativeLibraryDir = setting.libPath; applicationInfo.dataDir = VEnvironment.getDataUserPackageDirectory(userId, setting.packageName).getPath(); applicationInfo.uid = setting.appId; if (setting.dependSystem) { String[] sharedLibraryFiles = sSharedLibCache.get(setting.packageName); if (sharedLibraryFiles == null) { PackageManager hostPM = VirtualCore.get().getUnHookPackageManager(); try { ApplicationInfo hostInfo = hostPM.getApplicationInfo(setting.packageName, PackageManager.GET_SHARED_LIBRARY_FILES); sharedLibraryFiles = hostInfo.sharedLibraryFiles; if (sharedLibraryFiles == null) sharedLibraryFiles = new String[0]; sSharedLibCache.put(setting.packageName, sharedLibraryFiles); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } applicationInfo.sharedLibraryFiles = sharedLibraryFiles; } } private static String fixComponentClassName(String pkgName, String className) { if (className != null) { if (className.charAt(0) == '.') { return pkgName + className; } return className; } return null; } public static void fixComponentInfo(AppSetting appSetting, ComponentInfo info, int userId) { if (info != null) { if (TextUtils.isEmpty(info.processName)) { info.processName = info.packageName; } fixApplicationInfo(appSetting, info.applicationInfo, userId); info.name = fixComponentClassName(info.packageName, info.name); if (info.processName == null) { info.processName = info.applicationInfo.processName; } } } }