From b181118b6e58c0014da4e9d52bf38548adc73a8a Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 21 May 2009 15:45:42 -0700 Subject: [PATCH] Define TARGET_CPU_ABI for finding native code in .apks --- api/current.xml | 10 ++++ cmds/pm/src/com/android/commands/pm/Pm.java | 3 ++ .../android/content/pm/PackageManager.java | 9 ++++ core/java/android/os/Build.java | 3 ++ .../android/server/PackageManagerService.java | 47 +++++++++++-------- 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/api/current.xml b/api/current.xml index 436b24ac7147f..53e268bc127a8 100644 --- a/api/current.xml +++ b/api/current.xml @@ -89822,6 +89822,16 @@ visibility="public" > + + entries = @@ -2460,9 +2454,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; @@ -2473,6 +2473,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); @@ -2484,19 +2487,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,