code: package com.lody.virtual.client.env;
  
  import android.content.pm.ApplicationInfo;
  import android.os.Build;
  import android.os.Handler;
  import android.os.Looper;
  import android.os.Process;
  import android.os.RemoteException;
  
  import com.lody.virtual.client.core.VirtualCore;
  import com.lody.virtual.helper.utils.VLog;
  
  import mirror.android.ddm.DdmHandleAppName;
  import mirror.android.ddm.DdmHandleAppNameJBMR1;
  
  /**
   * @author Lody
   *         <p>
   *         <p/>
   *         Runtime Environment for App.
   */
  public class VirtualRuntime {
  
      private static final Handler sUIHandler = new Handler(Looper.getMainLooper());
  
      private static String sInitialPackageName;
      private static String sProcessName;
  
      public static Handler getUIHandler() {
          return sUIHandler;
      }
  
      public static String getProcessName() {
          return sProcessName;
      }
  
      public static String getInitialPackageName() {
          return sInitialPackageName;
      }
  
      public static void setupRuntime(String processName, ApplicationInfo appInfo) {
          if (sProcessName != null) {
              return;
          }
          sInitialPackageName = appInfo.packageName;
          sProcessName = processName;
          mirror.android.os.Process.setArgV0.call(processName);
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
              DdmHandleAppNameJBMR1.setAppName.call(processName, 0);
          } else {
              DdmHandleAppName.setAppName.call(processName);
          }
      }
  
      public static <T> T crash(RemoteException e) throws RuntimeException {
          e.printStackTrace();
          if (VirtualCore.get().isVAppProcess()) {
              Process.killProcess(Process.myPid());
              System.exit(0);
          }
          throw new DeadServerException(e);
      }
  
  
      public static boolean isArt() {
          return System.getProperty("java.vm.version").startsWith("2");
      }
  }
  