Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0780c0b0 authored by Jonathan Klee's avatar Jonathan Klee
Browse files

Merge branch '3549-a15-android-auto' into 'a15'

Allow to install Google signed Android Auto APK

See merge request e/os/android_frameworks_base!307
parents 09d9ba65 03a16750
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ import static com.android.server.pm.PackageManagerServiceUtils.isInstalledByAdb;
import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive;
import static com.android.server.pm.SharedUidMigration.BEST_EFFORT;
import static com.android.server.pm.permission.PermissionManagerServiceImpl.ANDROID_AUTO_CERTS;
import static com.android.server.pm.permission.PermissionManagerServiceImpl.PACKAGE_ANDROID_AUTO;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -1728,7 +1730,7 @@ final class InstallPackageHelper {
                }

                // Check whether the newly-scanned package wants to define an already-defined perm
                if (bp != null) {
                if (bp != null && !isAndroidAutoApk(parsedPackage)) {
                    final String sourcePackageName = bp.getPackageName();

                    if (!doesSignatureMatchForPermissions(sourcePackageName, parsedPackage,
@@ -1964,8 +1966,8 @@ final class InstallPackageHelper {
                            // of the old package; this allows a rollback to a previously installed
                            // version after an app's signing key has been rotated without requiring
                            // the rollback capability on the previous signing key.
                            if (!isRollback || !oldPkgSigningDetails.hasAncestorOrSelf(
                                    parsedPkgSigningDetails)) {
                            if (!isAndroidAutoApk(parsedPackage) && (!isRollback || !oldPkgSigningDetails.hasAncestorOrSelf(
                                    parsedPkgSigningDetails))) {
                                throw new PrepareFailure(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
                                        "New package has a different signature: " + pkgName11);
                            }
@@ -4931,4 +4933,9 @@ final class InstallPackageHelper {

        return scanFlags;
    }

    private boolean isAndroidAutoApk(ParsedPackage parsedPackage) {
        return parsedPackage.getPackageName().equals(PACKAGE_ANDROID_AUTO)
            && parsedPackage.getSigningDetails().hasAncestorOrSelfWithDigest(ANDROID_AUTO_CERTS);
    }
}
+10 −3
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ import static com.android.server.pm.PackageManagerService.RANDOM_DIR_PREFIX;
import static com.android.server.pm.PackageManagerService.SHELL_PACKAGE_NAME;
import static com.android.server.pm.PackageManagerService.STUB_SUFFIX;
import static com.android.server.pm.PackageManagerService.TAG;
import static com.android.server.pm.permission.PermissionManagerServiceImpl.PACKAGE_ANDROID_AUTO;
import static com.android.server.pm.permission.PermissionManagerServiceImpl.ANDROID_AUTO_CERTS;

import android.Manifest;
import android.annotation.IntDef;
@@ -592,7 +594,7 @@ public class PackageManagerServiceUtils {
                match = pkgSetting.getSigningDetails().hasAncestorOrSelf(parsedSignatures);
            }

            if (!match) {
            if (!match && !isAndroidAutoApk(packageName, parsedSignatures)) {
                throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
                        "Existing package " + packageName
                                + " signatures do not match newer version; ignoring!");
@@ -625,7 +627,7 @@ public class PackageManagerServiceUtils {
                                SigningDetails.CertCapabilities.SHARED_USER_ID);
                compatMatch |= match;
            }
            if (!match) {
            if (!match && !isAndroidAutoApk(packageName, parsedSignatures)) {
                throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
                        "Package " + packageName
                        + " has no signatures that match those in shared user "
@@ -634,7 +636,7 @@ public class PackageManagerServiceUtils {
            // If the lineage of this package diverges from the lineage of the sharedUserId then
            // do not allow the installation to proceed.
            if (!parsedSignatures.hasCommonAncestor(
                    sharedUserSetting.signatures.mSigningDetails)) {
                    sharedUserSetting.signatures.mSigningDetails) && !isAndroidAutoApk(packageName, parsedSignatures)) {
                throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
                        "Package " + packageName + " has a signing lineage "
                                + "that diverges from the lineage of the sharedUserId");
@@ -1672,4 +1674,9 @@ public class PackageManagerServiceUtils {
            }
        }
    }

    private static boolean isAndroidAutoApk(String packageName, SigningDetails signingDetails) {
        return packageName.equals(PACKAGE_ANDROID_AUTO)
                && signingDetails.hasAncestorOrSelfWithDigest(ANDROID_AUTO_CERTS);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -251,9 +251,9 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt

    @NonNull private final ApexManager mApexManager;

    private static final String PACKAGE_ANDROID_AUTO = "com.google.android.projection.gearhead";
    public static final String PACKAGE_ANDROID_AUTO = "com.google.android.projection.gearhead";
    private static final String SIGNATURE_ANDROID_AUTO = "FDB00C43DBDE8B51CB312AA81D3B5FA17713ADB94B28F598D77F8EB89DACEEDF";
    private static final Set<String> ANDROID_AUTO_CERTS = new HashSet(Arrays.asList(SIGNATURE_ANDROID_AUTO));
    public static final Set<String> ANDROID_AUTO_CERTS = new HashSet(Arrays.asList(SIGNATURE_ANDROID_AUTO));
    private static final ArrayList<String> PERMISSIONS_ANDROID_AUTO = new ArrayList<String>(
            Arrays.asList(
                    Manifest.permission.INTERNAL_SYSTEM_WINDOW,