diff options
author | Dianne Hackborn <hackbod@google.com> | 2009-05-22 18:47:12 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-05-22 18:47:12 -0700 |
commit | 385bb79ebb436e5672915eac2fc1a4fcdedf88b6 (patch) | |
tree | 8c11ac02a3d83f8e590a5b8f041f403889775467 | |
parent | aaafa4fb1cda4dd4e1a261a1c196865ac0a14105 (diff) | |
parent | b181118b6e58c0014da4e9d52bf38548adc73a8a (diff) | |
download | frameworks_base-385bb79ebb436e5672915eac2fc1a4fcdedf88b6.zip frameworks_base-385bb79ebb436e5672915eac2fc1a4fcdedf88b6.tar.gz frameworks_base-385bb79ebb436e5672915eac2fc1a4fcdedf88b6.tar.bz2 |
am b181118b: Define TARGET_CPU_ABI for finding native code in .apks
Merge commit 'b181118b6e58c0014da4e9d52bf38548adc73a8a'
* commit 'b181118b6e58c0014da4e9d52bf38548adc73a8a':
Define TARGET_CPU_ABI for finding native code in .apks
-rw-r--r-- | api/current.xml | 10 | ||||
-rw-r--r-- | cmds/pm/src/com/android/commands/pm/Pm.java | 3 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 9 | ||||
-rw-r--r-- | core/java/android/os/Build.java | 3 | ||||
-rw-r--r-- | services/java/com/android/server/PackageManagerService.java | 47 |
5 files changed, 52 insertions, 20 deletions
diff --git a/api/current.xml b/api/current.xml index 54d98a7..1743bd4 100644 --- a/api/current.xml +++ b/api/current.xml @@ -92998,6 +92998,16 @@ visibility="public" > </field> +<field name="CPU_ABI" + type="java.lang.String" + transient="false" + volatile="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="DEVICE" type="java.lang.String" transient="false" diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 8212b92..fd9e708 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -543,6 +543,9 @@ public final class Pm { case PackageManager.INSTALL_FAILED_TEST_ONLY: s = "INSTALL_FAILED_TEST_ONLY"; break; + case PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE: + s = "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE"; + break; case PackageManager.INSTALL_PARSE_FAILED_NOT_APK: s = "INSTALL_PARSE_FAILED_NOT_APK"; break; diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index fcff1a8..147968b 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -398,6 +398,15 @@ public abstract class PackageManager { public static final int INSTALL_FAILED_TEST_ONLY = -15; /** + * Installation return code: this is passed to the {@link IPackageInstallObserver} by + * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} if + * the package being installed contains native code, but none that is + * compatible with the the device's CPU_ABI. + * @hide + */ + public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16; + + /** * Installation parse return code: this is passed to the {@link IPackageInstallObserver} by * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} * if the parser was given a path that is not a file, or does not end with the expected diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 101336b..963875d 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -38,6 +38,9 @@ public class Build { /** The name of the underlying board, like "goldfish". */ public static final String BOARD = getString("ro.product.board"); + /** The name of the instruction set (CPU type + ABI convention) of native code. */ + public static final String CPU_ABI = getString("ro.product.cpu.abi"); + /** The manufacturer of the product/hardware. */ public static final String MANUFACTURER = getString("ro.product.manufacturer"); diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 1cfe002..a1866be 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -2154,16 +2154,9 @@ class PackageManagerService extends IPackageManager.Stub { String path = scanFile.getPath(); if (scanFileNewer) { Log.i(TAG, path + " changed; unpacking"); - try { - cachePackageSharedLibsLI(pkg, dataPath, scanFile); - } catch (IOException e) { - Log.e(TAG, "Failure extracting shared libs", e); - if(mInstaller != null) { - mInstaller.remove(pkgName); - } else { - dataPath.delete(); - } - mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; + int err = cachePackageSharedLibsLI(pkg, dataPath, scanFile); + if (err != PackageManager.INSTALL_SUCCEEDED) { + mLastScanError = err; return null; } } @@ -2447,14 +2440,15 @@ class PackageManagerService extends IPackageManager.Stub { return pkg; } - private void cachePackageSharedLibsLI(PackageParser.Package pkg, - File dataPath, File scanFile) throws IOException { + private int cachePackageSharedLibsLI(PackageParser.Package pkg, + File dataPath, File scanFile) { File sharedLibraryDir = new File(dataPath.getPath() + "/lib"); - final String sharedLibraryABI = "armeabi"; + final String sharedLibraryABI = Build.CPU_ABI; final String apkLibraryDirectory = "lib/" + sharedLibraryABI + "/"; final String apkSharedLibraryPrefix = apkLibraryDirectory + "lib"; final String sharedLibrarySuffix = ".so"; - boolean createdSharedLib = false; + boolean hasNativeCode = false; + boolean installedNativeCode = false; try { ZipFile zipFile = new ZipFile(scanFile); Enumeration<ZipEntry> entries = @@ -2463,9 +2457,15 @@ class PackageManagerService extends IPackageManager.Stub { while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); if (entry.isDirectory()) { + if (!hasNativeCode && entry.getName().startsWith("lib")) { + hasNativeCode = true; + } continue; } String entryName = entry.getName(); + if (entryName.startsWith("lib/")) { + hasNativeCode = true; + } if (! (entryName.startsWith(apkSharedLibraryPrefix) && entryName.endsWith(sharedLibrarySuffix))) { continue; @@ -2476,6 +2476,9 @@ class PackageManagerService extends IPackageManager.Stub { || (!FileUtils.isFilenameSafe(new File(libFileName)))) { continue; } + + installedNativeCode = true; + String sharedLibraryFilePath = sharedLibraryDir.getPath() + File.separator + libFileName; File sharedLibraryFile = new File(sharedLibraryFilePath); @@ -2487,19 +2490,23 @@ class PackageManagerService extends IPackageManager.Stub { } if (mInstaller == null) { sharedLibraryDir.mkdir(); - createdSharedLib = true; } cacheSharedLibLI(pkg, zipFile, entry, sharedLibraryDir, sharedLibraryFile); } } } catch (IOException e) { - Log.e(TAG, "Failed to cache package shared libs", e); - if(createdSharedLib) { - sharedLibraryDir.delete(); - } - throw e; + Log.w(TAG, "Failed to cache package shared libs", e); + return PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; } + + if (hasNativeCode && !installedNativeCode) { + Log.w(TAG, "Install failed: .apk has native code but none for arch " + + Build.CPU_ABI); + return PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE; + } + + return PackageManager.INSTALL_SUCCEEDED; } private void cacheSharedLibLI(PackageParser.Package pkg, |