public static void systemReady() { VPackageManagerService instance = new VPackageManagerService(); new VUserManagerService(VirtualCore.get().getContext(), instance, new char[0], instance.mPackages); gService.set(instance); }
public static void put(VPackage pkg, PackageSetting ps) { synchronized (PackageCacheManager.class) { PackageParserEx.initApplicationInfoBase(ps, pkg); PACKAGE_CACHE.put(pkg.packageName, pkg); pkg.mExtras = ps; VPackageManagerService.get().analyzePackageLocked(pkg); } }
@Override public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); synchronized (mPackages) { VPackage p = mPackages.get(packageName); if (p != null) { PackageSetting ps = (PackageSetting) p.mExtras; return PackageParserEx.generateApplicationInfo(p, flags, ps.readUserState(userId), userId); } } return null; }
@Override public ResolveInfo resolveIntent(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); List<ResolveInfo> query = queryIntentActivities(intent, resolvedType, flags, 0); return chooseBestActivity(intent, resolvedType, flags, query); }
@Override public PackageInfo getPackageInfo(String packageName, int flags, int userId) { checkUserId(userId); synchronized (mPackages) { VPackage p = mPackages.get(packageName); if (p != null) { PackageSetting ps = (PackageSetting) p.mExtras; return generatePackageInfo(p, ps, flags, userId); } } return null; }
@Override public ResolveInfo resolveService(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); List<ResolveInfo> query = queryIntentServices(intent, resolvedType, flags, userId); if (query != null) { if (query.size() >= 1) { // If there is more than one service with the same priority, // just arbitrarily pick the first one. return query.get(0); } } return null; }
@Override public List<ResolveInfo> queryIntentActivities(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); ComponentName comp = intent.getComponent(); if (comp == null) { final ActivityInfo ai = getActivityInfo(comp, flags, userId); if (ai != null) { final ResolveInfo ri = new ResolveInfo();
@Override public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); ComponentName comp = intent.getComponent(); if (comp == null) { ActivityInfo ai = getReceiverInfo(comp, flags, userId); if (ai != null) { ResolveInfo ri = new ResolveInfo();
@Override public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); ComponentName comp = intent.getComponent(); if (comp == null) { final ServiceInfo si = getServiceInfo(comp, flags, userId); if (si != null) { final ResolveInfo ri = new ResolveInfo();
@TargetApi(Build.VERSION_CODES.KITKAT) @Override public List<ResolveInfo> queryIntentContentProviders(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); ComponentName comp = intent.getComponent(); if (comp == null) { final ProviderInfo pi = getProviderInfo(comp, flags, userId); if (pi != null) { final ResolveInfo ri = new ResolveInfo();
public void refreshAuthenticatorCache(String packageName) { cache.authenticators.clear(); Intent intent = new Intent(AccountManager.ACTION_AUTHENTICATOR_INTENT); if (packageName != null) { intent.setPackage(packageName); } generateServicesMap( VPackageManagerService.get().queryIntentServices(intent, null, PackageManager.GET_META_DATA, 0), cache.authenticators, new RegisteredServicesParser()); }
@Override public void processRestarted(String packageName, String processName, int userId) { int callingPid = getCallingPid(); int appId = VAppManagerService.get().getAppId(packageName); int uid = VUserHandle.getUid(userId, appId); synchronized (this) { ProcessRecord app = findProcessLocked(callingPid); if (app == null) { ApplicationInfo appInfo = VPackageManagerService.get().getApplicationInfo(packageName, 0, userId); appInfo.flags |= ApplicationInfo.FLAG_HAS_CODE; String stubProcessName = getProcessName(callingPid); int vpid = parseVPid(stubProcessName); if (vpid != -1) { performStartProcessLocked(uid, vpid, appInfo, processName); } } } }
public static VPackage remove(String packageName) { synchronized (PackageCacheManager.class) { VPackageManagerService.get().deletePackageLocked(packageName); return PACKAGE_CACHE.remove(packageName); } } }
@Override public boolean onCreate() { Context context = getContext(); DaemonService.startup(context); if (!VirtualCore.get().isStartup()) { return true; } VPackageManagerService.systemReady(); addService(ServiceManagerNative.PACKAGE, VPackageManagerService.get()); VActivityManagerService.systemReady(context); addService(ServiceManagerNative.ACTIVITY, VActivityManagerService.get()); addService(ServiceManagerNative.USER, VUserManagerService.get()); VAppManagerService.systemReady(); addService(ServiceManagerNative.APP, VAppManagerService.get()); BroadcastSystem.attach(VActivityManagerService.get(), VAppManagerService.get()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { addService(ServiceManagerNative.JOB, VJobSchedulerService.get()); } VNotificationManagerService.systemReady(context); addService(ServiceManagerNative.NOTIFICATION, VNotificationManagerService.get()); VAppManagerService.get().scanApps(); VAccountManagerService.systemReady(); addService(ServiceManagerNative.ACCOUNT, VAccountManagerService.get()); addService(ServiceManagerNative.VS, VirtualStorageService.get()); addService(ServiceManagerNative.DEVICE, VDeviceManagerService.get()); addService(ServiceManagerNative.VIRTUAL_LOC, VirtualLocationService.get()); return true; }
@Override public VParceledListSlice<ProviderInfo> queryContentProviders(String processName, int vuid, int flags) { int userId = VUserHandle.getUserId(vuid); checkUserId(userId); flags = updateFlagsNought(flags); ArrayList<ProviderInfo> finalList = new ArrayList<>(3); // reader synchronized (mPackages) { for (VPackage.ProviderComponent p : mProvidersByComponent.values()) { PackageSetting ps = (PackageSetting) p.owner.mExtras; if (ps.appId == VUserHandle.getAppId(vuid) && getNameForUid(vuid).equals(p.owner.packageName)) { ProviderInfo providerInfo = PackageParserEx.generateProviderInfo(p, flags, ps.readUserState(userId), userId); finalList.add(providerInfo); } } } if (!finalList.isEmpty()) { Collections.sort(finalList, sProviderInitOrderSorter); } return new VParceledListSlice<>(finalList); }
@Override public int getPackageUid(String packageName, int userId) { checkUserId(userId); synchronized (mPackages) { VPackage p = mPackages.get(packageName); if (p != null) { PackageSetting ps = (PackageSetting) p.mExtras; return VUserHandle.getUid(userId, ps.appId); } return -1; } }
private void removeUserStateLocked(int userHandle) { // Cleanup package manager settings mPm.cleanUpUser(userHandle); // Remove this user from the list mUsers.remove(userHandle); mRemovingUserIds.remove(userHandle); // Remove user file AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + ".xml")); userFile.delete(); // Update the user list writeUserListLocked(); updateUserIdsLocked(); removeDirectoryRecursive(VEnvironment.getUserSystemDirectory(userHandle)); }
private ResolveInfo chooseBestActivity(Intent intent, String resolvedType, int flags, List<ResolveInfo> query) { if (query != null) { final int N = query.size(); if (N == 1) { return query.get(0); } else if (N > 1) { // If there is more than one activity with the same priority, // then let the user decide between them. ResolveInfo r0 = query.get(0); ResolveInfo r1 = query.get(1); // If the first activity has a higher priority, or a different // default, then it is always desireable to pick it. if (r0.priority != r1.priority || r0.preferredOrder != r1.preferredOrder || r0.isDefault != r1.isDefault) { return query.get(0); } // If we have saved a preference for a preferred activity for // this Intent, use that. ResolveInfo ri = findPreferredActivity(intent, resolvedType, flags, query, r0.priority); //noinspection ConstantConditions if (ri != null) { return ri; } return query.get(0); } } return null; }
writeUserListLocked(); writeUserLocked(userInfo); mPm.createNewUser(userId, userPath); userInfo.partial = false; writeUserLocked(userInfo);
@Override public ResolveInfo resolveIntent(Intent intent, String resolvedType, int flags, int userId) { checkUserId(userId); flags = updateFlagsNought(flags); List<ResolveInfo> query = queryIntentActivities(intent, resolvedType, flags, 0); return chooseBestActivity(intent, resolvedType, flags, query); }