OSDN Git Service

framework: add neon white list mechanism for applications installed with ABI2
authorZhenghua Wang <zhenghua.wang@intel.com>
Mon, 31 Dec 2012 03:12:37 +0000 (11:12 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Wed, 25 Sep 2013 02:48:25 +0000 (10:48 +0800)
BZ: 76964

add neon white list mechanism for applications installed with ABI2.

Change-Id: I1f900ae63252f1443086ceb06a0e07a89ca42965
Signed-off-by: llin4 <ling.lin@intel.com>
Reviewed-on: http://android.intel.com:8080/84166
Reviewed-by: Wang, Zhenghua <zhenghua.wang@intel.com>
Tested-by: Li, XiaojingX <xiaojingx.li@intel.com>
Reviewed-by: cactus <cactus@intel.com>
Tested-by: cactus <cactus@intel.com>
services/java/com/android/server/pm/PackageManagerService.java
services/java/com/android/server/pm/xmlCheckExt.java

index 3bcc26b..d8eff02 100644 (file)
@@ -495,6 +495,8 @@ public class PackageManagerService extends IPackageManager.Stub {
 
     // Packages that have been installed with library matching 2nd ABI.
     final HashMap<Integer, String> mPackagesMatchABI2 = new HashMap<Integer,String>();
+    // Packages that have been installed with library matching 2nd ABI and matching neon app list
+    final HashMap<Integer, String> mPackagesMatchABI2Neon = new HashMap<Integer,String>();
 
     static final int SEND_PENDING_BROADCAST = 1;
     static final int MCS_BOUND = 3;
@@ -3794,7 +3796,7 @@ public class PackageManagerService extends IPackageManager.Stub {
         return new File(mUserAppDataDir.getAbsolutePath() + File.separator + userId);
     }
 
-    private void writeAppwithABI2() {
+    private void writeAppwithABI2Internal(String fileName, HashMap<Integer, String> map) {
         File outputFile;
         FileOutputStream out = null;
         File appDataDir = new File("/data/data");
@@ -3802,7 +3804,7 @@ public class PackageManagerService extends IPackageManager.Stub {
         try {
             File tempFile = File.createTempFile("tmp", "tmp", appDataDir);
             String tempFilePath = tempFile.getPath();
-            outputFile = new File("/data/data/.appwithABI2");
+            outputFile = new File(fileName);
             if (FileUtils.setPermissions(tempFilePath,
                 FileUtils.S_IRUSR | FileUtils.S_IWUSR |
                 FileUtils.S_IRGRP | FileUtils.S_IROTH, -1, -1) != 0
@@ -3811,7 +3813,7 @@ public class PackageManagerService extends IPackageManager.Stub {
             }
             out = new FileOutputStream(outputFile);
             Iterator<HashMap.Entry<Integer, String>>
-            it = mPackagesMatchABI2.entrySet().iterator();
+            it = map.entrySet().iterator();
             while (it.hasNext()) {
                 HashMap.Entry<Integer, String> ent = it.next();
                 int userID = ent.getKey().intValue();
@@ -3822,17 +3824,25 @@ public class PackageManagerService extends IPackageManager.Stub {
                 Slog.i(TAG, "Data written:"+ userID);
             }
         } catch (Exception e) {
-            Slog.e(TAG, "File Access Error: Not Able to write Data into /data/data/.appwithABI2");
+            Slog.e(TAG, "File Access Error: Not Able to write Data into " + fileName);
         } finally {
             try {
                 if (out != null) {
                     out.close();
-                    Slog.i(TAG, "Data written into /data/data/.appwithABI2");
+                    Slog.i(TAG, "Data written into " + fileName);
                 }
             } catch (IOException e) {}
         }
     }
 
+    private void writeAppwithABI2() {
+        writeAppwithABI2Internal(new String("/data/data/.appwithABI2"), mPackagesMatchABI2);
+    }
+
+    private void writeAppwithABI2Neon() {
+        writeAppwithABI2Internal(new String("/data/data/.appwithABI2neon"), mPackagesMatchABI2Neon);
+    }
+
     private File getDataPathForPackage(String packageName, int userId) {
         /*
          * Until we fully support multiple users, return the directory we
@@ -4163,7 +4173,7 @@ public class PackageManagerService extends IPackageManager.Stub {
 
                     if (result == PackageManager.INSTALL_ABI2_SUCCEEDED) {
                         ICheckExt check = new CheckExt();
-                        if(check.doCheck(pkg.packageName)){
+                        if(check.doCheck(pkg.packageName, new String("filter"))){
                             Slog.i(TAG, "Reject application in black list::" + pkg.packageName);
                             mLastScanError = PackageManager.INSTALL_FAILED_INVALID_APK;
                             return null;
@@ -4485,10 +4495,14 @@ public class PackageManagerService extends IPackageManager.Stub {
                                     Slog.i(TAG, "Replace package with primary ABI Library");
                                     mPackagesMatchABI2.remove(pkgUidInt);
                                     writeAppwithABI2();
+                                    if (mPackagesMatchABI2Neon.containsKey(pkgUidInt)) {
+                                        mPackagesMatchABI2Neon.remove(pkgUidInt);
+                                        writeAppwithABI2Neon();
+                                    }
                                 }
                             } else if (copyRet == PackageManager.INSTALL_ABI2_SUCCEEDED) {
                                 ICheckExt check = new CheckExt();
-                                if(check.doCheck(pkgName)) {
+                                if(check.doCheck(pkgName, new String("filter"))) {
                                     Slog.i(TAG, "Package with second ABI is in black list: " + pkgUidInt + pkg.applicationInfo.processName);
                                     mLastScanError = PackageManager.INSTALL_FAILED_INVALID_APK;
                                     return null;
@@ -4496,6 +4510,10 @@ public class PackageManagerService extends IPackageManager.Stub {
                                 Slog.i(TAG, "Package installed with second ABI Library: " + pkgUidInt + pkg.applicationInfo.processName);
                                 mPackagesMatchABI2.put(pkgUidInt, pkg.applicationInfo.processName);
                                 writeAppwithABI2();
+                                if (check.doCheck(pkgName, new String("neon"))) {
+                                    mPackagesMatchABI2Neon.put(pkgUidInt, pkg.applicationInfo.processName);
+                                    writeAppwithABI2Neon();
+                                }
                             } else {
                                 Slog.e(TAG, "Unable to copy native libraries");
                                 mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
@@ -4991,10 +5009,15 @@ public class PackageManagerService extends IPackageManager.Stub {
                 cleanPackageDataStructuresLILPw(pkg, chatty);
 
                 String abi2 = SystemProperties.get("ro.product.cpu.abi2");
-                if (abi2.length() != 0 && mPackagesMatchABI2.containsKey(new Integer(pkg.applicationInfo.uid))) {
+                Integer pkgUidInt = new Integer(pkg.applicationInfo.uid);
+                if (abi2.length() != 0 && mPackagesMatchABI2.containsKey(pkgUidInt)) {
                     Slog.i(TAG, "Uninstall package with second ABI Library");
-                    mPackagesMatchABI2.remove(new Integer(pkg.applicationInfo.uid));
+                    mPackagesMatchABI2.remove(pkgUidInt);
                     writeAppwithABI2();
+                    if (mPackagesMatchABI2Neon.containsKey(pkgUidInt)) {
+                        mPackagesMatchABI2Neon.remove(pkgUidInt);
+                        writeAppwithABI2Neon();
+                    }
                 }
 
             }
@@ -5020,6 +5043,10 @@ public class PackageManagerService extends IPackageManager.Stub {
                 Slog.i(TAG, "Uninstall package with second ABI Library");
                 mPackagesMatchABI2.remove(new Integer(pkg.applicationInfo.uid));
                 writeAppwithABI2();
+                if (mPackagesMatchABI2Neon.containsKey(new Integer(pkg.applicationInfo.uid))) {
+                    mPackagesMatchABI2Neon.remove(new Integer(pkg.applicationInfo.uid));
+                    writeAppwithABI2Neon();
+                }
             }
 
         }
index 30b6626..13c72d2 100644 (file)
@@ -41,12 +41,14 @@ public class xmlCheckExt implements ICheckExt {
 
     public boolean doCheck(String... params) {
         String param = null;
+        String param_tag = null;
         try {
             int eventType;
             String tag;
             if (params.length == 0)
                 return false;
             param = params[0];
+            param_tag = params[1];
             XmlPullParser xmlParser = Xml.newPullParser();
             File file = new File(CHECKXMLPATH);
             if (!file.exists())
@@ -83,7 +85,7 @@ public class xmlCheckExt implements ICheckExt {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
-        return checkPkgName(param);
+        return checkPkgName(param, param_tag);
     }
 
     /*Function:checkTag
@@ -103,8 +105,12 @@ public class xmlCheckExt implements ICheckExt {
         return true;
     }
 
-    boolean checkPkgName(String pkgName) {
-        return mMap.containsKey(pkgName);
+    boolean checkPkgName(String pkgName, String tag) {
+        String value = mMap.get(pkgName);
+        if (value == null)
+            return false;
+        else
+            return value.equals(tag);
     }
 
 }