summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWinson Chiu <chiuwinson@google.com>2020-03-03 18:06:37 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-03-03 18:06:37 +0000
commitf5f588e03254b21682d59a02d0f231adc39df08f (patch)
treef24485cee33e91ef63c438ef704c6849239163e2
parent5083ad7e2a30f6a7bcb14a28dc11408a05937af1 (diff)
parentdec01d61300d530e69a6840c7def7be3a6956a37 (diff)
Merge changes I815bb92e,I1777f84c into rvc-dev
* changes: Adjust AndroidPackage String interning Add package parsing v1 vs v2 benchmark
-rw-r--r--apct-tests/perftests/core/Android.bp34
-rw-r--r--apct-tests/perftests/core/Android.mk33
-rw-r--r--apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt250
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageImpl.java379
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedActivity.java16
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedComponent.java10
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedInstrumentation.java11
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedMainComponent.java7
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedPermission.java7
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedProvider.java15
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedService.java7
-rw-r--r--core/java/com/android/internal/util/Parcelling.java27
-rw-r--r--services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java40
13 files changed, 542 insertions, 294 deletions
diff --git a/apct-tests/perftests/core/Android.bp b/apct-tests/perftests/core/Android.bp
new file mode 100644
index 000000000000..984893a25605
--- /dev/null
+++ b/apct-tests/perftests/core/Android.bp
@@ -0,0 +1,34 @@
+android_test {
+ name: "CorePerfTests",
+
+ resource_dirs: ["res"],
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ "src/android/os/ISomeService.aidl",
+ ],
+
+ static_libs: [
+ "androidx.appcompat_appcompat",
+ "androidx.test.rules",
+ "androidx.annotation_annotation",
+ "apct-perftests-overlay-apps",
+ "apct-perftests-resources-manager-apps",
+ "apct-perftests-utils",
+ "guava",
+ ],
+
+ libs: ["android.test.base"],
+
+ platform_apis: true,
+
+ jni_libs: ["libperftestscore_jni"],
+
+ // Use google-fonts/dancing-script for the performance metrics
+ // ANDROIDMK TRANSLATION ERROR: Only $(LOCAL_PATH)/.. values are allowed
+ // LOCAL_ASSET_DIR := $(TOP)/external/google-fonts/dancing-script
+
+ test_suites: ["device-tests"],
+ certificate: "platform",
+
+}
diff --git a/apct-tests/perftests/core/Android.mk b/apct-tests/perftests/core/Android.mk
deleted file mode 100644
index 968478c3f338..000000000000
--- a/apct-tests/perftests/core/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, src) \
- src/android/os/ISomeService.aidl
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- androidx.appcompat_appcompat \
- androidx.test.rules \
- androidx.annotation_annotation \
- apct-perftests-overlay-apps \
- apct-perftests-resources-manager-apps \
- apct-perftests-utils \
- guava
-
-LOCAL_JAVA_LIBRARIES := android.test.base
-
-LOCAL_PACKAGE_NAME := CorePerfTests
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_JNI_SHARED_LIBRARIES := libperftestscore_jni
-
-# Use google-fonts/dancing-script for the performance metrics
-LOCAL_ASSET_DIR := $(TOP)/external/google-fonts/dancing-script
-
-LOCAL_COMPATIBILITY_SUITE += device-tests
-LOCAL_CERTIFICATE := platform
-
-include $(BUILD_PACKAGE) \ No newline at end of file
diff --git a/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
new file mode 100644
index 000000000000..9e463652d0b6
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os
+
+import android.content.pm.PackageParser
+import android.content.pm.PackageParserCacheHelper.ReadHelper
+import android.content.pm.PackageParserCacheHelper.WriteHelper
+import android.content.pm.parsing.ParsingPackageImpl
+import android.content.pm.parsing.ParsingPackageRead
+import android.content.pm.parsing.ParsingPackageUtils
+import android.content.pm.parsing.result.ParseTypeImpl
+import android.content.res.TypedArray
+import android.perftests.utils.BenchmarkState
+import android.perftests.utils.PerfStatusReporter
+import androidx.test.filters.LargeTest
+import com.android.internal.util.ConcurrentUtils
+import libcore.io.IoUtils
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import java.io.File
+import java.io.FileOutputStream
+import java.util.concurrent.ArrayBlockingQueue
+import java.util.concurrent.TimeUnit
+
+@LargeTest
+@RunWith(Parameterized::class)
+class PackageParsingPerfTest {
+
+ companion object {
+ private const val PARALLEL_QUEUE_CAPACITY = 10
+ private const val PARALLEL_MAX_THREADS = 4
+
+ private const val QUEUE_POLL_TIMEOUT_SECONDS = 5L
+
+ // TODO: Replace this with core version of SYSTEM_PARTITIONS
+ val FOLDERS_TO_TEST = listOf(
+ Environment.getRootDirectory(),
+ Environment.getVendorDirectory(),
+ Environment.getOdmDirectory(),
+ Environment.getOemDirectory(),
+ Environment.getOemDirectory(),
+ Environment.getSystemExtDirectory()
+ )
+
+ @JvmStatic
+ @Parameterized.Parameters(name = "{0}")
+ fun parameters(): Array<Params> {
+ val apks = FOLDERS_TO_TEST
+ .filter(File::exists)
+ .map(File::walkTopDown)
+ .flatMap(Sequence<File>::asIterable)
+ .filter { it.name.endsWith(".apk") }
+
+ return arrayOf(
+ Params(1, apks) { ParallelParser1(it?.let(::PackageCacher1)) },
+ Params(2, apks) { ParallelParser2(it?.let(::PackageCacher2)) }
+ )
+ }
+
+ data class Params(
+ val version: Int,
+ val apks: List<File>,
+ val cacheDirToParser: (File?) -> ParallelParser<*>
+ ) {
+ // For test name formatting
+ override fun toString() = "v$version"
+ }
+ }
+
+ @get:Rule
+ var perfStatusReporter = PerfStatusReporter()
+
+ @get:Rule
+ var testFolder = TemporaryFolder()
+
+ @Parameterized.Parameter(0)
+ lateinit var params: Params
+
+ private val state: BenchmarkState get() = perfStatusReporter.benchmarkState
+ private val apks: List<File> get() = params.apks
+
+ @Test
+ fun sequentialNoCache() {
+ params.cacheDirToParser(null).use { parser ->
+ while (state.keepRunning()) {
+ apks.forEach { parser.parse(it) }
+ }
+ }
+ }
+
+ @Test
+ fun sequentialCached() {
+ params.cacheDirToParser(testFolder.newFolder()).use { parser ->
+ // Fill the cache
+ apks.forEach { parser.parse(it) }
+
+ while (state.keepRunning()) {
+ apks.forEach { parser.parse(it) }
+ }
+ }
+ }
+
+ @Test
+ fun parallelNoCache() {
+ params.cacheDirToParser(null).use { parser ->
+ while (state.keepRunning()) {
+ apks.forEach { parser.submit(it) }
+ repeat(apks.size) { parser.take() }
+ }
+ }
+ }
+
+ @Test
+ fun parallelCached() {
+ params.cacheDirToParser(testFolder.newFolder()).use { parser ->
+ // Fill the cache
+ apks.forEach { parser.parse(it) }
+
+ while (state.keepRunning()) {
+ apks.forEach { parser.submit(it) }
+ repeat(apks.size) { parser.take() }
+ }
+ }
+ }
+
+ abstract class ParallelParser<PackageType : Parcelable>(
+ private val cacher: PackageCacher<PackageType>? = null
+ ) : AutoCloseable {
+ private val queue = ArrayBlockingQueue<Any>(PARALLEL_QUEUE_CAPACITY)
+ private val service = ConcurrentUtils.newFixedThreadPool(
+ PARALLEL_MAX_THREADS, "package-parsing-test",
+ Process.THREAD_PRIORITY_FOREGROUND)
+
+ fun submit(file: File) = service.submit { queue.put(parse(file)) }
+
+ fun take() = queue.poll(QUEUE_POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS)
+
+ override fun close() {
+ service.shutdownNow()
+ }
+
+ fun parse(file: File) = cacher?.getCachedResult(file)
+ ?: parseImpl(file).also { cacher?.cacheResult(file, it) }
+
+ protected abstract fun parseImpl(file: File): PackageType
+ }
+
+ class ParallelParser1(private val cacher: PackageCacher1? = null)
+ : ParallelParser<PackageParser.Package>(cacher) {
+ val parser = PackageParser().apply {
+ setCallback { true }
+ }
+
+ override fun parseImpl(file: File) = parser.parsePackage(file, 0, cacher != null)
+ }
+
+ class ParallelParser2(cacher: PackageCacher2? = null)
+ : ParallelParser<ParsingPackageRead>(cacher) {
+ val input = ThreadLocal.withInitial { ParseTypeImpl() }
+ val parser = ParsingPackageUtils(false, null, null,
+ object : ParsingPackageUtils.Callback {
+ override fun hasFeature(feature: String) = true
+
+ override fun startParsingPackage(
+ packageName: String,
+ baseCodePath: String,
+ codePath: String,
+ manifestArray: TypedArray,
+ isCoreApp: Boolean
+ ) = ParsingPackageImpl(packageName, baseCodePath, codePath, manifestArray)
+ })
+
+ override fun parseImpl(file: File) =
+ parser.parsePackage(input.get()!!.reset(), file, 0).result
+ }
+
+ abstract class PackageCacher<PackageType : Parcelable>(private val cacheDir: File) {
+
+ fun getCachedResult(file: File): PackageType? {
+ val cacheFile = File(cacheDir, file.name)
+ if (!cacheFile.exists()) {
+ return null
+ }
+
+ val bytes = IoUtils.readFileAsByteArray(cacheFile.absolutePath)
+ val parcel = Parcel.obtain().apply {
+ unmarshall(bytes, 0, bytes.size)
+ setDataPosition(0)
+ }
+ ReadHelper(parcel).apply { startAndInstall() }
+ return fromParcel(parcel).also {
+ parcel.recycle()
+ }
+ }
+
+ fun cacheResult(file: File, parsed: Parcelable) {
+ val cacheFile = File(cacheDir, file.name)
+ if (cacheFile.exists()) {
+ if (!cacheFile.delete()) {
+ throw IllegalStateException("Unable to delete cache file: $cacheFile")
+ }
+ }
+ val cacheEntry = toCacheEntry(parsed)
+ return FileOutputStream(cacheFile).use { fos -> fos.write(cacheEntry) }
+ }
+
+ private fun toCacheEntry(pkg: Parcelable): ByteArray {
+ val parcel = Parcel.obtain()
+ val helper = WriteHelper(parcel)
+ pkg.writeToParcel(parcel, 0 /* flags */)
+ helper.finishAndUninstall()
+ return parcel.marshall().also {
+ parcel.recycle()
+ }
+ }
+
+ protected abstract fun fromParcel(parcel: Parcel): PackageType
+ }
+
+ /**
+ * Re-implementation of v1's cache, since that's gone in R+.
+ */
+ class PackageCacher1(cacheDir: File) : PackageCacher<PackageParser.Package>(cacheDir) {
+ override fun fromParcel(parcel: Parcel) = PackageParser.Package(parcel)
+ }
+
+ /**
+ * Re-implementation of the server side PackageCacher, as it's inaccessible here.
+ */
+ class PackageCacher2(cacheDir: File) : PackageCacher<ParsingPackageRead>(cacheDir) {
+ override fun fromParcel(parcel: Parcel) = ParsingPackageImpl(parcel)
+ }
+}
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index c3eea2b2de86..a9b72d041f8b 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -64,6 +64,7 @@ import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringArray;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringList;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringSet;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringValueMap;
+import com.android.internal.util.Parcelling.BuiltIn.ForStringSet;
import java.security.PublicKey;
import java.util.Collections;
@@ -87,16 +88,15 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
private static final String TAG = "PackageImpl";
public static ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(ForBoolean.class);
- public static ForInternedString sForString = Parcelling.Cache.getOrCreate(
+ public static ForInternedString sForInternedString = Parcelling.Cache.getOrCreate(
ForInternedString.class);
- public static ForInternedStringArray sForStringArray = Parcelling.Cache.getOrCreate(
+ public static ForInternedStringArray sForInternedStringArray = Parcelling.Cache.getOrCreate(
ForInternedStringArray.class);
- public static ForInternedStringList sForStringList = Parcelling.Cache.getOrCreate(
+ public static ForInternedStringList sForInternedStringList = Parcelling.Cache.getOrCreate(
ForInternedStringList.class);
- public static ForInternedStringValueMap sForStringValueMap = Parcelling.Cache.getOrCreate(
- ForInternedStringValueMap.class);
- public static ForInternedStringSet sForStringSet = Parcelling.Cache.getOrCreate(
- ForInternedStringSet.class);
+ public static ForInternedStringValueMap sForInternedStringValueMap =
+ Parcelling.Cache.getOrCreate(ForInternedStringValueMap.class);
+ public static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class);
protected static ParsedIntentInfo.StringPairListParceler sForIntentInfoPairs =
Parcelling.Cache.getOrCreate(ParsedIntentInfo.StringPairListParceler.class);
@@ -414,8 +414,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
public ParsingPackageImpl(@NonNull String packageName, @NonNull String baseCodePath,
@NonNull String codePath, @Nullable TypedArray manifestArray) {
this.packageName = TextUtils.safeIntern(packageName);
- this.baseCodePath = TextUtils.safeIntern(baseCodePath);
- this.codePath = TextUtils.safeIntern(codePath);
+ this.baseCodePath = baseCodePath;
+ this.codePath = codePath;
if (manifestArray != null) {
versionCode = manifestArray.getInteger(R.styleable.AndroidManifest_versionCode, 0);
@@ -496,18 +496,6 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl setVersionName(String versionName) {
- this.versionName = TextUtils.safeIntern(versionName);
- return this;
- }
-
- @Override
- public ParsingPackage setCompileSdkVersionCodename(String compileSdkVersionCodename) {
- this.compileSdkVersionCodeName = TextUtils.safeIntern(compileSdkVersionCodename);
- return this;
- }
-
- @Override
public Object hideAsParsed() {
// There is no equivalent for core-only parsing
throw new UnsupportedOperationException();
@@ -548,15 +536,14 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
@Override
public ParsingPackageImpl addOriginalPackage(String originalPackage) {
- this.originalPackages = CollectionUtils.add(this.originalPackages,
- TextUtils.safeIntern(originalPackage));
+ this.originalPackages = CollectionUtils.add(this.originalPackages, originalPackage);
return this;
}
@Override
public ParsingPackage addOverlayable(String overlayableName, String actorName) {
- this.overlayables = CollectionUtils.add(this.overlayables,
- TextUtils.safeIntern(overlayableName), TextUtils.safeIntern(actorName));
+ this.overlayables = CollectionUtils.add(this.overlayables, overlayableName,
+ TextUtils.safeIntern(actorName));
return this;
}
@@ -710,8 +697,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
@Override
public ParsingPackageImpl addQueriesProvider(String authority) {
- this.queriesProviders = CollectionUtils.add(this.queriesProviders,
- TextUtils.safeIntern(authority));
+ this.queriesProviders = CollectionUtils.add(this.queriesProviders, authority);
return this;
}
@@ -776,20 +762,9 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl asSplit(
- String[] splitNames,
- String[] splitCodePaths,
- int[] splitRevisionCodes,
- SparseArray<int[]> splitDependencies
- ) {
+ public ParsingPackageImpl asSplit(String[] splitNames, String[] splitCodePaths,
+ int[] splitRevisionCodes, SparseArray<int[]> splitDependencies) {
this.splitNames = splitNames;
-
- if (this.splitNames != null) {
- for (int index = 0; index < this.splitNames.length; index++) {
- splitNames[index] = TextUtils.safeIntern(splitNames[index]);
- }
- }
-
this.splitCodePaths = splitCodePaths;
this.splitRevisionCodes = splitRevisionCodes;
this.splitDependencies = splitDependencies;
@@ -815,26 +790,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl setProcessName(String processName) {
- this.processName = TextUtils.safeIntern(processName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setRealPackage(@Nullable String realPackage) {
- this.realPackage = TextUtils.safeIntern(realPackage);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) {
- this.restrictedAccountType = TextUtils.safeIntern(restrictedAccountType);
- return this;
- }
-
- @Override
public ParsingPackageImpl setRequiredAccountType(@Nullable String requiredAccountType) {
- this.requiredAccountType = TextUtils.nullIfEmpty(TextUtils.safeIntern(requiredAccountType));
+ this.requiredAccountType = TextUtils.nullIfEmpty(requiredAccountType);
return this;
}
@@ -845,72 +802,12 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
}
@Override
- public ParsingPackageImpl setOverlayTargetName(@Nullable String overlayTargetName) {
- this.overlayTargetName = TextUtils.safeIntern(overlayTargetName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setOverlayCategory(@Nullable String overlayCategory) {
- this.overlayCategory = TextUtils.safeIntern(overlayCategory);
- return this;
- }
-
- @Override
public ParsingPackageImpl setVolumeUuid(@Nullable String volumeUuid) {
this.volumeUuid = TextUtils.safeIntern(volumeUuid);
return this;
}
@Override
- public ParsingPackageImpl setAppComponentFactory(@Nullable String appComponentFactory) {
- this.appComponentFactory = TextUtils.safeIntern(appComponentFactory);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setBackupAgentName(@Nullable String backupAgentName) {
- this.backupAgentName = TextUtils.safeIntern(backupAgentName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setClassLoaderName(@Nullable String classLoaderName) {
- this.classLoaderName = TextUtils.safeIntern(classLoaderName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setClassName(@Nullable String className) {
- this.className = TextUtils.safeIntern(className);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) {
- this.manageSpaceActivityName = TextUtils.safeIntern(manageSpaceActivityName);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setPermission(@Nullable String permission) {
- this.permission = TextUtils.safeIntern(permission);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setTaskAffinity(@Nullable String taskAffinity) {
- this.taskAffinity = TextUtils.safeIntern(taskAffinity);
- return this;
- }
-
- @Override
- public ParsingPackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) {
- this.zygotePreloadName = TextUtils.safeIntern(zygotePreloadName);
- return this;
- }
-
- @Override
public ParsingPackageImpl setStaticSharedLibName(String staticSharedLibName) {
this.staticSharedLibName = TextUtils.safeIntern(staticSharedLibName);
return this;
@@ -1044,27 +941,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
dest.writeInt(this.versionCode);
dest.writeInt(this.versionCodeMajor);
dest.writeInt(this.baseRevisionCode);
- sForString.parcel(this.versionName, dest, flags);
+ sForInternedString.parcel(this.versionName, dest, flags);
dest.writeInt(this.compileSdkVersion);
- sForString.parcel(this.compileSdkVersionCodeName, dest, flags);
- sForString.parcel(this.packageName, dest, flags);
- sForString.parcel(this.realPackage, dest, flags);
- sForString.parcel(this.baseCodePath, dest, flags);
+ dest.writeString(this.compileSdkVersionCodeName);
+ sForInternedString.parcel(this.packageName, dest, flags);
+ dest.writeString(this.realPackage);
+ dest.writeString(this.baseCodePath);
dest.writeBoolean(this.requiredForAllUsers);
- sForString.parcel(this.restrictedAccountType, dest, flags);
- sForString.parcel(this.requiredAccountType, dest, flags);
- sForString.parcel(this.overlayTarget, dest, flags);
- sForString.parcel(this.overlayTargetName, dest, flags);
- sForString.parcel(this.overlayCategory, dest, flags);
+ dest.writeString(this.restrictedAccountType);
+ dest.writeString(this.requiredAccountType);
+ sForInternedString.parcel(this.overlayTarget, dest, flags);
+ dest.writeString(this.overlayTargetName);
+ dest.writeString(this.overlayCategory);
dest.writeInt(this.overlayPriority);
dest.writeBoolean(this.overlayIsStatic);
- sForStringValueMap.parcel(this.overlayables, dest, flags);
- sForString.parcel(this.staticSharedLibName, dest, flags);
+ sForInternedStringValueMap.parcel(this.overlayables, dest, flags);
+ sForInternedString.parcel(this.staticSharedLibName, dest, flags);
dest.writeLong(this.staticSharedLibVersion);
- sForStringList.parcel(this.libraryNames, dest, flags);
- sForStringList.parcel(this.usesLibraries, dest, flags);
- sForStringList.parcel(this.usesOptionalLibraries, dest, flags);
- sForStringList.parcel(this.usesStaticLibraries, dest, flags);
+ sForInternedStringList.parcel(this.libraryNames, dest, flags);
+ sForInternedStringList.parcel(this.usesLibraries, dest, flags);
+ sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags);
+ sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags);
dest.writeLongArray(this.usesStaticLibrariesVersions);
if (this.usesStaticLibrariesCertDigests == null) {
@@ -1072,23 +969,23 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
} else {
dest.writeInt(this.usesStaticLibrariesCertDigests.length);
for (int index = 0; index < this.usesStaticLibrariesCertDigests.length; index++) {
- sForStringArray.parcel(this.usesStaticLibrariesCertDigests[index], dest, flags);
+ dest.writeStringArray(this.usesStaticLibrariesCertDigests[index]);
}
}
- sForString.parcel(this.sharedUserId, dest, flags);
+ sForInternedString.parcel(this.sharedUserId, dest, flags);
dest.writeInt(this.sharedUserLabel);
dest.writeTypedList(this.configPreferences);
dest.writeTypedList(this.reqFeatures);
dest.writeTypedList(this.featureGroups);
dest.writeByteArray(this.restrictUpdateHash);
- sForStringList.parcel(this.originalPackages, dest, flags);
- sForStringList.parcel(this.adoptPermissions, dest, flags);
- sForStringList.parcel(this.requestedPermissions, dest, flags);
- sForStringList.parcel(this.implicitPermissions, dest, flags);
+ dest.writeStringList(this.originalPackages);
+ sForInternedStringList.parcel(this.adoptPermissions, dest, flags);
+ sForInternedStringList.parcel(this.requestedPermissions, dest, flags);
+ sForInternedStringList.parcel(this.implicitPermissions, dest, flags);
sForStringSet.parcel(this.upgradeKeySets, dest, flags);
dest.writeMap(this.keySetMapping);
- sForStringList.parcel(this.protectedBroadcasts, dest, flags);
+ sForInternedStringList.parcel(this.protectedBroadcasts, dest, flags);
dest.writeTypedList(this.activities);
dest.writeTypedList(this.receivers);
dest.writeTypedList(this.services);
@@ -1100,20 +997,20 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
sForIntentInfoPairs.parcel(this.preferredActivityFilters, dest, flags);
dest.writeMap(this.processes);
dest.writeBundle(this.metaData);
- sForString.parcel(this.volumeUuid, dest, flags);
+ sForInternedString.parcel(this.volumeUuid, dest, flags);
dest.writeParcelable(this.signingDetails, flags);
- sForString.parcel(this.codePath, dest, flags);
+ dest.writeString(this.codePath);
dest.writeBoolean(this.use32BitAbi);
dest.writeBoolean(this.visibleToInstantApps);
dest.writeBoolean(this.forceQueryable);
dest.writeParcelableList(this.queriesIntents, flags);
- sForStringList.parcel(this.queriesPackages, dest, flags);
- sForString.parcel(this.appComponentFactory, dest, flags);
- sForString.parcel(this.backupAgentName, dest, flags);
+ sForInternedStringList.parcel(this.queriesPackages, dest, flags);
+ dest.writeString(this.appComponentFactory);
+ dest.writeString(this.backupAgentName);
dest.writeInt(this.banner);
dest.writeInt(this.category);
- sForString.parcel(this.classLoaderName, dest, flags);
- sForString.parcel(this.className, dest, flags);
+ dest.writeString(this.classLoaderName);
+ dest.writeString(this.className);
dest.writeInt(this.compatibleWidthLimitDp);
dest.writeInt(this.descriptionRes);
dest.writeBoolean(this.enabled);
@@ -1124,27 +1021,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
dest.writeInt(this.labelRes);
dest.writeInt(this.largestWidthLimitDp);
dest.writeInt(this.logo);
- sForString.parcel(this.manageSpaceActivityName, dest, flags);
+ dest.writeString(this.manageSpaceActivityName);
dest.writeFloat(this.maxAspectRatio);
dest.writeFloat(this.minAspectRatio);
dest.writeInt(this.minSdkVersion);
dest.writeInt(this.networkSecurityConfigRes);
dest.writeCharSequence(this.nonLocalizedLabel);
- sForString.parcel(this.permission, dest, flags);
- sForString.parcel(this.processName, dest, flags);
+ dest.writeString(this.permission);
+ dest.writeString(this.processName);
dest.writeInt(this.requiresSmallestWidthDp);
dest.writeInt(this.roundIconRes);
dest.writeInt(this.targetSandboxVersion);
dest.writeInt(this.targetSdkVersion);
- sForString.parcel(this.taskAffinity, dest, flags);
+ dest.writeString(this.taskAffinity);
dest.writeInt(this.theme);
dest.writeInt(this.uiOptions);
- sForString.parcel(this.zygotePreloadName, dest, flags);
- sForStringArray.parcel(this.splitClassLoaderNames, dest, flags);
- sForStringArray.parcel(this.splitCodePaths, dest, flags);
+ dest.writeString(this.zygotePreloadName);
+ dest.writeStringArray(this.splitClassLoaderNames);
+ dest.writeStringArray(this.splitCodePaths);
dest.writeSparseArray(this.splitDependencies);
dest.writeIntArray(this.splitFlags);
- sForStringArray.parcel(this.splitNames, dest, flags);
+ dest.writeStringArray(this.splitNames);
dest.writeIntArray(this.splitRevisionCodes);
dest.writeBoolean(this.externalStorage);
@@ -1203,50 +1100,51 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.versionCode = in.readInt();
this.versionCodeMajor = in.readInt();
this.baseRevisionCode = in.readInt();
- this.versionName = sForString.unparcel(in);
+ this.versionName = sForInternedString.unparcel(in);
this.compileSdkVersion = in.readInt();
- this.compileSdkVersionCodeName = sForString.unparcel(in);
- this.packageName = sForString.unparcel(in);
- this.realPackage = sForString.unparcel(in);
- this.baseCodePath = sForString.unparcel(in);
+ this.compileSdkVersionCodeName = in.readString();
+ this.packageName = sForInternedString.unparcel(in);
+ this.realPackage = in.readString();
+ this.baseCodePath = in.readString();
this.requiredForAllUsers = in.readBoolean();
- this.restrictedAccountType = sForString.unparcel(in);
- this.requiredAccountType = sForString.unparcel(in);
- this.overlayTarget = sForString.unparcel(in);
- this.overlayTargetName = sForString.unparcel(in);
- this.overlayCategory = sForString.unparcel(in);
+ this.restrictedAccountType = in.readString();
+ this.requiredAccountType = in.readString();
+ this.overlayTarget = sForInternedString.unparcel(in);
+ this.overlayTargetName = in.readString();
+ this.overlayCategory = in.readString();
this.overlayPriority = in.readInt();
this.overlayIsStatic = in.readBoolean();
- this.overlayables = sForStringValueMap.unparcel(in);
- this.staticSharedLibName = sForString.unparcel(in);
+ this.overlayables = sForInternedStringValueMap.unparcel(in);
+ this.staticSharedLibName = sForInternedString.unparcel(in);
this.staticSharedLibVersion = in.readLong();
- this.libraryNames = sForStringList.unparcel(in);
- this.usesLibraries = sForStringList.unparcel(in);
- this.usesOptionalLibraries = sForStringList.unparcel(in);
- this.usesStaticLibraries = sForStringList.unparcel(in);
+ this.libraryNames = sForInternedStringList.unparcel(in);
+ this.usesLibraries = sForInternedStringList.unparcel(in);
+ this.usesOptionalLibraries = sForInternedStringList.unparcel(in);
+ this.usesStaticLibraries = sForInternedStringList.unparcel(in);
this.usesStaticLibrariesVersions = in.createLongArray();
int digestsSize = in.readInt();
if (digestsSize >= 0) {
this.usesStaticLibrariesCertDigests = new String[digestsSize][];
for (int index = 0; index < digestsSize; index++) {
- this.usesStaticLibrariesCertDigests[index] = sForStringArray.unparcel(in);
+ this.usesStaticLibrariesCertDigests[index] = sForInternedStringArray.unparcel(in);
}
}
- this.sharedUserId = sForString.unparcel(in);
+ this.sharedUserId = sForInternedString.unparcel(in);
this.sharedUserLabel = in.readInt();
this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR);
this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR);
this.featureGroups = in.createTypedArrayList(FeatureGroupInfo.CREATOR);
this.restrictUpdateHash = in.createByteArray();
- this.originalPackages = sForStringList.unparcel(in);
- this.adoptPermissions = sForStringList.unparcel(in);
- this.requestedPermissions = sForStringList.unparcel(in);
- this.implicitPermissions = sForStringList.unparcel(in);
+ this.originalPackages = in.createStringArrayList();
+ this.adoptPermissions = sForInternedStringList.unparcel(in);
+ this.requestedPermissions = sForInternedStringList.unparcel(in);
+ this.implicitPermissions = sForInternedStringList.unparcel(in);
this.upgradeKeySets = sForStringSet.unparcel(in);
this.keySetMapping = in.readHashMap(boot);
- this.protectedBroadcasts = sForStringList.unparcel(in);
+ this.protectedBroadcasts = sForInternedStringList.unparcel(in);
+
this.activities = in.createTypedArrayList(ParsedActivity.CREATOR);
this.receivers = in.createTypedArrayList(ParsedActivity.CREATOR);
this.services = in.createTypedArrayList(ParsedService.CREATOR);
@@ -1258,20 +1156,20 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.preferredActivityFilters = sForIntentInfoPairs.unparcel(in);
this.processes = in.readHashMap(boot);
this.metaData = in.readBundle(boot);
- this.volumeUuid = sForString.unparcel(in);
+ this.volumeUuid = sForInternedString.unparcel(in);
this.signingDetails = in.readParcelable(boot);
- this.codePath = sForString.unparcel(in);
+ this.codePath = in.readString();
this.use32BitAbi = in.readBoolean();
this.visibleToInstantApps = in.readBoolean();
this.forceQueryable = in.readBoolean();
this.queriesIntents = in.createTypedArrayList(Intent.CREATOR);
- this.queriesPackages = sForStringList.unparcel(in);
- this.appComponentFactory = sForString.unparcel(in);
- this.backupAgentName = sForString.unparcel(in);
+ this.queriesPackages = sForInternedStringList.unparcel(in);
+ this.appComponentFactory = in.readString();
+ this.backupAgentName = in.readString();
this.banner = in.readInt();
this.category = in.readInt();
- this.classLoaderName = sForString.unparcel(in);
- this.className = sForString.unparcel(in);
+ this.classLoaderName = in.readString();
+ this.className = in.readString();
this.compatibleWidthLimitDp = in.readInt();
this.descriptionRes = in.readInt();
this.enabled = in.readBoolean();
@@ -1282,27 +1180,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.labelRes = in.readInt();
this.largestWidthLimitDp = in.readInt();
this.logo = in.readInt();
- this.manageSpaceActivityName = sForString.unparcel(in);
+ this.manageSpaceActivityName = in.readString();
this.maxAspectRatio = in.readFloat();
this.minAspectRatio = in.readFloat();
this.minSdkVersion = in.readInt();
this.networkSecurityConfigRes = in.readInt();
this.nonLocalizedLabel = in.readCharSequence();
- this.permission = sForString.unparcel(in);
- this.processName = sForString.unparcel(in);
+ this.permission = in.readString();
+ this.processName = in.readString();
this.requiresSmallestWidthDp = in.readInt();
this.roundIconRes = in.readInt();
this.targetSandboxVersion = in.readInt();
this.targetSdkVersion = in.readInt();
- this.taskAffinity = sForString.unparcel(in);
+ this.taskAffinity = in.readString();
this.theme = in.readInt();
this.uiOptions = in.readInt();
- this.zygotePreloadName = sForString.unparcel(in);
- this.splitClassLoaderNames = sForStringArray.unparcel(in);
- this.splitCodePaths = sForStringArray.unparcel(in);
+ this.zygotePreloadName = in.readString();
+ this.splitClassLoaderNames = in.createStringArray();
+ this.splitCodePaths = in.createStringArray();
this.splitDependencies = in.readSparseArray(boot);
this.splitFlags = in.createIntArray();
- this.splitNames = sForStringArray.unparcel(in);
+ this.splitNames = in.createStringArray();
this.splitRevisionCodes = in.createIntArray();
this.externalStorage = in.readBoolean();
this.baseHardwareAccelerated = in.readBoolean();
@@ -1323,7 +1221,6 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.multiArch = in.readBoolean();
this.extractNativeLibs = in.readBoolean();
this.game = in.readBoolean();
-
this.resizeableActivity = sForBoolean.unparcel(in);
this.staticSharedLibrary = in.readBoolean();
@@ -2581,4 +2478,94 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
preserveLegacyExternalStorage = value;
return this;
}
+
+ @Override
+ public ParsingPackageImpl setVersionName(String versionName) {
+ this.versionName = versionName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackage setCompileSdkVersionCodename(String compileSdkVersionCodename) {
+ this.compileSdkVersionCodeName = compileSdkVersionCodename;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setProcessName(String processName) {
+ this.processName = processName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setRealPackage(@Nullable String realPackage) {
+ this.realPackage = realPackage;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) {
+ this.restrictedAccountType = restrictedAccountType;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setOverlayTargetName(@Nullable String overlayTargetName) {
+ this.overlayTargetName = overlayTargetName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setOverlayCategory(@Nullable String overlayCategory) {
+ this.overlayCategory = overlayCategory;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setAppComponentFactory(@Nullable String appComponentFactory) {
+ this.appComponentFactory = appComponentFactory;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setBackupAgentName(@Nullable String backupAgentName) {
+ this.backupAgentName = backupAgentName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setClassLoaderName(@Nullable String classLoaderName) {
+ this.classLoaderName = classLoaderName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setClassName(@Nullable String className) {
+ this.className = className;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) {
+ this.manageSpaceActivityName = manageSpaceActivityName;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setPermission(@Nullable String permission) {
+ this.permission = permission;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setTaskAffinity(@Nullable String taskAffinity) {
+ this.taskAffinity = taskAffinity;
+ return this;
+ }
+
+ @Override
+ public ParsingPackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) {
+ this.zygotePreloadName = zygotePreloadName;
+ return this;
+ }
}
diff --git a/core/java/android/content/pm/parsing/component/ParsedActivity.java b/core/java/android/content/pm/parsing/component/ParsedActivity.java
index 5495c225f811..7a46e3868f95 100644
--- a/core/java/android/content/pm/parsing/component/ParsedActivity.java
+++ b/core/java/android/content/pm/parsing/component/ParsedActivity.java
@@ -20,7 +20,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED;
import android.annotation.Nullable;
@@ -29,13 +29,11 @@ import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
-import android.content.pm.parsing.ParsingPackageImpl;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide **/
@@ -268,11 +266,11 @@ public class ParsedActivity extends ParsedMainComponent {
super.writeToParcel(dest, flags);
dest.writeInt(this.theme);
dest.writeInt(this.uiOptions);
- sForString.parcel(this.targetActivity, dest, flags);
- sForString.parcel(this.parentActivityName, dest, flags);
+ dest.writeString(this.targetActivity);
+ dest.writeString(this.parentActivityName);
dest.writeString(this.taskAffinity);
dest.writeInt(this.privateFlags);
- sForString.parcel(this.permission, dest, flags);
+ sForInternedString.parcel(this.permission, dest, flags);
dest.writeInt(this.launchMode);
dest.writeInt(this.documentLaunchMode);
dest.writeInt(this.maxRecents);
@@ -311,11 +309,11 @@ public class ParsedActivity extends ParsedMainComponent {
super(in);
this.theme = in.readInt();
this.uiOptions = in.readInt();
- this.targetActivity = sForString.unparcel(in);
- this.parentActivityName = sForString.unparcel(in);
+ this.targetActivity = in.readString();
+ this.parentActivityName = in.readString();
this.taskAffinity = in.readString();
this.privateFlags = in.readInt();
- this.permission = sForString.unparcel(in);
+ this.permission = sForInternedString.unparcel(in);
this.launchMode = in.readInt();
this.documentLaunchMode = in.readInt();
this.maxRecents = in.readInt();
diff --git a/core/java/android/content/pm/parsing/component/ParsedComponent.java b/core/java/android/content/pm/parsing/component/ParsedComponent.java
index 098d6204b021..6323d6921394 100644
--- a/core/java/android/content/pm/parsing/component/ParsedComponent.java
+++ b/core/java/android/content/pm/parsing/component/ParsedComponent.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.CallSuper;
import android.annotation.NonNull;
@@ -131,7 +131,7 @@ public abstract class ParsedComponent implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- sForString.parcel(this.name, dest, flags);
+ dest.writeString(this.name);
dest.writeInt(this.getIcon());
dest.writeInt(this.getLabelRes());
dest.writeCharSequence(this.getNonLocalizedLabel());
@@ -139,7 +139,7 @@ public abstract class ParsedComponent implements Parcelable {
dest.writeInt(this.getBanner());
dest.writeInt(this.getDescriptionRes());
dest.writeInt(this.getFlags());
- sForString.parcel(this.packageName, dest, flags);
+ sForInternedString.parcel(this.packageName, dest, flags);
sForIntentInfos.parcel(this.getIntents(), dest, flags);
dest.writeBundle(this.metaData);
}
@@ -148,7 +148,7 @@ public abstract class ParsedComponent implements Parcelable {
// We use the boot classloader for all classes that we load.
final ClassLoader boot = Object.class.getClassLoader();
//noinspection ConstantConditions
- this.name = sForString.unparcel(in);
+ this.name = in.readString();
this.icon = in.readInt();
this.labelRes = in.readInt();
this.nonLocalizedLabel = in.readCharSequence();
@@ -157,7 +157,7 @@ public abstract class ParsedComponent implements Parcelable {
this.descriptionRes = in.readInt();
this.flags = in.readInt();
//noinspection ConstantConditions
- this.packageName = sForString.unparcel(in);
+ this.packageName = sForInternedString.unparcel(in);
this.intents = sForIntentInfos.unparcel(in);
this.metaData = in.readBundle(boot);
}
diff --git a/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java b/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java
index 396a145311f2..aa33e79c4aa9 100644
--- a/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java
+++ b/core/java/android/content/pm/parsing/component/ParsedInstrumentation.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -25,7 +25,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide */
@@ -69,16 +68,16 @@ public class ParsedInstrumentation extends ParsedComponent {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.targetPackage, dest, flags);
- sForString.parcel(this.targetProcesses, dest, flags);
+ sForInternedString.parcel(this.targetPackage, dest, flags);
+ sForInternedString.parcel(this.targetProcesses, dest, flags);
dest.writeBoolean(this.handleProfiling);
dest.writeBoolean(this.functionalTest);
}
protected ParsedInstrumentation(Parcel in) {
super(in);
- this.targetPackage = sForString.unparcel(in);
- this.targetProcesses = sForString.unparcel(in);
+ this.targetPackage = sForInternedString.unparcel(in);
+ this.targetProcesses = sForInternedString.unparcel(in);
this.handleProfiling = in.readByte() != 0;
this.functionalTest = in.readByte() != 0;
}
diff --git a/core/java/android/content/pm/parsing/component/ParsedMainComponent.java b/core/java/android/content/pm/parsing/component/ParsedMainComponent.java
index 59e9a84e3ceb..a5e394d82356 100644
--- a/core/java/android/content/pm/parsing/component/ParsedMainComponent.java
+++ b/core/java/android/content/pm/parsing/component/ParsedMainComponent.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.Nullable;
import android.os.Parcel;
@@ -24,7 +24,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide */
@@ -79,7 +78,7 @@ public class ParsedMainComponent extends ParsedComponent {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.processName, dest, flags);
+ sForInternedString.parcel(this.processName, dest, flags);
dest.writeBoolean(this.directBootAware);
dest.writeBoolean(this.enabled);
dest.writeBoolean(this.exported);
@@ -89,7 +88,7 @@ public class ParsedMainComponent extends ParsedComponent {
protected ParsedMainComponent(Parcel in) {
super(in);
- this.processName = sForString.unparcel(in);
+ this.processName = sForInternedString.unparcel(in);
this.directBootAware = in.readBoolean();
this.enabled = in.readBoolean();
this.exported = in.readBoolean();
diff --git a/core/java/android/content/pm/parsing/component/ParsedPermission.java b/core/java/android/content/pm/parsing/component/ParsedPermission.java
index 6c36ecb76846..ced322649c66 100644
--- a/core/java/android/content/pm/parsing/component/ParsedPermission.java
+++ b/core/java/android/content/pm/parsing/component/ParsedPermission.java
@@ -16,8 +16,6 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
-
import android.annotation.Nullable;
import android.content.pm.PermissionInfo;
import android.os.Parcel;
@@ -26,7 +24,6 @@ import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide */
@@ -123,7 +120,7 @@ public class ParsedPermission extends ParsedComponent {
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(this.backgroundPermission);
- sForString.parcel(this.group, dest, flags);
+ dest.writeString(this.group);
dest.writeInt(this.requestRes);
dest.writeInt(this.protectionLevel);
dest.writeBoolean(this.tree);
@@ -135,7 +132,7 @@ public class ParsedPermission extends ParsedComponent {
// We use the boot classloader for all classes that we load.
final ClassLoader boot = Object.class.getClassLoader();
this.backgroundPermission = in.readString();
- this.group = sForString.unparcel(in);
+ this.group = in.readString();
this.requestRes = in.readInt();
this.protectionLevel = in.readInt();
this.tree = in.readBoolean();
diff --git a/core/java/android/content/pm/parsing/component/ParsedProvider.java b/core/java/android/content/pm/parsing/component/ParsedProvider.java
index d2c531dbe5d9..fcf6e8767760 100644
--- a/core/java/android/content/pm/parsing/component/ParsedProvider.java
+++ b/core/java/android/content/pm/parsing/component/ParsedProvider.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -28,7 +28,6 @@ import android.os.PatternMatcher;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide **/
@@ -106,10 +105,10 @@ public class ParsedProvider extends ParsedMainComponent {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.authority, dest, flags);
+ dest.writeString(this.authority);
dest.writeBoolean(this.syncable);
- sForString.parcel(this.readPermission, dest, flags);
- sForString.parcel(this.writePermission, dest, flags);
+ sForInternedString.parcel(this.readPermission, dest, flags);
+ sForInternedString.parcel(this.writePermission, dest, flags);
dest.writeBoolean(this.grantUriPermissions);
dest.writeBoolean(this.forceUriPermissions);
dest.writeBoolean(this.multiProcess);
@@ -124,10 +123,10 @@ public class ParsedProvider extends ParsedMainComponent {
protected ParsedProvider(Parcel in) {
super(in);
//noinspection ConstantConditions
- this.authority = sForString.unparcel(in);
+ this.authority = in.readString();
this.syncable = in.readBoolean();
- this.readPermission = sForString.unparcel(in);
- this.writePermission = sForString.unparcel(in);
+ this.readPermission = sForInternedString.unparcel(in);
+ this.writePermission = sForInternedString.unparcel(in);
this.grantUriPermissions = in.readBoolean();
this.forceUriPermissions = in.readBoolean();
this.multiProcess = in.readBoolean();
diff --git a/core/java/android/content/pm/parsing/component/ParsedService.java b/core/java/android/content/pm/parsing/component/ParsedService.java
index 591eef74453a..7adb2624056e 100644
--- a/core/java/android/content/pm/parsing/component/ParsedService.java
+++ b/core/java/android/content/pm/parsing/component/ParsedService.java
@@ -16,7 +16,7 @@
package android.content.pm.parsing.component;
-import static android.content.pm.parsing.ParsingPackageImpl.sForString;
+import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -25,7 +25,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
/** @hide **/
@@ -67,7 +66,7 @@ public class ParsedService extends ParsedMainComponent {
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.foregroundServiceType);
- sForString.parcel(this.permission, dest, flags);
+ sForInternedString.parcel(this.permission, dest, flags);
}
public ParsedService() {
@@ -76,7 +75,7 @@ public class ParsedService extends ParsedMainComponent {
protected ParsedService(Parcel in) {
super(in);
this.foregroundServiceType = in.readInt();
- this.permission = sForString.unparcel(in);
+ this.permission = sForInternedString.unparcel(in);
}
public static final Parcelable.Creator<ParsedService> CREATOR = new Creator<ParsedService>() {
diff --git a/core/java/com/android/internal/util/Parcelling.java b/core/java/com/android/internal/util/Parcelling.java
index 6258a6956b09..7f567b948eb2 100644
--- a/core/java/com/android/internal/util/Parcelling.java
+++ b/core/java/com/android/internal/util/Parcelling.java
@@ -167,6 +167,33 @@ public interface Parcelling<T> {
}
}
+ class ForStringSet implements Parcelling<Set<String>> {
+ @Override
+ public void parcel(Set<String> item, Parcel dest, int parcelFlags) {
+ if (item == null) {
+ dest.writeInt(-1);
+ } else {
+ dest.writeInt(item.size());
+ for (String string : item) {
+ dest.writeString(string);
+ }
+ }
+ }
+
+ @Override
+ public Set<String> unparcel(Parcel source) {
+ final int size = source.readInt();
+ if (size < 0) {
+ return emptySet();
+ }
+ Set<String> set = new ArraySet<>();
+ for (int count = 0; count < size; count++) {
+ set.add(source.readString());
+ }
+ return set;
+ }
+ }
+
class ForInternedStringSet implements Parcelling<Set<String>> {
@Override
public void parcel(Set<String> item, Parcel dest, int parcelFlags) {
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
index 2b508ea3d134..fee154f65e86 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
@@ -21,31 +21,23 @@ import android.annotation.Nullable;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
-import android.content.pm.SharedLibraryInfo;
import android.content.pm.parsing.ParsingPackage;
import android.content.pm.parsing.ParsingPackageImpl;
import android.content.pm.parsing.component.ParsedActivity;
-import android.content.pm.parsing.component.ParsedMainComponent;
import android.content.pm.parsing.component.ParsedProvider;
import android.content.pm.parsing.component.ParsedService;
import android.content.res.TypedArray;
-import android.os.Environment;
import android.os.Parcel;
-import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;
-import com.android.internal.util.Parcelling;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
import com.android.server.pm.parsing.PackageInfoUtils;
-import java.util.Comparator;
-import java.util.List;
import java.util.UUID;
/**
@@ -486,16 +478,16 @@ public final class PackageImpl extends ParsingPackageImpl implements ParsedPacka
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- sForString.parcel(this.manifestPackageName, dest, flags);
+ sForInternedString.parcel(this.manifestPackageName, dest, flags);
dest.writeBoolean(this.stub);
- sForString.parcel(this.nativeLibraryDir, dest, flags);
- sForString.parcel(this.nativeLibraryRootDir, dest, flags);
+ dest.writeString(this.nativeLibraryDir);
+ dest.writeString(this.nativeLibraryRootDir);
dest.writeBoolean(this.nativeLibraryRootRequiresIsa);
- sForString.parcel(this.primaryCpuAbi, dest, flags);
- sForString.parcel(this.secondaryCpuAbi, dest, flags);
- sForString.parcel(this.secondaryNativeLibraryDir, dest, flags);
- sForString.parcel(this.seInfo, dest, flags);
- sForString.parcel(this.seInfoUser, dest, flags);
+ sForInternedString.parcel(this.primaryCpuAbi, dest, flags);
+ sForInternedString.parcel(this.secondaryCpuAbi, dest, flags);
+ dest.writeString(this.secondaryNativeLibraryDir);
+ dest.writeString(this.seInfo);
+ dest.writeString(this.seInfoUser);
dest.writeInt(this.uid);
dest.writeBoolean(this.coreApp);
dest.writeBoolean(this.system);
@@ -511,16 +503,16 @@ public final class PackageImpl extends ParsingPackageImpl implements ParsedPacka
public PackageImpl(Parcel in) {
super(in);
- this.manifestPackageName = sForString.unparcel(in);
+ this.manifestPackageName = sForInternedString.unparcel(in);
this.stub = in.readBoolean();
- this.nativeLibraryDir = sForString.unparcel(in);
- this.nativeLibraryRootDir = sForString.unparcel(in);
+ this.nativeLibraryDir = in.readString();
+ this.nativeLibraryRootDir = in.readString();
this.nativeLibraryRootRequiresIsa = in.readBoolean();
- this.primaryCpuAbi = sForString.unparcel(in);
- this.secondaryCpuAbi = sForString.unparcel(in);
- this.secondaryNativeLibraryDir = sForString.unparcel(in);
- this.seInfo = sForString.unparcel(in);
- this.seInfoUser = sForString.unparcel(in);
+ this.primaryCpuAbi = sForInternedString.unparcel(in);
+ this.secondaryCpuAbi = sForInternedString.unparcel(in);
+ this.secondaryNativeLibraryDir = in.readString();
+ this.seInfo = in.readString();
+ this.seInfoUser = in.readString();
this.uid = in.readInt();
this.coreApp = in.readBoolean();
this.system = in.readBoolean();