summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2009-05-22 18:47:12 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-05-22 18:47:12 -0700
commit385bb79ebb436e5672915eac2fc1a4fcdedf88b6 (patch)
tree8c11ac02a3d83f8e590a5b8f041f403889775467
parentaaafa4fb1cda4dd4e1a261a1c196865ac0a14105 (diff)
parentb181118b6e58c0014da4e9d52bf38548adc73a8a (diff)
downloadframeworks_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.xml10
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java3
-rw-r--r--core/java/android/content/pm/PackageManager.java9
-rw-r--r--core/java/android/os/Build.java3
-rw-r--r--services/java/com/android/server/PackageManagerService.java47
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,