Merge "OMS: Introduce default overlays"
This commit is contained in:
committed by
Android (Google) Code Review
commit
638903002e
@@ -286,7 +286,7 @@ public final class LoadedApk {
|
||||
final String apkName = path.substring(path.lastIndexOf(File.separator));
|
||||
boolean match = false;
|
||||
for (String oldPath : oldPaths) {
|
||||
final String oldApkName = oldPath.substring(path.lastIndexOf(File.separator));
|
||||
final String oldApkName = oldPath.substring(oldPath.lastIndexOf(File.separator));
|
||||
if (apkName.equals(oldApkName)) {
|
||||
match = true;
|
||||
break;
|
||||
|
||||
@@ -31,7 +31,8 @@ public class InterestingConfigChanges {
|
||||
|
||||
public InterestingConfigChanges(int extraFlags) {
|
||||
mFlags = extraFlags | ActivityInfo.CONFIG_LOCALE
|
||||
| ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_SCREEN_LAYOUT;
|
||||
| ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_SCREEN_LAYOUT
|
||||
| ActivityInfo.CONFIG_ASSETS_PATHS;
|
||||
}
|
||||
|
||||
public boolean applyNewConfig(Resources res) {
|
||||
|
||||
@@ -44,8 +44,11 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ResultReceiver;
|
||||
import android.os.ShellCallback;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
import android.util.AtomicFile;
|
||||
import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
@@ -70,6 +73,7 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
@@ -193,6 +197,14 @@ public final class OverlayManagerService extends SystemService {
|
||||
|
||||
static final String PERMISSION_DENIED = "Operation not permitted for user shell";
|
||||
|
||||
/**
|
||||
* The system property that specifies the default overlays to apply.
|
||||
* This is a semicolon separated list of package names.
|
||||
*
|
||||
* Ex: com.android.vendor.overlay_one;com.android.vendor.overlay_two
|
||||
*/
|
||||
private static final String DEFAULT_OVERLAYS_PROP = "ro.boot.vendor.overlay.theme";
|
||||
|
||||
private final Object mLock = new Object();
|
||||
|
||||
private final AtomicFile mSettingsFile;
|
||||
@@ -216,7 +228,8 @@ public final class OverlayManagerService extends SystemService {
|
||||
mUserManager = UserManagerService.getInstance();
|
||||
IdmapManager im = new IdmapManager(installer);
|
||||
mSettings = new OverlayManagerSettings();
|
||||
mImpl = new OverlayManagerServiceImpl(mPackageManager, im, mSettings);
|
||||
mImpl = new OverlayManagerServiceImpl(mPackageManager, im, mSettings,
|
||||
getDefaultOverlayPackages());
|
||||
|
||||
final IntentFilter packageFilter = new IntentFilter();
|
||||
packageFilter.addAction(ACTION_PACKAGE_ADDED);
|
||||
@@ -257,6 +270,21 @@ public final class OverlayManagerService extends SystemService {
|
||||
updateAssets(newUserId, targets);
|
||||
}
|
||||
|
||||
private static Set<String> getDefaultOverlayPackages() {
|
||||
final String str = SystemProperties.get(DEFAULT_OVERLAYS_PROP);
|
||||
if (TextUtils.isEmpty(str)) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
final ArraySet<String> defaultPackages = new ArraySet<>();
|
||||
for (String packageName : str.split(";")) {
|
||||
if (!TextUtils.isEmpty(packageName)) {
|
||||
defaultPackages.add(packageName);
|
||||
}
|
||||
}
|
||||
return defaultPackages;
|
||||
}
|
||||
|
||||
private final class PackageReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(@NonNull final Context context, @NonNull final Intent intent) {
|
||||
|
||||
@@ -27,8 +27,8 @@ import static com.android.server.om.OverlayManagerService.TAG;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.om.OverlayInfo;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
import android.util.Slog;
|
||||
@@ -53,13 +53,16 @@ final class OverlayManagerServiceImpl {
|
||||
private final PackageManagerHelper mPackageManager;
|
||||
private final IdmapManager mIdmapManager;
|
||||
private final OverlayManagerSettings mSettings;
|
||||
private final Set<String> mDefaultOverlays;
|
||||
|
||||
OverlayManagerServiceImpl(@NonNull final PackageManagerHelper packageManager,
|
||||
@NonNull final IdmapManager idmapManager,
|
||||
@NonNull final OverlayManagerSettings settings) {
|
||||
@NonNull final OverlayManagerSettings settings,
|
||||
@NonNull final Set<String> defaultOverlays) {
|
||||
mPackageManager = packageManager;
|
||||
mIdmapManager = idmapManager;
|
||||
mSettings = settings;
|
||||
mDefaultOverlays = defaultOverlays;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -92,12 +95,22 @@ final class OverlayManagerServiceImpl {
|
||||
final PackageInfo overlayPackage = overlayPackages.get(i);
|
||||
final OverlayInfo oi = storedOverlayInfos.get(overlayPackage.packageName);
|
||||
if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget)) {
|
||||
if (oi != null) {
|
||||
packagesToUpdateAssets.add(oi.targetPackageName);
|
||||
}
|
||||
// Update the overlay if it didn't exist or had the wrong target package.
|
||||
mSettings.init(overlayPackage.packageName, newUserId,
|
||||
overlayPackage.overlayTarget,
|
||||
overlayPackage.applicationInfo.getBaseCodePath());
|
||||
|
||||
if (oi == null) {
|
||||
// This overlay does not exist in our settings.
|
||||
if (mDefaultOverlays.contains(overlayPackage.packageName)) {
|
||||
// Enable this overlay by default.
|
||||
mSettings.setEnabled(overlayPackage.packageName, newUserId, true);
|
||||
}
|
||||
} else {
|
||||
// The targetPackageName we have stored doesn't match the overlay's target.
|
||||
// Queue the old target for an update as well.
|
||||
packagesToUpdateAssets.add(oi.targetPackageName);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -132,7 +145,7 @@ final class OverlayManagerServiceImpl {
|
||||
}
|
||||
}
|
||||
|
||||
return new ArrayList<String>(packagesToUpdateAssets);
|
||||
return new ArrayList<>(packagesToUpdateAssets);
|
||||
}
|
||||
|
||||
void onUserRemoved(final int userId) {
|
||||
@@ -303,6 +316,7 @@ final class OverlayManagerServiceImpl {
|
||||
|
||||
void onDump(@NonNull final PrintWriter pw) {
|
||||
mSettings.dump(pw);
|
||||
pw.println("Default overlays: " + TextUtils.join(";", mDefaultOverlays));
|
||||
}
|
||||
|
||||
List<String> getEnabledOverlayPackageNames(@NonNull final String targetPackageName,
|
||||
|
||||
@@ -45,7 +45,6 @@ import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Data structure representing the current state of all overlay packages in the
|
||||
|
||||
@@ -496,18 +496,6 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
private static final String PACKAGE_SCHEME = "package";
|
||||
|
||||
private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay";
|
||||
/**
|
||||
* If VENDOR_OVERLAY_THEME_PROPERTY is set, search for runtime resource overlay APKs also in
|
||||
* VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_THEME_PROPERTY> in addition to
|
||||
* VENDOR_OVERLAY_DIR.
|
||||
*/
|
||||
private static final String VENDOR_OVERLAY_THEME_PROPERTY = "ro.boot.vendor.overlay.theme";
|
||||
/**
|
||||
* Same as VENDOR_OVERLAY_THEME_PROPERTY, except persistent. If set will override whatever
|
||||
* is in VENDOR_OVERLAY_THEME_PROPERTY.
|
||||
*/
|
||||
private static final String VENDOR_OVERLAY_THEME_PERSIST_PROPERTY
|
||||
= "persist.vendor.overlay.theme";
|
||||
|
||||
/** Permission grant: not grant the permission. */
|
||||
private static final int GRANT_DENIED = 1;
|
||||
@@ -2476,16 +2464,6 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
// Collect vendor overlay packages. (Do this before scanning any apps.)
|
||||
// For security and version matching reason, only consider
|
||||
// overlay packages if they reside in the right directory.
|
||||
String overlayThemeDir = SystemProperties.get(VENDOR_OVERLAY_THEME_PERSIST_PROPERTY);
|
||||
if (overlayThemeDir.isEmpty()) {
|
||||
overlayThemeDir = SystemProperties.get(VENDOR_OVERLAY_THEME_PROPERTY);
|
||||
}
|
||||
if (!overlayThemeDir.isEmpty()) {
|
||||
scanDirTracedLI(new File(VENDOR_OVERLAY_DIR, overlayThemeDir), mDefParseFlags
|
||||
| PackageParser.PARSE_IS_SYSTEM
|
||||
| PackageParser.PARSE_IS_SYSTEM_DIR
|
||||
| PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0);
|
||||
}
|
||||
scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), mDefParseFlags
|
||||
| PackageParser.PARSE_IS_SYSTEM
|
||||
| PackageParser.PARSE_IS_SYSTEM_DIR
|
||||
@@ -3415,6 +3393,8 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
return null;
|
||||
}
|
||||
|
||||
rebaseEnabledOverlays(packageInfo.applicationInfo, userId);
|
||||
|
||||
packageInfo.packageName = packageInfo.applicationInfo.packageName =
|
||||
resolveExternalPackageNameLPr(p);
|
||||
|
||||
@@ -4147,8 +4127,12 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
if (a != null && mSettings.isEnabledAndMatchLPr(a.info, flags, userId)) {
|
||||
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
|
||||
if (ps == null) return null;
|
||||
return PackageParser.generateActivityInfo(a, flags, ps.readUserState(userId),
|
||||
userId);
|
||||
ActivityInfo ri = PackageParser.generateActivityInfo(a, flags,
|
||||
ps.readUserState(userId), userId);
|
||||
if (ri != null) {
|
||||
rebaseEnabledOverlays(ri.applicationInfo, userId);
|
||||
}
|
||||
return ri;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -4274,8 +4258,12 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
if (s != null && mSettings.isEnabledAndMatchLPr(s.info, flags, userId)) {
|
||||
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
|
||||
if (ps == null) return null;
|
||||
return PackageParser.generateServiceInfo(s, flags, ps.readUserState(userId),
|
||||
userId);
|
||||
ServiceInfo si = PackageParser.generateServiceInfo(s, flags,
|
||||
ps.readUserState(userId), userId);
|
||||
if (si != null) {
|
||||
rebaseEnabledOverlays(si.applicationInfo, userId);
|
||||
}
|
||||
return si;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -4294,8 +4282,12 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
if (p != null && mSettings.isEnabledAndMatchLPr(p.info, flags, userId)) {
|
||||
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
|
||||
if (ps == null) return null;
|
||||
return PackageParser.generateProviderInfo(p, flags, ps.readUserState(userId),
|
||||
userId);
|
||||
ProviderInfo pi = PackageParser.generateProviderInfo(p, flags,
|
||||
ps.readUserState(userId), userId);
|
||||
if (pi != null) {
|
||||
rebaseEnabledOverlays(pi.applicationInfo, userId);
|
||||
}
|
||||
return pi;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -23220,7 +23212,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
|
||||
ArrayList<String> paths = null;
|
||||
if (overlayPackageNames != null) {
|
||||
final int N = overlayPackageNames.size();
|
||||
paths = new ArrayList<String>(N);
|
||||
paths = new ArrayList<>(N);
|
||||
for (int i = 0; i < N; i++) {
|
||||
final String packageName = overlayPackageNames.get(i);
|
||||
final PackageParser.Package pkg = mPackages.get(packageName);
|
||||
@@ -23235,7 +23227,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
|
||||
ArrayMap<String, ArrayList<String>> userSpecificOverlays =
|
||||
mEnabledOverlayPaths.get(userId);
|
||||
if (userSpecificOverlays == null) {
|
||||
userSpecificOverlays = new ArrayMap<String, ArrayList<String>>();
|
||||
userSpecificOverlays = new ArrayMap<>();
|
||||
mEnabledOverlayPaths.put(userId, userSpecificOverlays);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user