summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson Chiu <chiuwinson@google.com> 2022-05-16 21:04:07 +0000
committer Winson Chiu <chiuwinson@google.com> 2022-05-16 21:33:53 +0000
commit1553b1791ac8d36640731e691a217efc0f56442b (patch)
treebb9faa36e465fa9231ee28254d6f9b11b60a099e
parenta47d028ed00a5d9ccb4c914d91c60ef9d7a9014c (diff)
Coerce component metadata Bundle to null if empty
Maintains backwards compatibilty where if no meta-data tags were declared, null is returned. Bug: 231270984 Test: atest PackageParserTest#testNoComponentMetadataIsCoercedToNullForInfoObject Change-Id: I732fa3a16c80d02577dfb62887ae44c4ae7b4094
-rw-r--r--services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java24
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java35
2 files changed, 53 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java
index 91d201096fcd..b7fde436c8ea 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java
@@ -546,7 +546,9 @@ public class PackageInfoWithoutStateUtils {
ai.windowLayout = a.getWindowLayout();
ai.attributionTags = a.getAttributionTags();
if ((flags & PackageManager.GET_META_DATA) != 0) {
- ai.metaData = a.getMetaData();
+ var metaData = a.getMetaData();
+ // Backwards compatibility, coerce to null if empty
+ ai.metaData = metaData.isEmpty() ? null : metaData;
}
ai.applicationInfo = applicationInfo;
ai.setKnownActivityEmbeddingCerts(a.getKnownActivityEmbeddingCerts());
@@ -599,7 +601,9 @@ public class PackageInfoWithoutStateUtils {
si.mForegroundServiceType = s.getForegroundServiceType();
si.applicationInfo = applicationInfo;
if ((flags & PackageManager.GET_META_DATA) != 0) {
- si.metaData = s.getMetaData();
+ var metaData = s.getMetaData();
+ // Backwards compatibility, coerce to null if empty
+ si.metaData = metaData.isEmpty() ? null : metaData;
}
return si;
}
@@ -660,7 +664,9 @@ public class PackageInfoWithoutStateUtils {
pi.uriPermissionPatterns = null;
}
if ((flags & PackageManager.GET_META_DATA) != 0) {
- pi.metaData = p.getMetaData();
+ var metaData = p.getMetaData();
+ // Backwards compatibility, coerce to null if empty
+ pi.metaData = metaData.isEmpty() ? null : metaData;
}
pi.applicationInfo = applicationInfo;
return pi;
@@ -706,7 +712,9 @@ public class PackageInfoWithoutStateUtils {
if ((flags & PackageManager.GET_META_DATA) == 0) {
return ii;
}
- ii.metaData = i.getMetaData();
+ var metaData = i.getMetaData();
+ // Backwards compatibility, coerce to null if empty
+ ii.metaData = metaData.isEmpty() ? null : metaData;
return ii;
}
@@ -729,7 +737,9 @@ public class PackageInfoWithoutStateUtils {
if ((flags & PackageManager.GET_META_DATA) == 0) {
return pi;
}
- pi.metaData = p.getMetaData();
+ var metaData = p.getMetaData();
+ // Backwards compatibility, coerce to null if empty
+ pi.metaData = metaData.isEmpty() ? null : metaData;
return pi;
}
@@ -753,7 +763,9 @@ public class PackageInfoWithoutStateUtils {
if ((flags & PackageManager.GET_META_DATA) == 0) {
return pgi;
}
- pgi.metaData = pg.getMetaData();
+ var metaData = pg.getMetaData();
+ // Backwards compatibility, coerce to null if empty
+ pgi.metaData = metaData.isEmpty() ? null : metaData;
return pgi;
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index 952200d02de8..2fd7853971fe 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -65,6 +66,7 @@ import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import com.android.server.pm.parsing.pkg.PackageImpl;
import com.android.server.pm.parsing.pkg.ParsedPackage;
import com.android.server.pm.permission.CompatibilityPermissionInfo;
+import com.android.server.pm.pkg.PackageUserState;
import com.android.server.pm.pkg.PackageUserStateInternal;
import com.android.server.pm.pkg.component.ParsedActivity;
import com.android.server.pm.pkg.component.ParsedActivityImpl;
@@ -85,6 +87,7 @@ import com.android.server.pm.pkg.component.ParsedService;
import com.android.server.pm.pkg.component.ParsedServiceImpl;
import com.android.server.pm.pkg.component.ParsedUsesPermission;
import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl;
+import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
import com.android.server.pm.pkg.parsing.ParsingPackage;
import org.junit.Before;
@@ -596,6 +599,38 @@ public class PackageParserTest {
}
}
+ @Test
+ public void testNoComponentMetadataIsCoercedToNullForInfoObject() throws Exception {
+ final File testFile = extractFile(TEST_APP4_APK);
+ try {
+ final ParsedPackage pkg = new TestPackageParser2().parsePackage(testFile, 0, false);
+ ApplicationInfo appInfo = PackageInfoWithoutStateUtils.generateApplicationInfo(pkg, 0,
+ PackageUserState.DEFAULT, 0);
+ for (ParsedActivity activity : pkg.getActivities()) {
+ assertNotNull(activity.getMetaData());
+ assertNull(PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(activity, 0,
+ appInfo).metaData);
+ }
+ for (ParsedProvider provider : pkg.getProviders()) {
+ assertNotNull(provider.getMetaData());
+ assertNull(PackageInfoWithoutStateUtils.generateProviderInfoUnchecked(provider, 0,
+ appInfo).metaData);
+ }
+ for (ParsedActivity receiver : pkg.getReceivers()) {
+ assertNotNull(receiver.getMetaData());
+ assertNull(PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(receiver, 0,
+ appInfo).metaData);
+ }
+ for (ParsedService service : pkg.getServices()) {
+ assertNotNull(service.getMetaData());
+ assertNull(PackageInfoWithoutStateUtils.generateServiceInfoUnchecked(service, 0,
+ appInfo).metaData);
+ }
+ } finally {
+ testFile.delete();
+ }
+ }
+
/**
* A trivial subclass of package parser that only caches the package name, and throws away
* all other information.