Support multiple requiredSystemProperty in overlay

As-is: Only one requiredSystemProperty is allowed
To-be: It supports several requiredSystemProperty

Here is format for multiple fields.
  android:requiredSystemPropertyName="rw.num,rw.char"
  android:requiredSystemPropertyValue="1,a"

Test: m
Test: Make two overlay with different condition
      Check if it works properly depending on condition
      If there is no overlay package matching the condition, both aren't
      applied

Bug: 137628879
Merged-In: I4c8c4a1304dc52d6568767d90e3dcbf6acef024a
(cherry picked from commit 5e6a87013f)
Change-Id: If3765218c96f8922c155e18e99b0f4bb6a032ff1
This commit is contained in:
Jeongik Cha
2020-03-20 13:45:03 +09:00
parent 891dcf0887
commit 9ccdd32880
3 changed files with 32 additions and 33 deletions

View File

@@ -1695,7 +1695,7 @@ public class PackageParser {
}
// Check to see if overlay should be excluded based on system property condition
if (!checkRequiredSystemProperty(requiredSystemPropertyName,
if (!checkRequiredSystemProperties(requiredSystemPropertyName,
requiredSystemPropertyValue)) {
Slog.i(TAG, "Skipping target and overlay pair " + targetPackage + " and "
+ codePath + ": overlay ignored due to required system property: "
@@ -1997,7 +1997,7 @@ public class PackageParser {
}
// check to see if overlay should be excluded based on system property condition
if (!checkRequiredSystemProperty(propName, propValue)) {
if (!checkRequiredSystemProperties(propName, propValue)) {
Slog.i(TAG, "Skipping target and overlay pair " + pkg.mOverlayTarget + " and "
+ pkg.baseCodePath+ ": overlay ignored due to required system property: "
+ propName + " with value: " + propValue);
@@ -2427,24 +2427,42 @@ public class PackageParser {
/**
* Returns {@code true} if both the property name and value are empty or if the given system
* property is set to the specified value. In all other cases, returns {@code false}
* property is set to the specified value. Properties can be one or more, and if properties are
* more than one, they must be separated by comma, and count of names and values must be equal,
* and also every given system property must be set to the corresponding value.
* In all other cases, returns {@code false}
*/
public static boolean checkRequiredSystemProperty(String propName, String propValue) {
if (TextUtils.isEmpty(propName) || TextUtils.isEmpty(propValue)) {
if (!TextUtils.isEmpty(propName) || !TextUtils.isEmpty(propValue)) {
public static boolean checkRequiredSystemProperties(@Nullable String rawPropNames,
@Nullable String rawPropValues) {
if (TextUtils.isEmpty(rawPropNames) || TextUtils.isEmpty(rawPropValues)) {
if (!TextUtils.isEmpty(rawPropNames) || !TextUtils.isEmpty(rawPropValues)) {
// malformed condition - incomplete
Slog.w(TAG, "Disabling overlay - incomplete property :'" + propName
+ "=" + propValue + "' - require both requiredSystemPropertyName"
+ " AND requiredSystemPropertyValue to be specified.");
Slog.w(TAG, "Disabling overlay - incomplete property :'" + rawPropNames
+ "=" + rawPropValues + "' - require both requiredSystemPropertyName"
+ " AND requiredSystemPropertyValue to be specified.");
return false;
}
// no valid condition set - so no exclusion criteria, overlay will be included.
return true;
}
// check property value - make sure it is both set and equal to expected value
final String currValue = SystemProperties.get(propName);
return (currValue != null && currValue.equals(propValue));
final String[] propNames = rawPropNames.split(",");
final String[] propValues = rawPropValues.split(",");
if (propNames.length != propValues.length) {
Slog.w(TAG, "Disabling overlay - property :'" + rawPropNames
+ "=" + rawPropValues + "' - require both requiredSystemPropertyName"
+ " AND requiredSystemPropertyValue lists to have the same size.");
return false;
}
for (int i = 0; i < propNames.length; i++) {
// Check property value: make sure it is both set and equal to expected value
final String currValue = SystemProperties.get(propNames[i]);
if (!TextUtils.equals(currValue, propValues[i])) {
return false;
}
}
return true;
}
/**

View File

@@ -413,7 +413,7 @@ public class ApkLiteParseUtils {
}
// Check to see if overlay should be excluded based on system property condition
if (!PackageParser.checkRequiredSystemProperty(requiredSystemPropertyName,
if (!PackageParser.checkRequiredSystemProperties(requiredSystemPropertyName,
requiredSystemPropertyValue)) {
Slog.i(TAG, "Skipping target and overlay pair " + targetPackage + " and "
+ codePath + ": overlay ignored due to required system property: "

View File

@@ -84,7 +84,6 @@ import android.os.Build;
import android.os.Bundle;
import android.os.FileUtils;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.ext.SdkExtensions;
import android.text.TextUtils;
@@ -2348,7 +2347,7 @@ public class ParsingPackageUtils {
R.styleable.AndroidManifestResourceOverlay_requiredSystemPropertyName);
String propValue = sa.getString(
R.styleable.AndroidManifestResourceOverlay_requiredSystemPropertyValue);
if (!checkOverlayRequiredSystemProperty(propName, propValue)) {
if (!PackageParser.checkRequiredSystemProperties(propName, propValue)) {
Slog.i(TAG, "Skipping target and overlay pair " + target + " and "
+ pkg.getBaseCodePath()
+ ": overlay ignored due to required system property: "
@@ -2522,24 +2521,6 @@ public class ParsingPackageUtils {
}
}
private static boolean checkOverlayRequiredSystemProperty(String propName, String propValue) {
if (TextUtils.isEmpty(propName) || TextUtils.isEmpty(propValue)) {
if (!TextUtils.isEmpty(propName) || !TextUtils.isEmpty(propValue)) {
// malformed condition - incomplete
Slog.w(TAG, "Disabling overlay - incomplete property :'" + propName
+ "=" + propValue + "' - require both requiredSystemPropertyName"
+ " AND requiredSystemPropertyValue to be specified.");
return false;
}
// no valid condition set - so no exclusion criteria, overlay will be included.
return true;
}
// check property value - make sure it is both set and equal to expected value
final String currValue = SystemProperties.get(propName);
return (currValue != null && currValue.equals(propValue));
}
/**
* This is a pre-density application which will get scaled - instead of being pixel perfect.
* This type of application is not resizable.