blob: baee28747b309934732c48878d3626ad170a40b7 [file] [log] [blame]
Than McIntoshf831e6d2016-02-01 19:50:20 -05001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef SIMPLE_PERF_READ_APK_H_
18#define SIMPLE_PERF_READ_APK_H_
19
Yabin Cui41e32ca2016-02-18 12:11:40 -080020#include <stdint.h>
21
Than McIntoshf831e6d2016-02-01 19:50:20 -050022#include <memory>
23#include <string>
Yabin Cuib1a885b2016-02-14 19:18:02 -080024#include <tuple>
Yabin Cui8422f342018-05-09 17:27:27 -070025#include <unordered_map>
Than McIntoshf831e6d2016-02-01 19:50:20 -050026
Yabin Cuib1a885b2016-02-14 19:18:02 -080027#include "read_elf.h"
Than McIntoshf831e6d2016-02-01 19:50:20 -050028
Yabin Cuifaa7b922021-01-11 17:35:57 -080029namespace simpleperf {
30
Than McIntoshf831e6d2016-02-01 19:50:20 -050031// Container for info an on ELF file embedded into an APK file
32class EmbeddedElf {
33 public:
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020034 EmbeddedElf() : entry_offset_(0), entry_size_(0) {}
Than McIntoshf831e6d2016-02-01 19:50:20 -050035
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020036 EmbeddedElf(const std::string& filepath, const std::string& entry_name, uint64_t entry_offset,
Than McIntoshf831e6d2016-02-01 19:50:20 -050037 size_t entry_size)
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020038 : filepath_(filepath),
39 entry_name_(entry_name),
40 entry_offset_(entry_offset),
41 entry_size_(entry_size) {}
Than McIntoshf831e6d2016-02-01 19:50:20 -050042
43 // Path to APK file
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020044 const std::string& filepath() const { return filepath_; }
Than McIntoshf831e6d2016-02-01 19:50:20 -050045
46 // Entry name within zip archive
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020047 const std::string& entry_name() const { return entry_name_; }
Than McIntoshf831e6d2016-02-01 19:50:20 -050048
49 // Offset of zip entry from start of containing APK file
Yabin Cui41e32ca2016-02-18 12:11:40 -080050 uint64_t entry_offset() const { return entry_offset_; }
Than McIntoshf831e6d2016-02-01 19:50:20 -050051
52 // Size of zip entry (length of embedded ELF)
53 uint32_t entry_size() const { return entry_size_; }
54
55 private:
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020056 std::string filepath_; // containing APK path
57 std::string entry_name_; // name of entry in zip index of embedded elf file
58 uint64_t entry_offset_; // offset of ELF from start of containing APK file
59 uint32_t entry_size_; // size of ELF file in zip
Than McIntoshf831e6d2016-02-01 19:50:20 -050060};
61
Than McIntoshf831e6d2016-02-01 19:50:20 -050062// APK inspector helper class
63class ApkInspector {
64 public:
Yabin Cui41e32ca2016-02-18 12:11:40 -080065 static EmbeddedElf* FindElfInApkByOffset(const std::string& apk_path, uint64_t file_offset);
Yabin Cui8422f342018-05-09 17:27:27 -070066 static EmbeddedElf* FindElfInApkByName(const std::string& apk_path,
67 const std::string& entry_name);
Than McIntoshf831e6d2016-02-01 19:50:20 -050068
69 private:
Yabin Cuib1a885b2016-02-14 19:18:02 -080070 static std::unique_ptr<EmbeddedElf> FindElfInApkByOffsetWithoutCache(const std::string& apk_path,
Yabin Cui41e32ca2016-02-18 12:11:40 -080071 uint64_t file_offset);
Thiébaud Weksteen4848ee02020-10-23 16:06:59 +020072 static std::unique_ptr<EmbeddedElf> FindElfInApkByNameWithoutCache(const std::string& apk_path,
73 const std::string& entry_name);
Yabin Cuib1a885b2016-02-14 19:18:02 -080074
Yabin Cui8422f342018-05-09 17:27:27 -070075 struct ApkNode {
76 // Map from entry_offset to EmbeddedElf.
77 std::unordered_map<uint64_t, std::unique_ptr<EmbeddedElf>> offset_map;
78 // Map from entry_name to EmbeddedElf.
79 std::unordered_map<std::string, EmbeddedElf*> name_map;
80 };
81 static std::unordered_map<std::string, ApkNode> embedded_elf_cache_;
Than McIntoshf831e6d2016-02-01 19:50:20 -050082};
83
Yabin Cuib1a885b2016-02-14 19:18:02 -080084std::string GetUrlInApk(const std::string& apk_path, const std::string& elf_filename);
85std::tuple<bool, std::string, std::string> SplitUrlInApk(const std::string& path);
86
Joel Fernandes7e8b2b92018-08-24 12:20:28 -070087// Parse path like "[anon:dalvik-classes.dex extracted in memory from /..base.apk] (deleted)",
88// or "/dev/ashmem/dalvik-classes.dex extracted in memory from /..base.apk (deleted)" on Android P.
Yabin Cui2a53ff32018-05-21 17:37:00 -070089bool ParseExtractedInMemoryPath(const std::string& path, std::string* zip_path,
90 std::string* entry_name);
91
Yabin Cuifaa7b922021-01-11 17:35:57 -080092} // namespace simpleperf
93
Than McIntoshf831e6d2016-02-01 19:50:20 -050094#endif // SIMPLE_PERF_READ_APK_H_