diff --git a/aosp/frameworks/base/services/core/java/com/android/server/pm/AppIdSettingMapHelper.java b/aosp/frameworks/base/services/core/java/com/android/server/pm/AppIdSettingMapHelper.java index b19a6f9603d60b2e401b7fc48ca4efa379bab9de..79e6be5c3d23085ab5c2b733b0405d657b233493 100644 --- a/aosp/frameworks/base/services/core/java/com/android/server/pm/AppIdSettingMapHelper.java +++ b/aosp/frameworks/base/services/core/java/com/android/server/pm/AppIdSettingMapHelper.java @@ -12,10 +12,10 @@ package com.android.server.pm; -import android.content.res.Resources; -import android.content.res.XmlResourceParser; import android.os.FileObserver; import android.os.Process; +import android.system.Os; +import android.system.StructStat; import android.util.Log; import com.android.server.utils.WatchedArrayList; @@ -47,7 +47,7 @@ public class AppIdSettingMapHelper { @Override public void onEvent(int event, String path) { switch (event) { - case FileObserver.MODIFY: + case FileObserver.CLOSE_WRITE: parseAssignAppXml(); Log.i(TAG, "share_apps.xml has been modify."); break; @@ -82,8 +82,8 @@ public class AppIdSettingMapHelper { public boolean isLastApplicationUid(int mFirstAvailableUid, WatchedArrayList mUserIds, int sum) { // If mFirstAvailableUid increase to Process.LAST_APPLICATION_UID, // just looking for available uid from index 0. - return (mFirstAvailableUid > Process.LAST_APPLICATION_UID) - || (mFirstAvailableUid == Process.LAST_APPLICATION_UID && mUserIds.get(sum - 1) != null); + return (mFirstAvailableUid > getLastApplicationUid()) + || (mFirstAvailableUid == getLastApplicationUid() && mUserIds.get(sum - 1) != null); } private void addAssignAppInfo(String packageName, int uid) { @@ -103,14 +103,15 @@ public class AppIdSettingMapHelper { return; } } - parseAssignAppXml(); - // 监听xml是否变化 - startFileObservation(); + if (parseAssignAppXml()) { + startFileObservation(); + } } - private void parseAssignAppXml() { + private boolean parseAssignAppXml() { synchronized (mLock) { FileReader fileReader = null; + Map appInfo = new HashMap<>(); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); @@ -128,11 +129,17 @@ public class AppIdSettingMapHelper { if (tag.equals("package")) { String packageName = parser.getAttributeValue(null, "name"); int uid = Integer.parseInt(parser.getAttributeValue(null, "userId")); - addAssignAppInfo(packageName, uid); - Log.i(TAG, "package = " + packageName + " uid = " + uid); + if (isAssignAppUid(uid)) { + appInfo.put(packageName, uid); + Log.i(TAG, "package = " + packageName + " uid = " + uid); + } } eventType = parser.next(); } + mXmlHasRead = true; + synchronized (this) { + mAssignAppInfo = appInfo; + } } catch (XmlPullParserException e) { Log.e(TAG, "xml parse exception," + e); } catch (IOException e) { @@ -147,9 +154,9 @@ public class AppIdSettingMapHelper { Log.e(TAG, "filereader close exception," + e); } } - mXmlHasRead = true; } } + return mXmlHasRead; } public boolean isAssignAppUid(int uid) { @@ -160,25 +167,50 @@ public class AppIdSettingMapHelper { } } - public int newAssignAppUid(Object obj) { - checkXmlFile(); - if (mAssignAppInfo.isEmpty()) { + private boolean isDirExist(String path) { + File folder = new File(path); + return folder.exists() && folder.isDirectory(); + } + + private int getDirUid(String path) { + try { + StructStat stat = Os.stat(path); + return stat.st_uid; + } catch (Exception e) { + Log.e(TAG, "Get uid from directory failed," + e.getMessage()); return -1; } + } + + public int newAssignAppUid(Object obj) { if (obj == null || !(obj instanceof PackageSetting)) { return -1; } + int uid = -1; PackageSetting p = (PackageSetting) obj; String pkgName = p.getPackageName(); - int uid = mAssignAppInfo.getOrDefault(pkgName, -1); - if (uid == -1) { - return -1; + + String path = "/data/data/" + pkgName; + if (isDirExist(path)) { + uid = getDirUid(path); + if (!isAssignAppUid(uid)) { + return -1; + } + } else { + checkXmlFile(); + synchronized (this) { + if (mAssignAppInfo.isEmpty()) { + return -1; + } + uid = mAssignAppInfo.getOrDefault(pkgName, -1); + } } + if (mAssignUids.containsKey(uid)) { return -1; } mAssignUids.put(uid, obj); - Log.i(TAG, "Create uid " + uid + "success."); + Log.i(TAG, "Create uid " + uid + " success."); return uid; } @@ -193,7 +225,7 @@ public class AppIdSettingMapHelper { public void removeAssignAppUid(int uid) { mAssignUids.remove(uid); - Log.i(TAG, "Remove uid " + uid + "success."); + Log.i(TAG, "Remove uid " + uid + " success."); } public Object getAssignUidObject(int uid) {