mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-21 22:33:58 +08:00
95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
#!/usr/bin/env python3.7
|
|
# Copyright (c) 2011-2020 Eric Froemling
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in
|
|
# all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
# SOFTWARE.
|
|
# -----------------------------------------------------------------------------
|
|
"""Functionality related to android builds."""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
from typing import TYPE_CHECKING
|
|
|
|
import efrotools
|
|
|
|
if TYPE_CHECKING:
|
|
pass
|
|
|
|
|
|
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)
|
|
sdkutils = 'tools/android_sdk_utils'
|
|
rootdir = '.'
|
|
ndkpath = subprocess.check_output([sdkutils,
|
|
'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()
|
|
lines = [line for line in lines if archs[arch]['prefix'] in line]
|
|
if len(lines) != 1:
|
|
print("ERROR: couldn't find addr2line binary")
|
|
sys.exit(255)
|
|
addr2line = lines[0]
|
|
efrotools.run('mkdir -p "' + os.path.join(rootdir, 'android_addr_tmp') +
|
|
'"')
|
|
try:
|
|
efrotools.run('cd "' + os.path.join(rootdir, 'android_addr_tmp') +
|
|
'" && tar -xf "' +
|
|
os.path.join(archive_dir, 'unstripped_libs',
|
|
archs[arch]['libmain'] + '.tgz') + '"')
|
|
efrotools.run(
|
|
addr2line + ' -e "' +
|
|
os.path.join(rootdir, 'android_addr_tmp', archs[arch]['libmain']) +
|
|
'" ' + addr)
|
|
finally:
|
|
os.system('rm -rf "' + os.path.join(rootdir, 'android_addr_tmp') + '"')
|