Loading core/java/android/content/pm/parsing/AndroidPackage.java +5 −0 Original line number Diff line number Diff line Loading @@ -229,6 +229,11 @@ public interface AndroidPackage extends Parcelable { String getOverlayTargetName(); /** * Map of overlayable name to actor name. */ Map<String, String> getOverlayables(); // TODO(b/135203078): Does this and getAppInfoPackageName have to be separate methods? // The refactor makes them the same value with no known consequences, so should be redundant. String getPackageName(); Loading core/java/android/content/pm/parsing/ApkParseUtils.java +19 −2 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.content.pm.permission.SplitPermissionInfoParcelable; import android.content.pm.split.DefaultSplitAssetLoader; import android.content.pm.split.SplitAssetDependencyLoader; import android.content.pm.split.SplitAssetLoader; import android.content.res.ApkAssets; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; Loading Loading @@ -92,6 +93,7 @@ import java.security.PublicKey; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; /** @hide */ Loading Loading @@ -287,8 +289,23 @@ public class ApkParseUtils { + result.getErrorMessage()); } return result.getResultAndNull() .setVolumeUuid(volumeUuid) ParsingPackage pkg = result.getResultAndNull(); ApkAssets apkAssets = assets.getApkAssets()[0]; if (apkAssets.definesOverlayable()) { SparseArray<String> packageNames = assets.getAssignedPackageIdentifiers(); int size = packageNames.size(); for (int index = 0; index < size; index++) { String packageName = packageNames.get(index); Map<String, String> overlayableToActor = assets.getOverlayableMap(packageName); if (overlayableToActor != null && !overlayableToActor.isEmpty()) { for (String overlayable : overlayableToActor.keySet()) { pkg.addOverlayable(overlayable, overlayableToActor.get(overlayable)); } } } } return pkg.setVolumeUuid(volumeUuid) .setApplicationVolumeUuid(volumeUuid) .setSigningDetails(SigningDetails.UNKNOWN); } catch (PackageParserException e) { Loading core/java/android/content/pm/parsing/PackageImpl.java +22 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package android.content.pm.parsing; import static android.os.Build.VERSION_CODES.DONUT; import static java.util.Collections.emptyMap; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Intent; Loading Loading @@ -55,11 +57,13 @@ import android.util.SparseArray; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.server.SystemConfig; import java.security.PublicKey; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; Loading Loading @@ -126,6 +130,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android private String overlayCategory; private int overlayPriority; private boolean overlayIsStatic; private Map<String, String> overlayables = emptyMap(); private String staticSharedLibName; private long staticSharedLibVersion; Loading Loading @@ -475,7 +480,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android @Override public Map<String, ArraySet<PublicKey>> getKeySetMapping() { return keySetMapping == null ? Collections.emptyMap() : keySetMapping; return keySetMapping == null ? emptyMap() : keySetMapping; } @Override Loading Loading @@ -772,6 +777,13 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android return this; } @Override public ParsingPackage addOverlayable(String overlayableName, String actorName) { this.overlayables = CollectionUtils.add(this.overlayables, TextUtils.safeIntern(overlayableName), TextUtils.safeIntern(actorName)); return this; } @Override public PackageImpl addAdoptPermission(String adoptPermission) { this.adoptPermissions = ArrayUtils.add(this.adoptPermissions, adoptPermission); Loading Loading @@ -2124,6 +2136,11 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android return overlayTargetName; } @Override public Map<String, String> getOverlayables() { return overlayables; } @Override public boolean isOverlayIsStatic() { return overlayIsStatic; Loading Loading @@ -2291,7 +2308,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android appInfo.metaData = appMetaData; appInfo.minAspectRatio = minAspectRatio; appInfo.minSdkVersion = minSdkVersion; appInfo.name = name; appInfo.name = className; if (appInfo.name != null) { appInfo.name = appInfo.name.trim(); } Loading Loading @@ -2957,6 +2974,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android dest.writeString(this.overlayCategory); dest.writeInt(this.overlayPriority); dest.writeBoolean(this.overlayIsStatic); dest.writeMap(this.overlayables); dest.writeString(this.staticSharedLibName); dest.writeLong(this.staticSharedLibVersion); dest.writeStringList(this.libraryNames); Loading Loading @@ -3100,6 +3118,8 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android this.overlayCategory = in.readString(); this.overlayPriority = in.readInt(); this.overlayIsStatic = in.readBoolean(); this.overlayables = new HashMap<>(); in.readMap(overlayables, boot); this.staticSharedLibName = TextUtils.safeIntern(in.readString()); this.staticSharedLibVersion = in.readLong(); this.libraryNames = in.createStringArrayList(); Loading core/java/android/content/pm/parsing/ParsingPackage.java +2 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,8 @@ public interface ParsingPackage extends AndroidPackage { ParsingPackage addOriginalPackage(String originalPackage); ParsingPackage addOverlayable(String overlayableName, String actorName); ParsingPackage addPermission(ParsedPermission permission); ParsingPackage addPermissionGroup(ParsedPermissionGroup permissionGroup); Loading core/java/com/android/internal/util/CollectionUtils.java +11 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,17 @@ public class CollectionUtils { return cur; } /** * @see #add(List, Object) */ public static @NonNull <K, V> Map<K, V> add(@Nullable Map<K, V> map, K key, V value) { if (map == null || map == Collections.emptyMap()) { map = new ArrayMap<>(); } map.put(key, value); return map; } /** * Similar to {@link List#remove}, but with support for list values of {@code null} and * {@link Collections#emptyList} Loading Loading
core/java/android/content/pm/parsing/AndroidPackage.java +5 −0 Original line number Diff line number Diff line Loading @@ -229,6 +229,11 @@ public interface AndroidPackage extends Parcelable { String getOverlayTargetName(); /** * Map of overlayable name to actor name. */ Map<String, String> getOverlayables(); // TODO(b/135203078): Does this and getAppInfoPackageName have to be separate methods? // The refactor makes them the same value with no known consequences, so should be redundant. String getPackageName(); Loading
core/java/android/content/pm/parsing/ApkParseUtils.java +19 −2 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.content.pm.permission.SplitPermissionInfoParcelable; import android.content.pm.split.DefaultSplitAssetLoader; import android.content.pm.split.SplitAssetDependencyLoader; import android.content.pm.split.SplitAssetLoader; import android.content.res.ApkAssets; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; Loading Loading @@ -92,6 +93,7 @@ import java.security.PublicKey; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; /** @hide */ Loading Loading @@ -287,8 +289,23 @@ public class ApkParseUtils { + result.getErrorMessage()); } return result.getResultAndNull() .setVolumeUuid(volumeUuid) ParsingPackage pkg = result.getResultAndNull(); ApkAssets apkAssets = assets.getApkAssets()[0]; if (apkAssets.definesOverlayable()) { SparseArray<String> packageNames = assets.getAssignedPackageIdentifiers(); int size = packageNames.size(); for (int index = 0; index < size; index++) { String packageName = packageNames.get(index); Map<String, String> overlayableToActor = assets.getOverlayableMap(packageName); if (overlayableToActor != null && !overlayableToActor.isEmpty()) { for (String overlayable : overlayableToActor.keySet()) { pkg.addOverlayable(overlayable, overlayableToActor.get(overlayable)); } } } } return pkg.setVolumeUuid(volumeUuid) .setApplicationVolumeUuid(volumeUuid) .setSigningDetails(SigningDetails.UNKNOWN); } catch (PackageParserException e) { Loading
core/java/android/content/pm/parsing/PackageImpl.java +22 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package android.content.pm.parsing; import static android.os.Build.VERSION_CODES.DONUT; import static java.util.Collections.emptyMap; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Intent; Loading Loading @@ -55,11 +57,13 @@ import android.util.SparseArray; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.server.SystemConfig; import java.security.PublicKey; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; Loading Loading @@ -126,6 +130,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android private String overlayCategory; private int overlayPriority; private boolean overlayIsStatic; private Map<String, String> overlayables = emptyMap(); private String staticSharedLibName; private long staticSharedLibVersion; Loading Loading @@ -475,7 +480,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android @Override public Map<String, ArraySet<PublicKey>> getKeySetMapping() { return keySetMapping == null ? Collections.emptyMap() : keySetMapping; return keySetMapping == null ? emptyMap() : keySetMapping; } @Override Loading Loading @@ -772,6 +777,13 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android return this; } @Override public ParsingPackage addOverlayable(String overlayableName, String actorName) { this.overlayables = CollectionUtils.add(this.overlayables, TextUtils.safeIntern(overlayableName), TextUtils.safeIntern(actorName)); return this; } @Override public PackageImpl addAdoptPermission(String adoptPermission) { this.adoptPermissions = ArrayUtils.add(this.adoptPermissions, adoptPermission); Loading Loading @@ -2124,6 +2136,11 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android return overlayTargetName; } @Override public Map<String, String> getOverlayables() { return overlayables; } @Override public boolean isOverlayIsStatic() { return overlayIsStatic; Loading Loading @@ -2291,7 +2308,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android appInfo.metaData = appMetaData; appInfo.minAspectRatio = minAspectRatio; appInfo.minSdkVersion = minSdkVersion; appInfo.name = name; appInfo.name = className; if (appInfo.name != null) { appInfo.name = appInfo.name.trim(); } Loading Loading @@ -2957,6 +2974,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android dest.writeString(this.overlayCategory); dest.writeInt(this.overlayPriority); dest.writeBoolean(this.overlayIsStatic); dest.writeMap(this.overlayables); dest.writeString(this.staticSharedLibName); dest.writeLong(this.staticSharedLibVersion); dest.writeStringList(this.libraryNames); Loading Loading @@ -3100,6 +3118,8 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android this.overlayCategory = in.readString(); this.overlayPriority = in.readInt(); this.overlayIsStatic = in.readBoolean(); this.overlayables = new HashMap<>(); in.readMap(overlayables, boot); this.staticSharedLibName = TextUtils.safeIntern(in.readString()); this.staticSharedLibVersion = in.readLong(); this.libraryNames = in.createStringArrayList(); Loading
core/java/android/content/pm/parsing/ParsingPackage.java +2 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,8 @@ public interface ParsingPackage extends AndroidPackage { ParsingPackage addOriginalPackage(String originalPackage); ParsingPackage addOverlayable(String overlayableName, String actorName); ParsingPackage addPermission(ParsedPermission permission); ParsingPackage addPermissionGroup(ParsedPermissionGroup permissionGroup); Loading
core/java/com/android/internal/util/CollectionUtils.java +11 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,17 @@ public class CollectionUtils { return cur; } /** * @see #add(List, Object) */ public static @NonNull <K, V> Map<K, V> add(@Nullable Map<K, V> map, K key, V value) { if (map == null || map == Collections.emptyMap()) { map = new ArrayMap<>(); } map.put(key, value); return map; } /** * Similar to {@link List#remove}, but with support for list values of {@code null} and * {@link Collections#emptyList} Loading