mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
94 lines
2.9 KiB
Python
Executable File
94 lines
2.9 KiB
Python
Executable File
#!/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()
|