package com.lody.virtual.server.am; import com.lody.virtual.helper.utils.FileUtils; import com.lody.virtual.helper.utils.VLog; import com.lody.virtual.os.VEnvironment; import com.lody.virtual.server.pm.parser.VPackage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.Map; import static android.os.Process.FIRST_APPLICATION_UID; /** * @author Lody */ public class UidSystem { private static final String TAG = UidSystem.class.getSimpleName(); private final HashMap<String, Integer> mSharedUserIdMap = new HashMap<>(); private int mFreeUid = FIRST_APPLICATION_UID; public void initUidList() { mSharedUserIdMap.clear(); File uidFile = VEnvironment.getUidListFile(); if (!loadUidList(uidFile)) { File bakUidFile = VEnvironment.getBakUidListFile(); loadUidList(bakUidFile); } } private boolean loadUidList(File uidFile) { if (!uidFile.exists()) { return false; } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream(uidFile)); mFreeUid = is.readInt(); //noinspection unchecked Map<String, Integer> map = (HashMap<String, Integer>) is.readObject(); mSharedUserIdMap.putAll(map); is.close(); } catch (Throwable e) { return false; } return true; } private void save() { File uidFile = VEnvironment.getUidListFile(); File bakUidFile = VEnvironment.getBakUidListFile(); if (uidFile.exists()) { if (bakUidFile.exists() && !bakUidFile.delete()) { VLog.w(TAG, "Warning: Unable to delete the expired file --\n " + bakUidFile.getPath()); } try { FileUtils.copyFile(uidFile, bakUidFile); } catch (IOException e) { e.printStackTrace(); } } try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(uidFile)); os.writeInt(mFreeUid); os.writeObject(mSharedUserIdMap); os.close(); } catch (IOException e) { e.printStackTrace(); } } public int getOrCreateUid(VPackage pkg) { String sharedUserId = pkg.mSharedUserId; if (sharedUserId == null) { sharedUserId = pkg.packageName; } Integer uid = mSharedUserIdMap.get(sharedUserId); if (uid != null) { return uid; } int newUid = ++mFreeUid; mSharedUserIdMap.put(sharedUserId, newUid); save(); return newUid; } }