Loading api/system-current.txt +0 −6 Original line number Diff line number Diff line Loading @@ -9550,12 +9550,6 @@ package android.content.pm { method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean); } public class ManifestDigest implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.ManifestDigest> CREATOR; } public class PackageInfo implements android.os.Parcelable { ctor public PackageInfo(); method public int describeContents(); core/java/android/app/ApplicationPackageManager.java +6 −7 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ import android.content.pm.IPackageStatsObserver; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.KeySet; import android.content.pm.ManifestDigest; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageItemInfo; Loading Loading @@ -1421,7 +1420,7 @@ public class ApplicationPackageManager extends PackageManager { public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName) { final VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null); null, VerificationParams.NO_UID); installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, installerPackageName, verificationParams, null, mContext.getUserId()); } Loading @@ -1429,9 +1428,9 @@ public class ApplicationPackageManager extends PackageManager { @Override public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) { ContainerEncryptionParams encryptionParams) { final VerificationParams verificationParams = new VerificationParams(verificationURI, null, null, VerificationParams.NO_UID, manifestDigest); null, VerificationParams.NO_UID); installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, installerPackageName, verificationParams, encryptionParams, mContext.getUserId()); } Loading @@ -1455,7 +1454,7 @@ public class ApplicationPackageManager extends PackageManager { public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, int userId) { final VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null); null, VerificationParams.NO_UID); installCommon(packageURI, observer, flags, installerPackageName, verificationParams, null, userId); } Loading @@ -1463,10 +1462,10 @@ public class ApplicationPackageManager extends PackageManager { @Override public void installPackageWithVerification(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, Uri verificationURI, ContainerEncryptionParams encryptionParams) { final VerificationParams verificationParams = new VerificationParams(verificationURI, null, null, VerificationParams.NO_UID, manifestDigest); null, VerificationParams.NO_UID); installCommon(packageURI, observer, flags, installerPackageName, verificationParams, encryptionParams, mContext.getUserId()); } Loading core/java/android/content/pm/ManifestDigest.javadeleted 100644 → 0 +0 −147 Original line number Diff line number Diff line /* * Copyright (C) 2012 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.content.pm; import com.android.internal.util.HexDump; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import android.util.Slog; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import libcore.io.IoUtils; /** * Represents the manifest digest for a package. This is suitable for comparison * of two packages to know whether the manifests are identical. * * @hide */ @SystemApi public class ManifestDigest implements Parcelable { private static final String TAG = "ManifestDigest"; /** The digest of the manifest in our preferred order. */ private final byte[] mDigest; /** What we print out first when toString() is called. */ private static final String TO_STRING_PREFIX = "ManifestDigest {mDigest="; /** Digest algorithm to use. */ private static final String DIGEST_ALGORITHM = "SHA-256"; ManifestDigest(byte[] digest) { mDigest = digest; } private ManifestDigest(Parcel source) { mDigest = source.createByteArray(); } static ManifestDigest fromInputStream(InputStream fileIs) { if (fileIs == null) { return null; } final MessageDigest md; try { md = MessageDigest.getInstance(DIGEST_ALGORITHM); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(DIGEST_ALGORITHM + " must be available", e); } final DigestInputStream dis = new DigestInputStream(new BufferedInputStream(fileIs), md); try { byte[] readBuffer = new byte[8192]; while (dis.read(readBuffer, 0, readBuffer.length) != -1) { // not using } } catch (IOException e) { Slog.w(TAG, "Could not read manifest"); return null; } finally { IoUtils.closeQuietly(dis); } final byte[] digest = md.digest(); return new ManifestDigest(digest); } @Override public int describeContents() { return 0; } @Override public boolean equals(Object o) { if (!(o instanceof ManifestDigest)) { return false; } final ManifestDigest other = (ManifestDigest) o; return this == other || Arrays.equals(mDigest, other.mDigest); } @Override public int hashCode() { return Arrays.hashCode(mDigest); } @Override public String toString() { final StringBuilder sb = new StringBuilder(TO_STRING_PREFIX.length() + (mDigest.length * 3) + 1); sb.append(TO_STRING_PREFIX); final int N = mDigest.length; for (int i = 0; i < N; i++) { final byte b = mDigest[i]; HexDump.appendByteAsHex(sb, b, false); sb.append(','); } sb.append('}'); return sb.toString(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeByteArray(mDigest); } public static final Parcelable.Creator<ManifestDigest> CREATOR = new Parcelable.Creator<ManifestDigest>() { public ManifestDigest createFromParcel(Parcel source) { return new ManifestDigest(source); } public ManifestDigest[] newArray(int size) { return new ManifestDigest[size]; } }; } core/java/android/content/pm/PackageManager.java +3 −8 Original line number Diff line number Diff line Loading @@ -3899,7 +3899,6 @@ public abstract class PackageManager { PackageParser.Package pkg = parser.parseMonolithicPackage(apkFile, 0); if ((flags & GET_SIGNATURES) != 0) { parser.collectCertificates(pkg, 0); parser.collectManifestDigest(pkg); } PackageUserState state = new PackageUserState(); return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0, null, state); Loading Loading @@ -3959,14 +3958,12 @@ public abstract class PackageManager { * @param verificationURI The location of the supplementary verification * file. This can be a 'file:' or a 'content:' URI. May be * {@code null}. * @param manifestDigest an object that holds the digest of the package * which can be used to verify ownership. May be {@code null}. * @param encryptionParams if the package to be installed is encrypted, * these parameters describing the encryption and authentication * used. May be {@code null}. * @hide * @deprecated Use {@link #installPackageWithVerification(Uri, * PackageInstallObserver, int, String, Uri, ManifestDigest, * PackageInstallObserver, int, String, Uri, * ContainerEncryptionParams)} instead. This method will * continue to be supported but the older observer interface * will not get additional failure details. Loading @@ -3974,7 +3971,7 @@ public abstract class PackageManager { // @SystemApi public abstract void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, Uri verificationURI, ContainerEncryptionParams encryptionParams); /** Loading Loading @@ -4083,8 +4080,6 @@ public abstract class PackageManager { * @param verificationURI The location of the supplementary verification * file. This can be a 'file:' or a 'content:' URI. May be * {@code null}. * @param manifestDigest an object that holds the digest of the package * which can be used to verify ownership. May be {@code null}. * @param encryptionParams if the package to be installed is encrypted, * these parameters describing the encryption and authentication * used. May be {@code null}. Loading @@ -4092,7 +4087,7 @@ public abstract class PackageManager { */ public abstract void installPackageWithVerification(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, Uri verificationURI, ContainerEncryptionParams encryptionParams); /** Loading core/java/android/content/pm/PackageParser.java +0 −31 Original line number Diff line number Diff line Loading @@ -1031,31 +1031,6 @@ public class PackageParser { return pkg; } /** * Gathers the {@link ManifestDigest} for {@code pkg} if it exists in the * APK. If it successfully scanned the package and found the * {@code AndroidManifest.xml}, {@code true} is returned. */ public void collectManifestDigest(Package pkg) throws PackageParserException { pkg.manifestDigest = null; // TODO: extend to gather digest for split APKs try { final StrictJarFile jarFile = new StrictJarFile(pkg.baseCodePath); try { final ZipEntry je = jarFile.findEntry(ANDROID_MANIFEST_FILENAME); if (je != null) { pkg.manifestDigest = ManifestDigest.fromInputStream(jarFile.getInputStream(je)); } } finally { jarFile.close(); } } catch (IOException | RuntimeException e) { throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "Failed to collect manifest digest"); } } /** * Collect certificates from all the APKs described in the given package, * populating {@link Package#mSignatures}. Also asserts that all APK Loading Loading @@ -4499,12 +4474,6 @@ public class PackageParser { /* The required account type without which this application will not function */ public String mRequiredAccountType; /** * Digest suitable for comparing whether this package's manifest is the * same as another. */ public ManifestDigest manifestDigest; public String mOverlayTarget; public int mOverlayPriority; public boolean mTrustedOverlay; Loading Loading
api/system-current.txt +0 −6 Original line number Diff line number Diff line Loading @@ -9550,12 +9550,6 @@ package android.content.pm { method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean); } public class ManifestDigest implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.ManifestDigest> CREATOR; } public class PackageInfo implements android.os.Parcelable { ctor public PackageInfo(); method public int describeContents();
core/java/android/app/ApplicationPackageManager.java +6 −7 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ import android.content.pm.IPackageStatsObserver; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.KeySet; import android.content.pm.ManifestDigest; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageItemInfo; Loading Loading @@ -1421,7 +1420,7 @@ public class ApplicationPackageManager extends PackageManager { public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName) { final VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null); null, VerificationParams.NO_UID); installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, installerPackageName, verificationParams, null, mContext.getUserId()); } Loading @@ -1429,9 +1428,9 @@ public class ApplicationPackageManager extends PackageManager { @Override public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) { ContainerEncryptionParams encryptionParams) { final VerificationParams verificationParams = new VerificationParams(verificationURI, null, null, VerificationParams.NO_UID, manifestDigest); null, VerificationParams.NO_UID); installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, installerPackageName, verificationParams, encryptionParams, mContext.getUserId()); } Loading @@ -1455,7 +1454,7 @@ public class ApplicationPackageManager extends PackageManager { public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, int userId) { final VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null); null, VerificationParams.NO_UID); installCommon(packageURI, observer, flags, installerPackageName, verificationParams, null, userId); } Loading @@ -1463,10 +1462,10 @@ public class ApplicationPackageManager extends PackageManager { @Override public void installPackageWithVerification(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, Uri verificationURI, ContainerEncryptionParams encryptionParams) { final VerificationParams verificationParams = new VerificationParams(verificationURI, null, null, VerificationParams.NO_UID, manifestDigest); null, VerificationParams.NO_UID); installCommon(packageURI, observer, flags, installerPackageName, verificationParams, encryptionParams, mContext.getUserId()); } Loading
core/java/android/content/pm/ManifestDigest.javadeleted 100644 → 0 +0 −147 Original line number Diff line number Diff line /* * Copyright (C) 2012 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.content.pm; import com.android.internal.util.HexDump; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import android.util.Slog; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import libcore.io.IoUtils; /** * Represents the manifest digest for a package. This is suitable for comparison * of two packages to know whether the manifests are identical. * * @hide */ @SystemApi public class ManifestDigest implements Parcelable { private static final String TAG = "ManifestDigest"; /** The digest of the manifest in our preferred order. */ private final byte[] mDigest; /** What we print out first when toString() is called. */ private static final String TO_STRING_PREFIX = "ManifestDigest {mDigest="; /** Digest algorithm to use. */ private static final String DIGEST_ALGORITHM = "SHA-256"; ManifestDigest(byte[] digest) { mDigest = digest; } private ManifestDigest(Parcel source) { mDigest = source.createByteArray(); } static ManifestDigest fromInputStream(InputStream fileIs) { if (fileIs == null) { return null; } final MessageDigest md; try { md = MessageDigest.getInstance(DIGEST_ALGORITHM); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(DIGEST_ALGORITHM + " must be available", e); } final DigestInputStream dis = new DigestInputStream(new BufferedInputStream(fileIs), md); try { byte[] readBuffer = new byte[8192]; while (dis.read(readBuffer, 0, readBuffer.length) != -1) { // not using } } catch (IOException e) { Slog.w(TAG, "Could not read manifest"); return null; } finally { IoUtils.closeQuietly(dis); } final byte[] digest = md.digest(); return new ManifestDigest(digest); } @Override public int describeContents() { return 0; } @Override public boolean equals(Object o) { if (!(o instanceof ManifestDigest)) { return false; } final ManifestDigest other = (ManifestDigest) o; return this == other || Arrays.equals(mDigest, other.mDigest); } @Override public int hashCode() { return Arrays.hashCode(mDigest); } @Override public String toString() { final StringBuilder sb = new StringBuilder(TO_STRING_PREFIX.length() + (mDigest.length * 3) + 1); sb.append(TO_STRING_PREFIX); final int N = mDigest.length; for (int i = 0; i < N; i++) { final byte b = mDigest[i]; HexDump.appendByteAsHex(sb, b, false); sb.append(','); } sb.append('}'); return sb.toString(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeByteArray(mDigest); } public static final Parcelable.Creator<ManifestDigest> CREATOR = new Parcelable.Creator<ManifestDigest>() { public ManifestDigest createFromParcel(Parcel source) { return new ManifestDigest(source); } public ManifestDigest[] newArray(int size) { return new ManifestDigest[size]; } }; }
core/java/android/content/pm/PackageManager.java +3 −8 Original line number Diff line number Diff line Loading @@ -3899,7 +3899,6 @@ public abstract class PackageManager { PackageParser.Package pkg = parser.parseMonolithicPackage(apkFile, 0); if ((flags & GET_SIGNATURES) != 0) { parser.collectCertificates(pkg, 0); parser.collectManifestDigest(pkg); } PackageUserState state = new PackageUserState(); return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0, null, state); Loading Loading @@ -3959,14 +3958,12 @@ public abstract class PackageManager { * @param verificationURI The location of the supplementary verification * file. This can be a 'file:' or a 'content:' URI. May be * {@code null}. * @param manifestDigest an object that holds the digest of the package * which can be used to verify ownership. May be {@code null}. * @param encryptionParams if the package to be installed is encrypted, * these parameters describing the encryption and authentication * used. May be {@code null}. * @hide * @deprecated Use {@link #installPackageWithVerification(Uri, * PackageInstallObserver, int, String, Uri, ManifestDigest, * PackageInstallObserver, int, String, Uri, * ContainerEncryptionParams)} instead. This method will * continue to be supported but the older observer interface * will not get additional failure details. Loading @@ -3974,7 +3971,7 @@ public abstract class PackageManager { // @SystemApi public abstract void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, Uri verificationURI, ContainerEncryptionParams encryptionParams); /** Loading Loading @@ -4083,8 +4080,6 @@ public abstract class PackageManager { * @param verificationURI The location of the supplementary verification * file. This can be a 'file:' or a 'content:' URI. May be * {@code null}. * @param manifestDigest an object that holds the digest of the package * which can be used to verify ownership. May be {@code null}. * @param encryptionParams if the package to be installed is encrypted, * these parameters describing the encryption and authentication * used. May be {@code null}. Loading @@ -4092,7 +4087,7 @@ public abstract class PackageManager { */ public abstract void installPackageWithVerification(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, Uri verificationURI, ContainerEncryptionParams encryptionParams); /** Loading
core/java/android/content/pm/PackageParser.java +0 −31 Original line number Diff line number Diff line Loading @@ -1031,31 +1031,6 @@ public class PackageParser { return pkg; } /** * Gathers the {@link ManifestDigest} for {@code pkg} if it exists in the * APK. If it successfully scanned the package and found the * {@code AndroidManifest.xml}, {@code true} is returned. */ public void collectManifestDigest(Package pkg) throws PackageParserException { pkg.manifestDigest = null; // TODO: extend to gather digest for split APKs try { final StrictJarFile jarFile = new StrictJarFile(pkg.baseCodePath); try { final ZipEntry je = jarFile.findEntry(ANDROID_MANIFEST_FILENAME); if (je != null) { pkg.manifestDigest = ManifestDigest.fromInputStream(jarFile.getInputStream(je)); } } finally { jarFile.close(); } } catch (IOException | RuntimeException e) { throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "Failed to collect manifest digest"); } } /** * Collect certificates from all the APKs described in the given package, * populating {@link Package#mSignatures}. Also asserts that all APK Loading Loading @@ -4499,12 +4474,6 @@ public class PackageParser { /* The required account type without which this application will not function */ public String mRequiredAccountType; /** * Digest suitable for comparing whether this package's manifest is the * same as another. */ public ManifestDigest manifestDigest; public String mOverlayTarget; public int mOverlayPriority; public boolean mTrustedOverlay; Loading