package com.lody.virtual.helper.compat; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageParser; import android.content.pm.PackageParser.Activity; import android.content.pm.PackageParser.Package; import android.content.pm.PackageParser.Provider; import android.content.pm.PackageParser.Service; import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import android.os.Build; import android.os.Process; import android.util.DisplayMetrics; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.os.VUserHandle; import java.io.File; import mirror.android.content.pm.PackageParserJellyBean; import mirror.android.content.pm.PackageParserJellyBean17; import mirror.android.content.pm.PackageParserLollipop; import mirror.android.content.pm.PackageParserLollipop22; import mirror.android.content.pm.PackageParserMarshmallow; import mirror.android.content.pm.PackageParserNougat; import mirror.android.content.pm.PackageUserState; import static android.os.Build.VERSION_CODES.JELLY_BEAN; import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1; import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.N; /** * @author Lody */ public class PackageParserCompat { public static final int[] GIDS = VirtualCore.get().getGids(); private static final int API_LEVEL = Build.VERSION.SDK_INT; private static final int myUserId = VUserHandle.getUserId(Process.myUid()); private static final Object sUserState = API_LEVEL >= JELLY_BEAN_MR1 ? PackageUserState.ctor.newInstance() : null; public static PackageParser createParser(File packageFile) { if (API_LEVEL >= M) { return PackageParserMarshmallow.ctor.newInstance(); } else if (API_LEVEL >= LOLLIPOP_MR1) { return PackageParserLollipop22.ctor.newInstance(); } else if (API_LEVEL >= LOLLIPOP) { return PackageParserLollipop.ctor.newInstance(); } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.ctor.newInstance(packageFile.getAbsolutePath()); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.ctor.newInstance(packageFile.getAbsolutePath()); } else { return mirror.android.content.pm.PackageParser.ctor.newInstance(packageFile.getAbsolutePath()); } } public static Package parsePackage(PackageParser parser, File packageFile, int flags) throws Throwable { if (API_LEVEL >= M) { return PackageParserMarshmallow.parsePackage.callWithException(parser, packageFile, flags); } else if (API_LEVEL >= LOLLIPOP_MR1) { return PackageParserLollipop22.parsePackage.callWithException(parser, packageFile, flags); } else if (API_LEVEL >= LOLLIPOP) { return PackageParserLollipop.parsePackage.callWithException(parser, packageFile, flags); } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.parsePackage.callWithException(parser, packageFile, null, new DisplayMetrics(), flags); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.parsePackage.callWithException(parser, packageFile, null, new DisplayMetrics(), flags); } else { return mirror.android.content.pm.PackageParser.parsePackage.callWithException(parser, packageFile, null, new DisplayMetrics(), flags); } } public static ServiceInfo generateServiceInfo(Service service, int flags) { if (API_LEVEL >= M) { return PackageParserMarshmallow.generateServiceInfo.call(service, flags, sUserState, myUserId); } else if (API_LEVEL >= LOLLIPOP_MR1) { return PackageParserLollipop22.generateServiceInfo.call(service, flags, sUserState, myUserId); } else if (API_LEVEL >= LOLLIPOP) { return PackageParserLollipop.generateServiceInfo.call(service, flags, sUserState, myUserId); } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.generateServiceInfo.call(service, flags, sUserState, myUserId); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.generateServiceInfo.call(service, flags, false, 1, myUserId); } else { return mirror.android.content.pm.PackageParser.generateServiceInfo.call(service, flags); } } public static ApplicationInfo generateApplicationInfo(Package p, int flags) { if (API_LEVEL >= M) { return PackageParserMarshmallow.generateApplicationInfo.call(p, flags, sUserState); } else if (API_LEVEL >= LOLLIPOP_MR1) { return PackageParserLollipop22.generateApplicationInfo.call(p, flags, sUserState); } else if (API_LEVEL >= LOLLIPOP) { return PackageParserLollipop.generateApplicationInfo.call(p, flags, sUserState); } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.generateApplicationInfo.call(p, flags, sUserState); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.generateApplicationInfo.call(p, flags, false, 1); } else { return mirror.android.content.pm.PackageParser.generateApplicationInfo.call(p, flags); } } public static ActivityInfo generateActivityInfo(Activity activity, int flags) { if (API_LEVEL >= M) { return PackageParserMarshmallow.generateActivityInfo.call(activity, flags, sUserState, myUserId); } else if (API_LEVEL >= LOLLIPOP_MR1) { return PackageParserLollipop22.generateActivityInfo.call(activity, flags, sUserState, myUserId); } else if (API_LEVEL >= LOLLIPOP) { return PackageParserLollipop.generateActivityInfo.call(activity, flags, sUserState, myUserId); } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.generateActivityInfo.call(activity, flags, sUserState, myUserId); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.generateActivityInfo.call(activity, flags, false, 1, myUserId); } else { return mirror.android.content.pm.PackageParser.generateActivityInfo.call(activity, flags); } } public static ProviderInfo generateProviderInfo(Provider provider, int flags) { if (API_LEVEL >= M) { return PackageParserMarshmallow.generateProviderInfo.call(provider, flags, sUserState, myUserId); } else if (API_LEVEL >= LOLLIPOP_MR1) { return PackageParserLollipop22.generateProviderInfo.call(provider, flags, sUserState, myUserId); } else if (API_LEVEL >= LOLLIPOP) { return PackageParserLollipop.generateProviderInfo.call(provider, flags, sUserState, myUserId); } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.generateProviderInfo.call(provider, flags, sUserState, myUserId); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.generateProviderInfo.call(provider, flags, false, 1, myUserId); } else { return mirror.android.content.pm.PackageParser.generateProviderInfo.call(provider, flags); } } public static PackageInfo generatePackageInfo(Package p, int flags, long firstInstallTime, long lastUpdateTime) { if (API_LEVEL >= M) { return PackageParserMarshmallow.generatePackageInfo.call(p, GIDS, flags, firstInstallTime, lastUpdateTime, null, sUserState); } else if (API_LEVEL >= LOLLIPOP) { if (PackageParserLollipop22.generatePackageInfo != null) { return PackageParserLollipop22.generatePackageInfo.call(p, GIDS, flags, firstInstallTime, lastUpdateTime, null, sUserState); } else { return PackageParserLollipop.generatePackageInfo.call(p, GIDS, flags, firstInstallTime, lastUpdateTime, null, sUserState); } } else if (API_LEVEL >= JELLY_BEAN_MR1) { return PackageParserJellyBean17.generatePackageInfo.call(p, GIDS, flags, firstInstallTime, lastUpdateTime, null, sUserState); } else if (API_LEVEL >= JELLY_BEAN) { return PackageParserJellyBean.generatePackageInfo.call(p, GIDS, flags, firstInstallTime, lastUpdateTime, null); } else { return mirror.android.content.pm.PackageParser.generatePackageInfo.call(p, GIDS, flags, firstInstallTime, lastUpdateTime); } } public static void collectCertificates(PackageParser parser, Package p, int flags) throws Throwable { if (API_LEVEL >= N) { PackageParserNougat.collectCertificates.callWithException(p, flags); } else if (API_LEVEL >= M) { PackageParserMarshmallow.collectCertificates.callWithException(parser, p, flags); } else if (API_LEVEL >= LOLLIPOP_MR1) { PackageParserLollipop22.collectCertificates.callWithException(parser, p, flags); } else if (API_LEVEL >= LOLLIPOP) { PackageParserLollipop.collectCertificates.callWithException(parser, p, flags); } else if (API_LEVEL >= JELLY_BEAN_MR1) { PackageParserJellyBean17.collectCertificates.callWithException(parser, p, flags); } else if (API_LEVEL >= JELLY_BEAN) { PackageParserJellyBean.collectCertificates.callWithException(parser, p, flags); } else { mirror.android.content.pm.PackageParser.collectCertificates.call(parser, p, flags); } } }