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

Commit f58336f0 authored by Jonathan Klee's avatar Jonathan Klee Committed by Nishith Khanna
Browse files

Allow to install Google signed Android Auto APK

Allow to install Google signed Android Auto APK
on top of our empty Android Auto stubs.
parent 96df7d4b
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;
@@ -1807,7 +1809,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,
@@ -2043,8 +2045,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);
                            }
@@ -4941,4 +4943,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;
@@ -575,7 +577,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!");
@@ -608,7 +610,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 "
@@ -617,7 +619,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");
@@ -1655,4 +1657,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
@@ -252,9 +252,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,