code: package com.lody.virtual.server.pm;
  
  import android.os.Parcel;
  
  import com.lody.virtual.helper.PersistenceLayer;
  import com.lody.virtual.os.VEnvironment;
  import com.lody.virtual.server.pm.parser.VPackage;
  
  import java.util.Arrays;
  
  /**
   * @author Lody
   */
  
  class PackagePersistenceLayer extends PersistenceLayer {
  
      private static final char[] MAGIC = {'v', 'p', 'k', 'g'};
      private static final int CURRENT_VERSION = 3;
  
      private VAppManagerService mService;
  
      PackagePersistenceLayer(VAppManagerService service) {
          super(VEnvironment.getPackageListFile());
          mService = service;
      }
  
      @Override
      public int getCurrentVersion() {
          return CURRENT_VERSION;
      }
  
      @Override
      public void writeMagic(Parcel p) {
          p.writeCharArray(MAGIC);
      }
  
      @Override
      public boolean verifyMagic(Parcel p) {
          char[] magic = p.createCharArray();
          return Arrays.equals(magic, MAGIC);
      }
  
  
      @Override
      public void writePersistenceData(Parcel p) {
          synchronized (PackageCacheManager.PACKAGE_CACHE) {
              p.writeInt(PackageCacheManager.PACKAGE_CACHE.size());
              for (VPackage pkg : PackageCacheManager.PACKAGE_CACHE.values()) {
                  PackageSetting ps = (PackageSetting) pkg.mExtras;
                  ps.writeToParcel(p, 0);
              }
          }
      }
  
      @Override
      public void readPersistenceData(Parcel p) {
          int count = p.readInt();
          while (count-- > 0) {
              PackageSetting setting = new PackageSetting(p);
              mService.loadPackage(setting);
          }
      }
  
      @Override
      public boolean onVersionConflict(int fileVersion, int currentVersion) {
          // I am so lazy to process it...
          return false;
      }
  
      @Override
      public void onPersistenceFileDamage() {
          getPersistenceFile().delete();
          VAppManagerService.get().restoreFactoryState();
      }
  }
  