PackageParserApi21.java 源代码


package com.x8zs.morgoo.droidplugin.pm.parser;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.InstrumentationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.Signature;
import com.x8zs.morgoo.droidplugin.reflect.FieldUtils;
import com.x8zs.morgoo.droidplugin.reflect.MethodUtils;
import com.x8zs.morgoo.helper.Log;
import com.x8zs.morgoo.helper.compat.UserHandleCompat;
import java.io.File;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@TargetApi(21)
class PackageParserApi21 extends PackageParser {
    private static final String TAG = "PackageParserApi21";
    protected Object mDefaultPackageUserState;
    protected Object mPackage;
    protected int mUserId;
    protected Class<?> sActivityClass;
    protected Class<?> sArraySetClass;
    protected Class<?> sInstrumentationClass;
    protected Class<?> sPackageParserClass;
    protected Class<?> sPackageUserStateClass;
    protected Class<?> sPermissionClass;
    protected Class<?> sPermissionGroupClass;
    protected Class<?> sProviderClass;
    protected Class<?> sServiceClass;

    public PackageParserApi21(Context context) {
        super(context);
        initClasses();
    }

    private void initClasses() {
        this.sPackageParserClass = Class.forName("android.content.pm.PackageParser");
        this.sActivityClass = Class.forName("android.content.pm.PackageParser$Activity");
        this.sServiceClass = Class.forName("android.content.pm.PackageParser$Service");
        this.sProviderClass = Class.forName("android.content.pm.PackageParser$Provider");
        this.sInstrumentationClass = Class.forName("android.content.pm.PackageParser$Instrumentation");
        this.sPermissionClass = Class.forName("android.content.pm.PackageParser$Permission");
        this.sPermissionGroupClass = Class.forName("android.content.pm.PackageParser$PermissionGroup");
        try {
            this.sArraySetClass = Class.forName("android.util.ArraySet");
        } catch (ClassNotFoundException unused) {
        }
        Class<?> cls = Class.forName("android.content.pm.PackageUserState");
        this.sPackageUserStateClass = cls;
        this.mDefaultPackageUserState = cls.newInstance();
        this.mUserId = UserHandleCompat.getCallingUserId();
    }

    @Override
    public void collectCertificates(int i6) {
        MethodUtils.getAccessibleMethod(this.sPackageParserClass, "collectCertificates", this.mPackage.getClass(), Integer.TYPE).invoke(this.mPackageParser, this.mPackage, Integer.valueOf(i6));
    }

