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

Commit 979885ba authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi Committed by Android (Google) Code Review
Browse files

Revert "[res] Get rid of String16 in AssetManager2"

This reverts commit 7d186d92.

Reason for revert: Perf regression in b/409939937
No idea why, as it doesn't touch anything in that test, but a regression is a regression

Change-Id: I9931833d1df014341e5f7b88732e9bd59332b630
parent 7d186d92
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -238,8 +238,9 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) {

      // Add the package name -> build time ID mappings.
      for (const DynamicPackageEntry& entry : package->GetDynamicPackageMap()) {
        package_group->dynamic_ref_table->mEntries[entry.package_name] =
            static_cast<uint8_t>(entry.package_id);
        String16 package_name(entry.package_name.c_str(), entry.package_name.size());
        package_group->dynamic_ref_table->mEntries.replaceValueFor(
            package_name, static_cast<uint8_t>(entry.package_id));
      }

      if (auto apk_assets_path = apk_assets->GetPath()) {
@@ -253,8 +254,9 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) {
  DynamicRefTable::AliasMap aliases;
  for (const auto& group : package_groups_) {
    const std::string& package_name = group.packages_[0].loaded_package_->GetPackageName();
    const auto name_16 = String16(package_name.c_str(), package_name.size());
    for (auto&& inner_group : package_groups_) {
      inner_group.dynamic_ref_table->addMapping(package_name,
      inner_group.dynamic_ref_table->addMapping(name_16,
                                                group.dynamic_ref_table->mAssignedPackageId);
    }

+25 −21
Original line number Diff line number Diff line
@@ -39,10 +39,8 @@
#include <androidfw/ByteBucketArray.h>
#include <androidfw/ResourceTypes.h>
#include <androidfw/TypeWrappers.h>
#include <androidfw/Util.h>
#include <cutils/atomic.h>
#include <utils/ByteOrder.h>
#include <utils/KeyedVector.h>
#include <utils/Log.h>
#include <utils/String16.h>
#include <utils/String8.h>
@@ -6958,7 +6956,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
        size_t N = mPackageGroups.size();
        for (size_t i = 0; i < N; i++) {
            mPackageGroups[i]->dynamicRefTable.addMapping(
                    std::string_view(String8(group->name)), static_cast<uint8_t>(group->id));
                    group->name, static_cast<uint8_t>(group->id));
        }
    } else {
        group = mPackageGroups.itemAt(idx - 1);
@@ -7156,8 +7154,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
                // Fill in the reference table with the entries we already know about.
                size_t N = mPackageGroups.size();
                for (size_t i = 0; i < N; i++) {
                    group->dynamicRefTable.addMapping(
                        std::string_view(String8(mPackageGroups[i]->name)), mPackageGroups[i]->id);
                    group->dynamicRefTable.addMapping(mPackageGroups[i]->name, mPackageGroups[i]->id);
                }
            } else {
                ALOGW("Found multiple library tables, ignoring...");
@@ -7204,20 +7201,19 @@ status_t DynamicRefTable::load(const ResTable_lib_header* const header)

    const ResTable_lib_entry* entry = (const ResTable_lib_entry*)(((uint8_t*) header) +
            dtohl(header->header.headerSize));
    std::string package_name;
    for (uint32_t entryIndex = 0; entryIndex < entryCount; entryIndex++) {
        uint32_t packageId = dtohl(entry->packageId);
        util::ReadUtf16StringFromDevice(entry->packageName, std::size(entry->packageName),
                                        &package_name);
        char16_t tmpName[sizeof(entry->packageName) / sizeof(char16_t)];
        strcpy16_dtoh(tmpName, entry->packageName, sizeof(entry->packageName) / sizeof(char16_t));
        if (kDebugLibNoisy) {
            ALOGV("Found lib entry %s with id %d\n", package_name.c_str(),
            ALOGV("Found lib entry %s with id %d\n", String8(tmpName).c_str(),
                    dtohl(entry->packageId));
        }
        if (packageId >= 256) {
            ALOGE("Bad package id 0x%08x", packageId);
            return UNKNOWN_ERROR;
        }
        mEntries[std::move(package_name)] = (uint8_t) packageId;
        mEntries.replaceValueFor(String16(tmpName), (uint8_t) packageId);
        entry = entry + 1;
    }
    return NO_ERROR;
@@ -7228,12 +7224,17 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) {
        return UNKNOWN_ERROR;
    }

    for (auto [name, id] : other.mEntries) {
        auto [it, inserted] = mEntries.emplace(name, id);
        if (!inserted && id != it->second) {
    const size_t entryCount = other.mEntries.size();
    for (size_t i = 0; i < entryCount; i++) {
        ssize_t index = mEntries.indexOfKey(other.mEntries.keyAt(i));
        if (index < 0) {
            mEntries.add(String16(other.mEntries.keyAt(i)), other.mEntries[i]);
        } else {
            if (other.mEntries[i] != mEntries[index]) {
                return UNKNOWN_ERROR;
            }
        }
    }

    // Merge the lookup table. No entry can conflict
    // (value of 0 means not set).
@@ -7249,12 +7250,13 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) {
    return NO_ERROR;
}

status_t DynamicRefTable::addMapping(std::string_view packageName, uint8_t packageId) {
    auto it = mEntries.find(packageName);
    if (it == mEntries.end()) {
status_t DynamicRefTable::addMapping(const String16& packageName, uint8_t packageId)
{
    ssize_t index = mEntries.indexOfKey(packageName);
    if (index < 0) {
        return UNKNOWN_ERROR;
    }
    mLookupTable[it->second] = packageId;
    mLookupTable[mEntries.valueAt(index)] = packageId;
    return NO_ERROR;
}

@@ -7736,12 +7738,14 @@ void ResTable::print(bool inclValues) const
                (int)pgIndex, pg->id, (int)pg->packages.size(),
                String8(pg->name).c_str());

        const auto& refEntries = pg->dynamicRefTable.entries();
        const KeyedVector<String16, uint8_t>& refEntries = pg->dynamicRefTable.entries();
        const size_t refEntryCount = refEntries.size();
        if (refEntryCount > 0) {
            printf("  DynamicRefTable entryCount=%d:\n", (int) refEntryCount);
            for (auto [refName, refId] : refEntries) {
                printf("    0x%02x -> %s\n", refId, refName.c_str());
            for (size_t refIndex = 0; refIndex < refEntryCount; refIndex++) {
                printf("    0x%02x -> %s\n",
                        refEntries.valueAt(refIndex),
                        String8(refEntries.keyAt(refIndex)).c_str());
            }
            printf("\n");
        }
+4 −1
Original line number Diff line number Diff line
@@ -37,8 +37,11 @@ static void populateDynamicRefTableWithFuzzedData(
            packageName.push_back(ch);
        }

        // Convert std::string to String16 for compatibility
        android::String16 androidPackageName(packageName.c_str(), packageName.length());

        // Add the mapping to the table
        table.addMapping(packageName, packageId);
        table.addMapping(androidPackageName, packageId);
    }
}

+4 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <androidfw/StringPiece.h>
#include <utils/ByteOrder.h>
#include <utils/Errors.h>
#include <utils/KeyedVector.h>
#include <utils/String16.h>
#include <utils/Vector.h>
#include <utils/threads.h>
@@ -1961,7 +1962,7 @@ public:

    // Creates a mapping from build-time package ID to run-time package ID for
    // the given package.
    status_t addMapping(std::string_view packageName, uint8_t packageId);
    status_t addMapping(const String16& packageName, uint8_t packageId);

    void addMapping(uint8_t buildPackageId, uint8_t runtimePackageId);

@@ -1978,8 +1979,7 @@ public:
    virtual status_t lookupResourceId(uint32_t* resId) const;
    status_t lookupResourceValue(Res_value* value) const;

    using Entries = std::map<std::string, uint8_t, std::less<>>;
    const Entries& entries() const {
    inline const KeyedVector<String16, uint8_t>& entries() const {
        return mEntries;
    }

@@ -1987,7 +1987,7 @@ public:
    uint8_t mLookupTable[256];
    uint8_t mAssignedPackageId;
    bool mAppAsLib;
    Entries mEntries;
    KeyedVector<String16, uint8_t> mEntries;
    AliasMap mAliasId;
};

+5 −3
Original line number Diff line number Diff line
@@ -451,9 +451,11 @@ bool BinaryResourceParser::ParseLibrary(const ResChunk_header* chunk) {
    return false;
  }

  const auto& entries = dynamic_ref_table.entries();
  for (auto [name, id] : entries) {
    table_->included_packages_[id] = name;
  const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table.entries();
  const size_t count = entries.size();
  for (size_t i = 0; i < count; i++) {
    table_->included_packages_[entries.valueAt(i)] =
        android::util::Utf16ToUtf8(StringPiece16(entries.keyAt(i).c_str()));
  }
  return true;
}
Loading