OSDN Git Service

Fail with an error if we can't read the policy for encryption
[android-x86/system-extras.git] / simpleperf / dso.cpp
index 6397eaa..9c33667 100644 (file)
@@ -26,6 +26,7 @@
 #include <android-base/logging.h>
 
 #include "environment.h"
+#include "read_apk.h"
 #include "read_elf.h"
 #include "utils.h"
 
@@ -199,9 +200,14 @@ bool Dso::Load() {
     case DSO_KERNEL_MODULE:
       result = LoadKernelModule();
       break;
-    case DSO_ELF_FILE:
-      result = LoadElfFile();
+    case DSO_ELF_FILE: {
+      if (std::get<0>(SplitUrlInApk(path_))) {
+        result = LoadEmbeddedElfFile();
+      } else {
+        result = LoadElfFile();
+      }
       break;
+    }
   }
   if (result) {
     std::sort(symbols_.begin(), symbols_.end(), SymbolComparator());
@@ -305,6 +311,16 @@ bool Dso::LoadElfFile() {
   return loaded;
 }
 
+bool Dso::LoadEmbeddedElfFile() {
+  std::string path = GetAccessiblePath();
+  BuildId build_id = GetExpectedBuildId(path);
+  auto tuple = SplitUrlInApk(path);
+  CHECK(std::get<0>(tuple));
+  return ParseSymbolsFromApkFile(std::get<1>(tuple), std::get<2>(tuple), build_id,
+                                 std::bind(ElfFileSymbolCallback, std::placeholders::_1,
+                                           this, SymbolFilterForDso));
+}
+
 void Dso::InsertSymbol(const Symbol& symbol) {
   symbols_.push_back(symbol);
 }