    @Override
    public ActivityInfo generateActivityInfo(Object obj, int i6) {
        Class<?> cls = this.sPackageParserClass;
        Class cls2 = Integer.TYPE;
        return (ActivityInfo) MethodUtils.getAccessibleMethod(cls, "generateActivityInfo", this.sActivityClass, cls2, this.sPackageUserStateClass, cls2).invoke(null, obj, Integer.valueOf(i6), this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
    }

    @Override
    public ApplicationInfo generateApplicationInfo(int i6) {
        Class<?> cls = this.sPackageParserClass;
        Class cls2 = Integer.TYPE;
        return (ApplicationInfo) MethodUtils.getAccessibleMethod(cls, "generateApplicationInfo", this.mPackage.getClass(), cls2, this.sPackageUserStateClass, cls2).invoke(null, this.mPackage, Integer.valueOf(i6), this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
    }

    @Override
    public InstrumentationInfo generateInstrumentationInfo(Object obj, int i6) {
        return (InstrumentationInfo) MethodUtils.getAccessibleMethod(this.sPackageParserClass, "generateInstrumentationInfo", this.sInstrumentationClass, Integer.TYPE).invoke(null, obj, Integer.valueOf(i6));
    }

    @Override
    public PackageInfo generatePackageInfo(int[] iArr, int i6, long j6, long j7, HashSet<String> hashSet) {
        Object obj;
        try {
            Class<?> cls = this.sPackageParserClass;
            Class cls2 = Integer.TYPE;
            Class cls3 = Long.TYPE;
            return (PackageInfo) MethodUtils.getAccessibleMethod(cls, "generatePackageInfo", this.mPackage.getClass(), int[].class, cls2, cls3, cls3, Set.class, this.sPackageUserStateClass, cls2).invoke(null, this.mPackage, iArr, Integer.valueOf(i6), Long.valueOf(j6), Long.valueOf(j7), hashSet, this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
        } catch (NoSuchMethodException e6) {
            Log.i(TAG, "get generatePackageInfo 1 fail", e6, new Object[0]);
            try {
                Class<?> cls4 = this.sPackageParserClass;
                Class cls5 = Integer.TYPE;
                Class cls6 = Long.TYPE;
                return (PackageInfo) MethodUtils.getAccessibleMethod(cls4, "generatePackageInfo", this.mPackage.getClass(), int[].class, cls5, cls6, cls6, HashSet.class, this.sPackageUserStateClass, cls5).invoke(null, this.mPackage, iArr, Integer.valueOf(i6), Long.valueOf(j6), Long.valueOf(j7), hashSet, this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
            } catch (NoSuchMethodException e7) {
                Log.i(TAG, "get generatePackageInfo 2 fail", e7, new Object[0]);
                try {
                    Class<?> cls7 = this.sPackageParserClass;
                    Class cls8 = Integer.TYPE;
                    Class cls9 = Long.TYPE;
                    Method accessibleMethod = MethodUtils.getAccessibleMethod(cls7, "generatePackageInfo", this.mPackage.getClass(), int[].class, cls8, cls9, cls9, this.sArraySetClass, this.sPackageUserStateClass, cls8);
                    try {
                        obj = this.sArraySetClass.getConstructor(Collection.class).newInstance(hashSet);
                    } catch (Exception unused) {
                        obj = null;
                    }
                    if (obj == null) {
                        obj = hashSet;
                    }
                    return (PackageInfo) accessibleMethod.invoke(null, this.mPackage, iArr, Integer.valueOf(i6), Long.valueOf(j6), Long.valueOf(j7), obj, this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
                } catch (NoSuchMethodException e8) {
                    Log.i(TAG, "get generatePackageInfo 3 fail", e8, new Object[0]);
                    throw new NoSuchMethodException("Can not found method generatePackageInfo");
                }
            }
        }
    }

    @Override
    public PermissionGroupInfo generatePermissionGroupInfo(Object obj, int i6) {
        return (PermissionGroupInfo) MethodUtils.getAccessibleMethod(this.sPackageParserClass, "generatePermissionGroupInfo", this.sPermissionGroupClass, Integer.TYPE).invoke(null, obj, Integer.valueOf(i6));
    }

    @Override
    public PermissionInfo generatePermissionInfo(Object obj, int i6) {
        return (PermissionInfo) MethodUtils.getAccessibleMethod(this.sPackageParserClass, "generatePermissionInfo", this.sPermissionClass, Integer.TYPE).invoke(null, obj, Integer.valueOf(i6));
    }

    @Override
    public ProviderInfo generateProviderInfo(Object obj, int i6) {
        Class<?> cls = this.sPackageParserClass;
        Class cls2 = Integer.TYPE;
        return (ProviderInfo) MethodUtils.getAccessibleMethod(cls, "generateProviderInfo", this.sProviderClass, cls2, this.sPackageUserStateClass, cls2).invoke(null, obj, Integer.valueOf(i6), this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
    }

    @Override
    public ServiceInfo generateServiceInfo(Object obj, int i6) {
        Class<?> cls = this.sPackageParserClass;
        Class cls2 = Integer.TYPE;
        return (ServiceInfo) MethodUtils.getAccessibleMethod(cls, "generateServiceInfo", this.sServiceClass, cls2, this.sPackageUserStateClass, cls2).invoke(null, obj, Integer.valueOf(i6), this.mDefaultPackageUserState, Integer.valueOf(this.mUserId));
    }

    @Override
    public List getActivities() {
        return (List) FieldUtils.readField(this.mPackage, "activities");
    }

    @Override
    public List getInstrumentations() {
        return (List) FieldUtils.readField(this.mPackage, "instrumentation");
    }

    @Override
    public String getPackageName() {
        return (String) FieldUtils.readField(this.mPackage, "packageName");
    }

    @Override
    public List getPermissionGroups() {
        return (List) FieldUtils.readField(this.mPackage, "permissionGroups");
    }

    @Override
    public List getPermissions() {
        return (List) FieldUtils.readField(this.mPackage, "permissions");
    }

    @Override
    public List getProviders() {
        return (List) FieldUtils.readField(this.mPackage, "providers");
    }

    @Override
    public List getReceivers() {
        return (List) FieldUtils.readField(this.mPackage, "receivers");
    }

    @Override
    public List getRequestedPermissions() {
        return (List) FieldUtils.readField(this.mPackage, "requestedPermissions");
    }

    @Override
    public List getServices() {
        return (List) FieldUtils.readField(this.mPackage, "services");
    }

    @Override
    public void parsePackage(File file, int i6) {
        Object newInstance = this.sPackageParserClass.newInstance();
        this.mPackageParser = newInstance;
        this.mPackage = MethodUtils.invokeMethod(newInstance, "parsePackage", file, Integer.valueOf(i6));
    }

    @Override
    public List<IntentFilter> readIntentFilterFromComponent(Object obj) {
        return (List) FieldUtils.readField(obj, "intents");
    }

    @Override
    public String readNameFromComponent(Object obj) {
        return (String) FieldUtils.readField(obj, "className");
    }

    @Override
    public void writeSignature(Signature[] signatureArr) {
        FieldUtils.writeField(this.mPackage, "mSignatures", signatureArr);
    }
}