1c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski/* 2c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * Copyright (C) 2017 The Android Open Source Project 3c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * 4c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * you may not use this file except in compliance with the License. 6c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * You may obtain a copy of the License at 7c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * 8c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * 10c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * See the License for the specific language governing permissions and 14c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski * limitations under the License. 15c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski */ 16c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 17c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski#include "BenchmarkHelpers.h" 18c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 19c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski#include "android-base/stringprintf.h" 20c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski#include "androidfw/AssetManager.h" 2173f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski#include "androidfw/AssetManager2.h" 22c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 23c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinskinamespace android { 24c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 25c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinskivoid GetResourceBenchmarkOld(const std::vector<std::string>& paths, const ResTable_config* config, 26c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski uint32_t resid, benchmark::State& state) { 27c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski AssetManager assetmanager; 28c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski for (const std::string& path : paths) { 29c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski if (!assetmanager.addAssetPath(String8(path.c_str()), nullptr /* cookie */, 30c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski false /* appAsLib */, false /* isSystemAssets */)) { 31c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski state.SkipWithError(base::StringPrintf("Failed to load assets %s", path.c_str()).c_str()); 32c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski return; 33c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski } 34c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski } 35c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 36bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski // Make sure to force creation of the ResTable first, or else the configuration doesn't get set. 37bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski const ResTable& table = assetmanager.getResources(true); 38c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski if (config != nullptr) { 39c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski assetmanager.setConfiguration(*config); 40c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski } 41c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 42c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski Res_value value; 43c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski ResTable_config selected_config; 44c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski uint32_t flags; 45bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski uint32_t last_ref = 0u; 46c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 47c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski while (state.KeepRunning()) { 48bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski ssize_t block = table.getResource(resid, &value, false /*may_be_bag*/, 0u /*density*/, &flags, 49bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski &selected_config); 50bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski table.resolveReference(&value, block, &last_ref, &flags, &selected_config); 51c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski } 52c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski} 53c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski 5473f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinskivoid GetResourceBenchmark(const std::vector<std::string>& paths, const ResTable_config* config, 5573f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski uint32_t resid, benchmark::State& state) { 5673f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski std::vector<std::unique_ptr<const ApkAssets>> apk_assets; 5773f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski std::vector<const ApkAssets*> apk_assets_ptrs; 5873f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski for (const std::string& path : paths) { 5973f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski std::unique_ptr<const ApkAssets> apk = ApkAssets::Load(path); 6073f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski if (apk == nullptr) { 6173f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski state.SkipWithError(base::StringPrintf("Failed to load assets %s", path.c_str()).c_str()); 6273f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski return; 6373f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski } 6473f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski apk_assets_ptrs.push_back(apk.get()); 6573f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski apk_assets.push_back(std::move(apk)); 6673f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski } 6773f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski 6873f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski AssetManager2 assetmanager; 6973f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski assetmanager.SetApkAssets(apk_assets_ptrs); 7073f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski if (config != nullptr) { 7173f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski assetmanager.SetConfiguration(*config); 7273f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski } 7373f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski 7473f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski Res_value value; 7573f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski ResTable_config selected_config; 7673f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski uint32_t flags; 77bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski uint32_t last_id = 0u; 7873f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski 7973f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski while (state.KeepRunning()) { 80bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski ApkAssetsCookie cookie = assetmanager.GetResource( 81bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski resid, false /* may_be_bag */, 0u /* density_override */, &value, &selected_config, &flags); 82bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski assetmanager.ResolveReference(cookie, &value, &selected_config, &flags, &last_id); 8373f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski } 8473f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski} 8573f6f9daf6bb38e49747bd103c97617b3dccddc4Adam Lesinski 86c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski} // namespace android 87