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);
}
}