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

Commit 7d186d92 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

[res] Get rid of String16 in AssetManager2

String16 is an obsolete class that was used in the old Android
code. New code prefers UTF8, and mixing it with String16 is slow
and inconvenient

+ get rid of one of the last usages of KeyedVector<>

Flag: EXEMPT minor refactoring
Test: atest libandroidfw_tests idmap2_tests aapt2_tests
Change-Id: I60b8f51488d0321718c23148caf196ae8e140897
parent b76c8899
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -238,9 +238,8 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) {

      // Add the package name -> build time ID mappings.
      for (const DynamicPackageEntry& entry : package->GetDynamicPackageMap()) {
        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));
        package_group->dynamic_ref_table->mEntries[entry.package_name] =
            static_cast<uint8_t>(entry.package_id);
      }

      if (auto apk_assets_path = apk_assets->GetPath()) {
@@ -254,9 +253,8 @@ 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(name_16,
      inner_group.dynamic_ref_table->addMapping(package_name,
                                                group.dynamic_ref_table->mAssignedPackageId);
    }

+21 −25
Original line number Diff line number Diff line
@@ -39,8 +39,10 @@
#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>
@@ -6956,7 +6958,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(
                    group->name, static_cast<uint8_t>(group->id));
                    std::string_view(String8(group->name)), static_cast<uint8_t>(group->id));
        }
    } else {
        group = mPackageGroups.itemAt(idx - 1);
@@ -7154,7 +7156,8 @@ 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(mPackageGroups[i]->name, mPackageGroups[i]->id);
                    group->dynamicRefTable.addMapping(
                        std::string_view(String8(mPackageGroups[i]->name)), mPackageGroups[i]->id);
                }
            } else {
                ALOGW("Found multiple library tables, ignoring...");
@@ -7201,19 +7204,20 @@ 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);
        char16_t tmpName[sizeof(entry->packageName) / sizeof(char16_t)];
        strcpy16_dtoh(tmpName, entry->packageName, sizeof(entry->packageName) / sizeof(char16_t));
        util::ReadUtf16StringFromDevice(entry->packageName, std::size(entry->packageName),
                                        &package_name);
        if (kDebugLibNoisy) {
            ALOGV("Found lib entry %s with id %d\n", String8(tmpName).c_str(),
            ALOGV("Found lib entry %s with id %d\n", package_name.c_str(),
                    dtohl(entry->packageId));
        }
        if (packageId >= 256) {
            ALOGE("Bad package id 0x%08x", packageId);
            return UNKNOWN_ERROR;
        }
        mEntries.replaceValueFor(String16(tmpName), (uint8_t) packageId);
        mEntries[std::move(package_name)] = (uint8_t) packageId;
        entry = entry + 1;
    }
    return NO_ERROR;
@@ -7224,17 +7228,12 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) {
        return UNKNOWN_ERROR;
    }

    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]) {
    for (auto [name, id] : other.mEntries) {
        auto [it, inserted] = mEntries.emplace(name, id);
        if (!inserted && id != it->second) {
            return UNKNOWN_ERROR;
        }
    }
    }

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

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

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

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

+4 −4
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@
#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>
@@ -1962,7 +1961,7 @@ public:

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

    void addMapping(uint8_t buildPackageId, uint8_t runtimePackageId);

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

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

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

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

  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()));
  const auto& entries = dynamic_ref_table.entries();
  for (auto [name, id] : entries) {
    table_->included_packages_[id] = name;
  }
  return true;
}
Loading