blob: 90ced08f2c9d95cf74182238a56e766455b2ebe6 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import logging
import os
import re
import subprocess
import sys
from mopy.paths import Paths
ANDROID_TOOLS_DIR = ('third_party/android_tools/ndk/toolchains/' +
'arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin')
def binaries(path):
for item in os.listdir(path):
match = re.match(r'^(\w+)\.mojo$', item)
if match:
name = match.group(1)
if name.endswith('apptests'):
continue
binary = os.path.join(path, 'lib%s_library.so' % name)
if os.path.exists(binary):
yield name, binary
def check_deps():
success = True
if not os.path.exists('bloat'):
print ("Can't find bloat.py. Did you " +
"'git clone https://github.com/martine/bloat.git' ?")
success = False
if not os.path.exists('webtreemap'):
print ("Can't find webtreemap. Did you " +
"'git clone https://github.com/martine/webtreemap.git' ?")
success = False
if not success:
sys.exit(1)
def main():
logging.basicConfig(level=logging.WARN)
parser = argparse.ArgumentParser(description='Dump bloat treeview.')
args = parser.parse_args()
check_deps()
# Always use android release?
rel_build_dir = os.path.join('out', 'android_Release')
src_root = Paths().src_root
build_dir = os.path.join(src_root, rel_build_dir)
tools_dir = os.path.join(src_root, ANDROID_TOOLS_DIR)
tools_prefix = 'arm-linux-androideabi-'
nm = os.path.join(tools_dir, tools_prefix + 'nm')
objdump = os.path.join(tools_dir, tools_prefix + 'objdump')
for name, binary in binaries(build_dir):
print 'Analyzing', name
nm_path = name + '.nm'
objdump_path = name + '.objdump'
json_path = name + '.json'
html_path = name + '.html'
with open(nm_path, 'w') as nm_file:
args = [nm, '-C', '-S', '-l', binary]
subprocess.check_call(args, stdout=nm_file)
with open(objdump_path, 'w') as objdump_file:
subprocess.check_call([objdump, '-h', binary], stdout=objdump_file)
with open(json_path, 'w') as json_file:
subprocess.check_call([
sys.executable,
'bloat/bloat.py',
'--nm-output=' + nm_path,
'--objdump-output=' + objdump_path,
'--strip-prefix=' + src_root + '/',
'syms'
], stdout=json_file)
source = None
with open('bloat/index.html', 'r') as source_file:
source = source_file.read().replace('bloat.json', json_path)
with open(html_path, 'w') as html_file:
html_file.write(source)
if __name__ == '__main__':
main()