# So read build id from the binary in binary_cache, and check it with build id in
# perf.data.
build_id_in_perf_data = self.lib.GetBuildIdForPath(dso_name)
- if build_id_in_perf_data:
- # Try elf_path in binary cache.
- elf_path = find_real_dso_path(dso_name, self.config['binary_cache_dir'])
- if elf_path:
- elf_build_id = self.read_elf.get_build_id(elf_path, False)
- if build_id_in_perf_data == self.read_elf.pad_build_id(elf_build_id):
- build_id = elf_build_id
- binary_path = elf_path
-
- if not build_id and build_id_in_perf_data.startswith('0x'):
- # Fallback to the way used by TrimZeroesFromBuildIDString() in quipper.
- build_id = build_id_in_perf_data[2:] # remove '0x'
- padding = '0' * 8
- while build_id.endswith(padding):
- build_id = build_id[:-len(padding)]
+ # Try elf_path in binary cache.
+ elf_path = find_real_dso_path(dso_name, self.config['binary_cache_dir'])
+ if elf_path:
+ elf_build_id = self.read_elf.get_build_id(elf_path, False)
+ if build_id_in_perf_data:
+ match = build_id_in_perf_data == self.read_elf.pad_build_id(elf_build_id)
+ else:
+ # odex files generated by ART on Android O don't contain build id.
+ match = not elf_build_id
+ if match:
+ build_id = elf_build_id
+ binary_path = elf_path
+
+ # When there is no matching elf_path, try converting build_id in perf.data.
+ if not build_id and build_id_in_perf_data.startswith('0x'):
+ # Fallback to the way used by TrimZeroesFromBuildIDString() in quipper.
+ build_id = build_id_in_perf_data[2:] # remove '0x'
+ padding = '0' * 8
+ while build_id.endswith(padding):
+ build_id = build_id[:-len(padding)]
+
self.binary_map[dso_name] = (binary_path, build_id)
return (binary_path, build_id)