Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 957c2377 authored by Yusuke Sato's avatar Yusuke Sato
Browse files

Let findSupportedAbi and hasRenderscriptBitcode scan only relevant files

for better performance. Without the optimization, these two functions
may check more than 100k file names in the pre-installed APK files,
which can take a few seconds to finish even on a recent device.

(cherry-pick of 34fe3df8)

Bug: 21957428
Change-Id: I5ebe0438019958d883a7fda6bd92ea4484211d23
parent 608ad140
Loading
Loading
Loading
Loading
+4 −12
Original line number Diff line number Diff line
@@ -48,7 +48,6 @@
#define LIB_SUFFIX_LEN (sizeof(LIB_SUFFIX) - 1)

#define RS_BITCODE_SUFFIX ".bc"
#define RS_BITCODE_SUFFIX_LEN (sizeof(RS_BITCODE_SUFFIX) -1)

#define GDBSERVER "gdbserver"
#define GDBSERVER_LEN (sizeof(GDBSERVER) - 1)
@@ -322,7 +321,8 @@ private:
public:
    static NativeLibrariesIterator* create(ZipFileRO* zipFile) {
        void* cookie = NULL;
        if (!zipFile->startIteration(&cookie)) {
        // Do not specify a suffix to find both .so files and gdbserver.
        if (!zipFile->startIteration(&cookie, APK_LIB, NULL /* suffix */)) {
            return NULL;
        }

@@ -337,11 +337,6 @@ public:
                continue;
            }

            // Make sure we're in the lib directory of the ZIP.
            if (strncmp(fileName, APK_LIB, APK_LIB_LEN)) {
                continue;
            }

            // Make sure the filename is at least to the minimum library name size.
            const size_t fileNameLen = strlen(fileName);
            static const size_t minLength = APK_LIB_LEN + 2 + LIB_PREFIX_LEN + 1 + LIB_SUFFIX_LEN;
@@ -529,7 +524,7 @@ com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode(JNIEnv *
        jlong apkHandle) {
    ZipFileRO* zipFile = reinterpret_cast<ZipFileRO*>(apkHandle);
    void* cookie = NULL;
    if (!zipFile->startIteration(&cookie)) {
    if (!zipFile->startIteration(&cookie, NULL /* prefix */, RS_BITCODE_SUFFIX)) {
        return APK_SCAN_ERROR;
    }

@@ -539,12 +534,9 @@ com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode(JNIEnv *
        if (zipFile->getEntryFileName(next, fileName, sizeof(fileName))) {
            continue;
        }

        const size_t fileNameLen = strlen(fileName);
        const char* lastSlash = strrchr(fileName, '/');
        const char* baseName = (lastSlash == NULL) ? fileName : fileName + 1;
        if (!strncmp(fileName + fileNameLen - RS_BITCODE_SUFFIX_LEN, RS_BITCODE_SUFFIX,
                     RS_BITCODE_SUFFIX_LEN) && isFilenameSafe(baseName)) {
        if (isFilenameSafe(baseName)) {
            zipFile->endIteration(cookie);
            return BITCODE_PRESENT;
        }
+1 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ public:
     * a matching call to endIteration with the same cookie.
     */
    bool startIteration(void** cookie);
    bool startIteration(void** cookie, const char* prefix, const char* suffix);

    /**
     * Return the next entry in iteration order, or NULL if there are no more
+9 −1
Original line number Diff line number Diff line
@@ -126,10 +126,18 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, uint16_t* pMethod,
}

bool ZipFileRO::startIteration(void** cookie)
{
  return startIteration(cookie, NULL, NULL);
}

bool ZipFileRO::startIteration(void** cookie, const char* prefix, const char* suffix)
{
    _ZipEntryRO* ze = new _ZipEntryRO;
    ZipString pe(prefix ? prefix : "");
    ZipString se(suffix ? suffix : "");
    int32_t error = StartIteration(mHandle, &(ze->cookie),
                                   NULL /* prefix */, NULL /* suffix */);
                                   prefix ? &pe : NULL,
                                   suffix ? &se : NULL);
    if (error) {
        ALOGW("Could not start iteration over %s: %s", mFileName, ErrorCodeString(error));
        delete ze;