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