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