Source code for batools.android
# Released under the MIT License. See LICENSE for details.
#
"""Functionality related to android builds."""
from __future__ import annotations
import os
import sys
import subprocess
from typing import TYPE_CHECKING
if TYPE_CHECKING:
pass
[docs]
def androidaddr(archive_dir: str, arch: str, addr: str) -> None:
"""Print the source file location for an android program-counter.
command line args: archive_dir architecture addr
"""
if not os.path.isdir(archive_dir):
print('ERROR: invalid archive dir: "' + archive_dir + '"')
sys.exit(255)
archs = {
'x86': {'prefix': 'x86-', 'libmain': 'libmain_x86.so'},
'arm': {'prefix': 'arm-', 'libmain': 'libmain_arm.so'},
'arm64': {'prefix': 'aarch64-', 'libmain': 'libmain_arm64.so'},
'x86-64': {'prefix': 'x86_64-', 'libmain': 'libmain_x86-64.so'},
}
if arch not in archs:
print(
'ERROR: invalid arch "'
+ arch
+ '"; (choices are '
+ ', '.join(archs.keys())
+ ')'
)
sys.exit(255)
rootdir = '.'
ndkpath = (
subprocess.check_output(
['tools/pcommand', 'android_sdk_utils', 'get-ndk-path']
)
.decode()
.strip()
)
if not os.path.isdir(ndkpath):
print("ERROR: ndk-path '" + ndkpath + '" does not exist')
sys.exit(255)
lines = (
subprocess.check_output(
['find', os.path.join(ndkpath, 'toolchains'), '-name', '*addr2line']
)
.decode()
.strip()
.splitlines()
)
# print('RAW LINES', lines)
lines = [
line
for line in lines
if archs[arch]['prefix'] in line and '/llvm/' in line
]
if len(lines) != 1:
print(f"ERROR: can't find addr2line binary ({len(lines)} options).")
sys.exit(255)
addr2line = lines[0]
subprocess.run(
'mkdir -p "' + os.path.join(rootdir, 'android_addr_tmp') + '"',
shell=True,
check=True,
)
try:
subprocess.run(
'cd "'
+ os.path.join(rootdir, 'android_addr_tmp')
+ '" && tar -xf "'
+ os.path.join(
archive_dir, 'unstripped_libs', archs[arch]['libmain'] + '.tgz'
)
+ '"',
shell=True,
check=True,
)
subprocess.run(
addr2line
+ ' -e "'
+ os.path.join(rootdir, 'android_addr_tmp', archs[arch]['libmain'])
+ '" '
+ addr,
shell=True,
check=True,
)
finally:
os.system('rm -rf "' + os.path.join(rootdir, 'android_addr_tmp') + '"')
# Docs-generation hack; import some stuff that we likely only forward-declared
# in our actual source code so that docs tools can find it.
from typing import (Coroutine, Any, Literal, Callable,
Generator, Awaitable, Sequence, Self)
import asyncio
from concurrent.futures import Future
from pathlib import Path
from enum import Enum