simpleperf: use callback API to read dex symbols.

In experiment, it saves about 20% time reading dex symbols.

Bug: none
Test: run simpleperf_unit_test
Change-Id: I0e6bfd1f51f99f57175fece77c2ee3518e676a71
diff --git a/simpleperf/dso.cpp b/simpleperf/dso.cpp
index 77a8b15..d3b7ffb 100644
--- a/simpleperf/dso.cpp
+++ b/simpleperf/dso.cpp
@@ -463,9 +463,12 @@
 
   std::vector<Symbol> LoadSymbolsImpl() override {
     std::vector<Symbol> symbols;
-    std::vector<DexFileSymbol> dex_file_symbols;
     auto tuple = SplitUrlInApk(debug_file_path_);
     bool status = false;
+    auto symbol_callback = [&](DexFileSymbol* dex_symbol) {
+      symbols.emplace_back(std::string_view(dex_symbol->name, dex_symbol->name_size),
+                           dex_symbol->addr, dex_symbol->size);
+    };
     if (std::get<0>(tuple)) {
       std::unique_ptr<ArchiveHelper> ahelper = ArchiveHelper::CreateInstance(std::get<1>(tuple));
       ZipEntry entry;
@@ -473,10 +476,10 @@
       if (ahelper && ahelper->FindEntry(std::get<2>(tuple), &entry) &&
           ahelper->GetEntryData(entry, &data)) {
         status = ReadSymbolsFromDexFileInMemory(data.data(), data.size(), dex_file_offsets_,
-                                                &dex_file_symbols);
+                                                symbol_callback);
       }
     } else {
-      status = ReadSymbolsFromDexFile(debug_file_path_, dex_file_offsets_, &dex_file_symbols);
+      status = ReadSymbolsFromDexFile(debug_file_path_, dex_file_offsets_, symbol_callback);
     }
     if (!status) {
       android::base::LogSeverity level =
@@ -485,9 +488,6 @@
       return symbols;
     }
     LOG(VERBOSE) << "Read symbols from " << debug_file_path_ << " successfully";
-    for (auto& symbol : dex_file_symbols) {
-      symbols.emplace_back(symbol.name, symbol.offset, symbol.len);
-    }
     SortAndFixSymbols(symbols);
     return symbols;
   }