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

Commit 01921417 authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] add a fd variant of the parseAndroidManifest API

As required to unblock VIC finalization.

BUG: 340879905
Test: atest android.content.pm.cts.PackageManagerTest

Change-Id: I4f7785d919d835c4985bf82783de13038ec6b445
parent 46d98049
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13040,6 +13040,7 @@ package android.content.pm {
    method @CheckResult public abstract boolean isPermissionRevokedByPolicy(@NonNull String, @NonNull String);
    method public abstract boolean isSafeMode();
    method @FlaggedApi("android.content.pm.get_package_info") @WorkerThread public <T> T parseAndroidManifest(@NonNull java.io.File, @NonNull java.util.function.Function<android.content.res.XmlResourceParser,T>) throws java.io.IOException;
    method @FlaggedApi("android.content.pm.get_package_info_with_fd") @WorkerThread public <T> T parseAndroidManifest(@NonNull android.os.ParcelFileDescriptor, @NonNull java.util.function.Function<android.content.res.XmlResourceParser,T>) throws java.io.IOException;
    method @NonNull public java.util.List<android.content.pm.PackageManager.Property> queryActivityProperty(@NonNull String);
    method @NonNull public java.util.List<android.content.pm.PackageManager.Property> queryApplicationProperty(@NonNull String);
    method @NonNull public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(@NonNull android.content.Intent, int);
+32 −0
Original line number Diff line number Diff line
@@ -4097,6 +4097,38 @@ public class ApplicationPackageManager extends PackageManager {
        }
    }


    @Override
    public <T> T parseAndroidManifest(@NonNull ParcelFileDescriptor apkFileDescriptor,
            @NonNull Function<XmlResourceParser, T> parserFunction) throws IOException {
        Objects.requireNonNull(apkFileDescriptor, "apkFileDescriptor cannot be null");
        Objects.requireNonNull(parserFunction, "parserFunction cannot be null");
        try (XmlResourceParser xmlResourceParser = getAndroidManifestParser(apkFileDescriptor)) {
            return parserFunction.apply(xmlResourceParser);
        } catch (IOException e) {
            Log.w(TAG, "Failed to get the android manifest parser", e);
            throw e;
        }
    }

    private static XmlResourceParser getAndroidManifestParser(@NonNull ParcelFileDescriptor fd)
            throws IOException {
        ApkAssets apkAssets = null;
        try {
            apkAssets = ApkAssets.loadFromFd(
                    fd.getFileDescriptor(), fd.toString(), /* flags= */ 0 , /* assets= */null);
            return apkAssets.openXml(ApkLiteParseUtils.ANDROID_MANIFEST_FILENAME);
        } finally {
            if (apkAssets != null) {
                try {
                    apkAssets.close();
                } catch (Throwable ignored) {
                    Log.w(TAG, "Failed to close apkAssets", ignored);
                }
            }
        }
    }

    @Override
    public TypedArray extractPackageItemInfoAttributes(PackageItemInfo info, String name,
            String rootTag, int[] attributes) {
+22 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.PersistableBundle;
import android.os.RemoteException;
@@ -11754,6 +11755,27 @@ public abstract class PackageManager {
                "parseAndroidManifest not implemented in subclass");
    }

    /**
     * Similar to {@link #parseAndroidManifest(File, Function)}, but accepting a file descriptor
     * instead of a File object.
     *
     * @param apkFileDescriptor The file descriptor of an application apk.
     * The parserFunction will be invoked with the XmlResourceParser object
     *        after getting the AndroidManifest.xml of an application package.
     *
     * @return Returns the result of the {@link Function#apply(Object)}.
     *
     * @throws IOException if the AndroidManifest.xml of an application package cannot be
     *             read or accessed.
     */
    @FlaggedApi(android.content.pm.Flags.FLAG_GET_PACKAGE_INFO_WITH_FD)
    @WorkerThread
    public <T> T parseAndroidManifest(@NonNull ParcelFileDescriptor apkFileDescriptor,
            @NonNull Function<XmlResourceParser, T> parserFunction) throws IOException {
        throw new UnsupportedOperationException(
                "parseAndroidManifest not implemented in subclass");
    }

    /**
     * @param info    The {@link ServiceInfo} to pull the attributes from.
     * @param name    The name of the Xml metadata where the attributes are stored.
+8 −0
Original line number Diff line number Diff line
@@ -276,3 +276,11 @@ flag {
    bug: "300309050"
    is_fixed_read_only: true
}

flag {
    name: "get_package_info_with_fd"
    is_exported: true
    namespace: "package_manager_service"
    description: "Feature flag to enable the feature to retrieve package info without installation with a file descriptor."
    bug: "340879905"
}
 No newline at end of file