diff options
7 files changed, 32 insertions, 10 deletions
diff --git a/core/java/android/os/incremental/IIncrementalService.aidl b/core/java/android/os/incremental/IIncrementalService.aidl index 4c5757098025..220ce22ded5c 100644 --- a/core/java/android/os/incremental/IIncrementalService.aidl +++ b/core/java/android/os/incremental/IIncrementalService.aidl @@ -111,9 +111,9 @@ interface IIncrementalService { void deleteStorage(int storageId); /** - * Setting up native library directories and extract native libs onto a storage. + * Setting up native library directories and extract native libs onto a storage if needed. */ - boolean configureNativeBinaries(int storageId, in @utf8InCpp String apkFullPath, in @utf8InCpp String libDirRelativePath, in @utf8InCpp String abi); + boolean configureNativeBinaries(int storageId, in @utf8InCpp String apkFullPath, in @utf8InCpp String libDirRelativePath, in @utf8InCpp String abi, boolean extractNativeLibs); /** * Waits until all native library extraction is done for the storage diff --git a/core/java/android/os/incremental/IncrementalStorage.java b/core/java/android/os/incremental/IncrementalStorage.java index 70ebbaa326b8..6200a38fe13c 100644 --- a/core/java/android/os/incremental/IncrementalStorage.java +++ b/core/java/android/os/incremental/IncrementalStorage.java @@ -469,12 +469,15 @@ public final class IncrementalStorage { * @param apkFullPath Source APK to extract native libs from. * @param libDirRelativePath Target dir to put lib files, e.g., "lib" or "lib/arm". * @param abi Target ABI of the native lib files. Only extract native libs of this ABI. + * @param extractNativeLibs If true, extract native libraries; otherwise just setup directories + * without extracting. * @return Success of not. */ public boolean configureNativeBinaries(String apkFullPath, String libDirRelativePath, - String abi) { + String abi, boolean extractNativeLibs) { try { - return mService.configureNativeBinaries(mId, apkFullPath, libDirRelativePath, abi); + return mService.configureNativeBinaries(mId, apkFullPath, libDirRelativePath, abi, + extractNativeLibs); } catch (RemoteException e) { e.rethrowFromSystemServer(); return false; diff --git a/core/java/com/android/internal/content/NativeLibraryHelper.java b/core/java/com/android/internal/content/NativeLibraryHelper.java index 02cf25a7c3d2..476198b5311a 100644 --- a/core/java/com/android/internal/content/NativeLibraryHelper.java +++ b/core/java/com/android/internal/content/NativeLibraryHelper.java @@ -506,7 +506,8 @@ public class NativeLibraryHelper { } for (int i = 0; i < apkPaths.length; i++) { - if (!incrementalStorage.configureNativeBinaries(apkPaths[i], libRelativeDir, abi)) { + if (!incrementalStorage.configureNativeBinaries(apkPaths[i], libRelativeDir, abi, + handle.extractNativeLibs)) { return PackageManager.INSTALL_FAILED_INTERNAL_ERROR; } } diff --git a/services/incremental/BinderIncrementalService.cpp b/services/incremental/BinderIncrementalService.cpp index 0355b399dcef..8d2afc1bea37 100644 --- a/services/incremental/BinderIncrementalService.cpp +++ b/services/incremental/BinderIncrementalService.cpp @@ -279,8 +279,9 @@ binder::Status BinderIncrementalService::startLoading(int32_t storageId, bool* _ binder::Status BinderIncrementalService::configureNativeBinaries( int32_t storageId, const std::string& apkFullPath, const std::string& libDirRelativePath, - const std::string& abi, bool* _aidl_return) { - *_aidl_return = mImpl.configureNativeBinaries(storageId, apkFullPath, libDirRelativePath, abi); + const std::string& abi, bool extractNativeLibs, bool* _aidl_return) { + *_aidl_return = mImpl.configureNativeBinaries(storageId, apkFullPath, libDirRelativePath, abi, + extractNativeLibs); return ok(); } diff --git a/services/incremental/BinderIncrementalService.h b/services/incremental/BinderIncrementalService.h index af1136344246..68549f5a8ff8 100644 --- a/services/incremental/BinderIncrementalService.h +++ b/services/incremental/BinderIncrementalService.h @@ -77,7 +77,8 @@ public: binder::Status configureNativeBinaries(int32_t storageId, const std::string& apkFullPath, const std::string& libDirRelativePath, - const std::string& abi, bool* _aidl_return) final; + const std::string& abi, bool extractNativeLibs, + bool* _aidl_return) final; binder::Status waitForNativeBinariesExtraction(int storageId, bool* _aidl_return) final; private: diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index b03d1eae8ca0..66c7717d7987 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1379,7 +1379,7 @@ static long elapsedMcs(Duration start, Duration end) { // Extract lib files from zip, create new files in incfs and write data to them bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_view apkFullPath, std::string_view libDirRelativePath, - std::string_view abi) { + std::string_view abi, bool extractNativeLibs) { auto start = Clock::now(); const auto ifs = getIfs(storage); @@ -1423,6 +1423,21 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_ continue; } + if (!extractNativeLibs) { + // ensure the file is properly aligned and unpacked + if (entry.method != kCompressStored) { + LOG(WARNING) << "Library " << fileName << " must be uncompressed to mmap it"; + return false; + } + if ((entry.offset & (constants().blockSize - 1)) != 0) { + LOG(WARNING) << "Library " << fileName + << " must be page-aligned to mmap it, offset = 0x" << std::hex + << entry.offset; + return false; + } + continue; + } + auto startFileTs = Clock::now(); const auto libName = path::basename(fileName); diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index bde4ef68d2a7..05f62b977a85 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -138,7 +138,8 @@ public: bool startLoading(StorageId storage) const; bool configureNativeBinaries(StorageId storage, std::string_view apkFullPath, - std::string_view libDirRelativePath, std::string_view abi); + std::string_view libDirRelativePath, std::string_view abi, + bool extractNativeLibs); bool waitForNativeBinariesExtraction(StorageId storage); class AppOpsListener : public android::BnAppOpsCallback { |