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:
committed by
android-build SharedAccount
parent
3b70e159a8
commit
24a03083ca
@@ -3623,21 +3623,19 @@ 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() ||
|
if (Config.LOGD) {
|
||||||
sharedLibraryFile.lastModified() != entry.getTime()) {
|
Log.d(TAG, "Caching shared lib " + entry.getName());
|
||||||
if (Config.LOGD) {
|
|
||||||
Log.d(TAG, "Caching shared lib " + entry.getName());
|
|
||||||
}
|
|
||||||
if (mInstaller == null) {
|
|
||||||
sharedLibraryDir.mkdir();
|
|
||||||
}
|
|
||||||
cacheNativeBinaryLI(pkg, zipFile, entry, sharedLibraryDir,
|
|
||||||
sharedLibraryFile);
|
|
||||||
}
|
}
|
||||||
|
if (mInstaller == null) {
|
||||||
|
sharedLibraryDir.mkdir();
|
||||||
|
}
|
||||||
|
cacheNativeBinaryLI(pkg, zipFile, entry, sharedLibraryDir,
|
||||||
|
sharedLibraryFile);
|
||||||
}
|
}
|
||||||
if (!hasNativeLibraries)
|
if (!hasNativeLibraries)
|
||||||
return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
|
return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
|
||||||
@@ -3679,18 +3677,16 @@ 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() ||
|
if (Config.LOGD) {
|
||||||
installGdbServerFile.lastModified() != entry.getTime()) {
|
Log.d(TAG, "Caching gdbserver " + entry.getName());
|
||||||
if (Config.LOGD) {
|
|
||||||
Log.d(TAG, "Caching gdbserver " + entry.getName());
|
|
||||||
}
|
|
||||||
if (mInstaller == null) {
|
|
||||||
installGdbServerDir.mkdir();
|
|
||||||
}
|
|
||||||
cacheNativeBinaryLI(pkg, zipFile, entry, installGdbServerDir,
|
|
||||||
installGdbServerFile);
|
|
||||||
}
|
}
|
||||||
|
if (mInstaller == null) {
|
||||||
|
installGdbServerDir.mkdir();
|
||||||
|
}
|
||||||
|
cacheNativeBinaryLI(pkg, zipFile, entry, installGdbServerDir,
|
||||||
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user