Merge "Support native shared libs" into oc-dr1-dev

am: 77dea6284a

Change-Id: I69205d02358b025ed00dc7141cb87fd692d0b883
This commit is contained in:
Svetoslav Ganov
2017-06-21 17:38:27 +00:00
committed by android-build-merger
3 changed files with 49 additions and 4 deletions

View File

@@ -455,6 +455,7 @@ public final class LoadedApk {
if (!outZipPaths.contains(lib)) {
outZipPaths.add(index, lib);
index++;
appendApkLibPathIfNeeded(lib, aInfo, outLibPaths);
}
}
}
@@ -463,11 +464,33 @@ public final class LoadedApk {
for (String lib : instrumentationLibs) {
if (!outZipPaths.contains(lib)) {
outZipPaths.add(0, lib);
appendApkLibPathIfNeeded(lib, aInfo, outLibPaths);
}
}
}
}
/**
* This method appends a path to the appropriate native library folder of a
* library if this library is hosted in an APK. This allows support for native
* shared libraries. The library API is determined based on the application
* ABI.
*
* @param path Path to the library.
* @param applicationInfo The application depending on the library.
* @param outLibPaths List to which to add the native lib path if needed.
*/
private static void appendApkLibPathIfNeeded(@NonNull String path,
@NonNull ApplicationInfo applicationInfo, @Nullable List<String> outLibPaths) {
// Looking at the suffix is a little hacky but a safe and simple solution.
// We will be revisiting code in the next release and clean this up.
if (outLibPaths != null && applicationInfo.primaryCpuAbi != null && path.endsWith(".apk")) {
if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O) {
outLibPaths.add(path + "!/lib/" + applicationInfo.primaryCpuAbi);
}
}
}
/*
* All indices received by the super class should be shifted by 1 when accessing mSplitNames,
* etc. The super class assumes the base APK is index 0, while the PackageManager APIs don't

View File

@@ -5989,6 +5989,10 @@ public class PackageParser {
}
}
public boolean isLibrary() {
return staticSharedLibName != null || !ArrayUtils.isEmpty(libraryNames);
}
public List<String> getAllCodePaths() {
ArrayList<String> paths = new ArrayList<>();
paths.add(baseCodePath);

View File

@@ -58,6 +58,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE
import static android.content.pm.PackageManager.INSTALL_FORWARD_LOCK;
import static android.content.pm.PackageManager.INSTALL_INTERNAL;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
@@ -10488,8 +10489,9 @@ public class PackageManagerService extends IPackageManager.Stub
if ((scanFlags & SCAN_NEW_INSTALL) == 0) {
if ((scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi");
derivePackageAbi(
pkg, scanFile, cpuAbiOverride, true /*extractLibs*/, mAppLib32InstallDir);
final boolean extractNativeLibs = !pkg.isLibrary();
derivePackageAbi(pkg, scanFile, cpuAbiOverride, extractNativeLibs,
mAppLib32InstallDir);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
// Some system apps still use directory structure for native libraries
@@ -11517,6 +11519,12 @@ public class PackageManagerService extends IPackageManager.Stub
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
// Shared library native code should be in the APK zip aligned
if (abi32 >= 0 && pkg.isLibrary() && extractLibs) {
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
"Shared library native lib extraction not supported");
}
maybeThrowExceptionForMultiArchCopy(
"Error unpackaging 32 bit native libs for multiarch app.", abi32);
@@ -11537,6 +11545,11 @@ public class PackageManagerService extends IPackageManager.Stub
"Error unpackaging 64 bit native libs for multiarch app.", abi64);
if (abi64 >= 0) {
// Shared library native libs should be in the APK zip aligned
if (extractLibs && pkg.isLibrary()) {
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
"Shared library native lib extraction not supported");
}
pkg.applicationInfo.primaryCpuAbi = Build.SUPPORTED_64_BIT_ABIS[abi64];
}
@@ -11553,7 +11566,6 @@ public class PackageManagerService extends IPackageManager.Stub
pkg.applicationInfo.primaryCpuAbi = abi;
}
}
} else {
String[] abiList = (cpuAbiOverride != null) ?
new String[] { cpuAbiOverride } : Build.SUPPORTED_ABIS;
@@ -11586,6 +11598,11 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (copyRet >= 0) {
// Shared libraries that have native libs must be multi-architecture
if (pkg.isLibrary()) {
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
"Shared library with native libs must be multiarch");
}
pkg.applicationInfo.primaryCpuAbi = abiList[copyRet];
} else if (copyRet == PackageManager.NO_NATIVE_LIBRARIES && cpuAbiOverride != null) {
pkg.applicationInfo.primaryCpuAbi = cpuAbiOverride;
@@ -18140,8 +18157,9 @@ public class PackageManagerService extends IPackageManager.Stub
try {
String abiOverride = (TextUtils.isEmpty(pkg.cpuAbiOverride) ?
args.abiOverride : pkg.cpuAbiOverride);
final boolean extractNativeLibs = !pkg.isLibrary();
derivePackageAbi(pkg, new File(pkg.codePath), abiOverride,
true /*extractLibs*/, mAppLib32InstallDir);
extractNativeLibs, mAppLib32InstallDir);
} catch (PackageManagerException pme) {
Slog.e(TAG, "Error deriving application ABI", pme);
res.setError(INSTALL_FAILED_INTERNAL_ERROR, "Error deriving application ABI");