PackageManagerService: always install native binaries from .apk

The previous implementation fails to work properly when the .apk
and installed versions of the binaries have the same size and date.

Change-Id: I063817a935da9ad459858d7eec8bb3d940607850
This commit is contained in:
David 'Digit' Turner
2010-06-03 14:37:42 -07:00
committed by android-build SharedAccount
parent 3b70e159a8
commit 24a03083ca

View File

@@ -3623,12 +3623,11 @@ class PackageManagerService extends IPackageManager.Stub {
installedNativeLibraries = true; installedNativeLibraries = true;
// Always extract the shared library
String sharedLibraryFilePath = sharedLibraryDir.getPath() + String sharedLibraryFilePath = sharedLibraryDir.getPath() +
File.separator + libFileName; File.separator + libFileName;
File sharedLibraryFile = new File(sharedLibraryFilePath); File sharedLibraryFile = new File(sharedLibraryFilePath);
if (! sharedLibraryFile.exists() ||
sharedLibraryFile.length() != entry.getSize() ||
sharedLibraryFile.lastModified() != entry.getTime()) {
if (Config.LOGD) { if (Config.LOGD) {
Log.d(TAG, "Caching shared lib " + entry.getName()); Log.d(TAG, "Caching shared lib " + entry.getName());
} }
@@ -3638,7 +3637,6 @@ class PackageManagerService extends IPackageManager.Stub {
cacheNativeBinaryLI(pkg, zipFile, entry, sharedLibraryDir, cacheNativeBinaryLI(pkg, zipFile, entry, sharedLibraryDir,
sharedLibraryFile); sharedLibraryFile);
} }
}
if (!hasNativeLibraries) if (!hasNativeLibraries)
return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES; return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
@@ -3679,9 +3677,7 @@ class PackageManagerService extends IPackageManager.Stub {
String installGdbServerPath = installGdbServerDir.getPath() + String installGdbServerPath = installGdbServerDir.getPath() +
"/" + GDBSERVER; "/" + GDBSERVER;
File installGdbServerFile = new File(installGdbServerPath); File installGdbServerFile = new File(installGdbServerPath);
if (! installGdbServerFile.exists() ||
installGdbServerFile.length() != entry.getSize() ||
installGdbServerFile.lastModified() != entry.getTime()) {
if (Config.LOGD) { if (Config.LOGD) {
Log.d(TAG, "Caching gdbserver " + entry.getName()); Log.d(TAG, "Caching gdbserver " + entry.getName());
} }
@@ -3690,7 +3686,7 @@ class PackageManagerService extends IPackageManager.Stub {
} }
cacheNativeBinaryLI(pkg, zipFile, entry, installGdbServerDir, cacheNativeBinaryLI(pkg, zipFile, entry, installGdbServerDir,
installGdbServerFile); installGdbServerFile);
}
return PACKAGE_INSTALL_NATIVE_FOUND_LIBRARIES; return PACKAGE_INSTALL_NATIVE_FOUND_LIBRARIES;
} }
return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES; return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
@@ -3704,6 +3700,16 @@ class PackageManagerService extends IPackageManager.Stub {
// one if ro.product.cpu.abi2 is defined. // one if ro.product.cpu.abi2 is defined.
// //
private int cachePackageSharedLibsLI(PackageParser.Package pkg, File scanFile) { private int cachePackageSharedLibsLI(PackageParser.Package pkg, File scanFile) {
// Remove all native binaries from a directory. This is used when upgrading
// a package: in case the new .apk doesn't contain a native binary that was
// in the old one (and thus installed), we need to remove it from
// /data/data/<appname>/lib
//
// The simplest way to do that is to remove all files in this directory,
// since it is owned by "system", applications are not supposed to write
// anything there.
removeNativeBinariesLI(pkg);
String cpuAbi = Build.CPU_ABI; String cpuAbi = Build.CPU_ABI;
try { try {
int result = cachePackageSharedLibsForAbiLI(pkg, scanFile, cpuAbi); int result = cachePackageSharedLibsForAbiLI(pkg, scanFile, cpuAbi);