Snap for 14104676 from 98e32fcb1368d3a96ada468db591239b3ef9a8fc to 25Q4-release

Change-Id: I9b63492480ff26b553bb0259cdf6eeee7f4b4b35
diff --git a/simpleperf/scripts/Android.bp b/simpleperf/scripts/Android.bp
index 7e25cf9..2f8275b 100644
--- a/simpleperf/scripts/Android.bp
+++ b/simpleperf/scripts/Android.bp
@@ -50,4 +50,15 @@
         include_dirs: ["external/protobuf/src"],
         canonical_path_from_root: false,
     },
-}
\ No newline at end of file
+}
+
+python_binary_host {
+    name: "pprof_proto_generator",
+    srcs: [
+        "pprof_proto_generator.py",
+    ],
+    libs: [
+        "profile_py_pb2",
+        "simpleperf_report_lib",
+    ],
+}
diff --git a/simpleperf/scripts/simpleperf_utils.py b/simpleperf/scripts/simpleperf_utils.py
index c8f1f29..5d2574f 100644
--- a/simpleperf/scripts/simpleperf_utils.py
+++ b/simpleperf/scripts/simpleperf_utils.py
@@ -83,24 +83,30 @@
 
 
 def get_host_binary_path(binary_name: str) -> str:
-    dirname = os.path.join(get_script_dir(), 'bin')
+    in_dir_path = Path('bin')
     if is_windows():
         if binary_name.endswith('.so'):
             binary_name = binary_name[0:-3] + '.dll'
         elif '.' not in binary_name:
             binary_name += '.exe'
-        dirname = os.path.join(dirname, 'windows')
+        in_dir_path = in_dir_path / 'windows'
     elif sys.platform == 'darwin':  # OSX
         if binary_name.endswith('.so'):
             binary_name = binary_name[0:-3] + '.dylib'
-        dirname = os.path.join(dirname, 'darwin')
+        in_dir_path = in_dir_path / 'darwin'
     else:
-        dirname = os.path.join(dirname, 'linux')
-    dirname = os.path.join(dirname, 'x86_64' if sys.maxsize > 2 ** 32 else 'x86')
-    binary_path = os.path.join(dirname, binary_name)
-    if not os.path.isfile(binary_path):
-        log_fatal("can't find binary: %s" % binary_path)
-    return binary_path
+        in_dir_path = in_dir_path / 'linux'
+    in_dir_path = in_dir_path / ('x86_64' if sys.maxsize > 2 ** 32 else 'x86') / binary_name
+    # First search in <script_dir>/bin directory.
+    path1 = Path(get_script_dir()) / in_dir_path
+    if path1.is_file():
+        return str(path1)
+    # Then check sys.path[0]. When we are built into binaries like pprof_proto_generator,
+    # the bin directory is put in sys.path[0].
+    path2 = Path(sys.path[0]) / in_dir_path
+    if path2.is_file():
+        return str(path2)
+    log_fatal(f"can't find binary: {path1}")
 
 
 def is_executable_available(executable: str, option='--help') -> bool: