Commit b9c3e2df authored by Changwan Ryu's avatar Changwan Ryu Committed by Commit Bot

Always optimize webview dex before running simpleperf

The Android framework does this some time after installation, and we
need to run this by default to closely emulate the real behavior.

Bug: 1048411
Change-Id: I80e10f72a8901a42ca0d397649c6a8fbd29198dd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2036526Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Commit-Queue: Changwan Ryu <changwan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#738350}
parent 25096568
...@@ -132,9 +132,8 @@ class SimplePerfRunner(object): ...@@ -132,9 +132,8 @@ class SimplePerfRunner(object):
self.device.product_cpu_abi) self.device.product_cpu_abi)
return arch return arch
def GetWebViewLibraryNameAndPath(self): def GetWebViewLibraryNameAndPath(self, package_name):
"""Get WebView library name and path on the device.""" """Get WebView library name and path on the device."""
package_name = self._GetCurrentWebViewProvider()
apk_path = self._GetWebViewApkPath(package_name) apk_path = self._GetWebViewApkPath(package_name)
logging.debug('WebView APK path:' + apk_path) logging.debug('WebView APK path:' + apk_path)
# TODO(changwan): check if we need support for bundle. # TODO(changwan): check if we need support for bundle.
...@@ -153,12 +152,14 @@ class SimplePerfRunner(object): ...@@ -153,12 +152,14 @@ class SimplePerfRunner(object):
def Run(self): def Run(self):
"""Run the simpleperf and do the post processing.""" """Run the simpleperf and do the post processing."""
package_name = self.GetCurrentWebViewProvider()
SimplePerfRunner.RunPackageCompile(package_name)
perf_data_path = os.path.join(self.tmp_dir, 'perf.data') perf_data_path = os.path.join(self.tmp_dir, 'perf.data')
SimplePerfRunner.RunSimplePerf(perf_data_path, self.args.record_options) SimplePerfRunner.RunSimplePerf(perf_data_path, self.args.record_options)
lines = SimplePerfRunner.GetOriginalReportHtml( lines = SimplePerfRunner.GetOriginalReportHtml(
perf_data_path, perf_data_path,
os.path.join(self.tmp_dir, 'unprocessed_report.html')) os.path.join(self.tmp_dir, 'unprocessed_report.html'))
lib_name, lib_path = self.GetWebViewLibraryNameAndPath() lib_name, lib_path = self.GetWebViewLibraryNameAndPath(package_name)
addresses = SimplePerfRunner.CollectAddresses(lines, lib_name) addresses = SimplePerfRunner.CollectAddresses(lines, lib_name)
logging.info("Extracted %d addresses", len(addresses)) logging.info("Extracted %d addresses", len(addresses))
address_function_pairs = self.address_interpreter.Interpret( address_function_pairs = self.address_interpreter.Interpret(
...@@ -185,7 +186,16 @@ class SimplePerfRunner(object): ...@@ -185,7 +186,16 @@ class SimplePerfRunner(object):
cmd.extend(['--record_options', record_options]) cmd.extend(['--record_options', record_options])
subprocess.check_call(cmd) subprocess.check_call(cmd)
def _GetCurrentWebViewProvider(self): @staticmethod
def RunPackageCompile(package_name):
"""Compile the package (dex optimization)."""
cmd = [
'adb', 'shell', 'cmd', 'package', 'compile', '-m', 'speed', '-f',
package_name
]
subprocess.check_call(cmd)
def GetCurrentWebViewProvider(self):
return self.device.GetWebViewUpdateServiceDump()['CurrentWebViewPackage'] return self.device.GetWebViewUpdateServiceDump()['CurrentWebViewPackage']
def _GetWebViewApkPath(self, package_name): def _GetWebViewApkPath(self, package_name):
......
...@@ -14,6 +14,7 @@ import mock # pylint: disable=import-error ...@@ -14,6 +14,7 @@ import mock # pylint: disable=import-error
from run_simpleperf import SimplePerfRunner from run_simpleperf import SimplePerfRunner
from run_simpleperf import StackAddressInterpreter from run_simpleperf import StackAddressInterpreter
_EXAMPLE_WEBVIEW_PACKAGE_NAME = "com.google.android.webview"
_EXAMPLE_STACK_SCRIPT_INPUT = [ _EXAMPLE_STACK_SCRIPT_INPUT = [
("11-15 00:00:00.000 11111 11111 E chromium: #00 0x0000001111111111 " ("11-15 00:00:00.000 11111 11111 E chromium: #00 0x0000001111111111 "
...@@ -144,8 +145,11 @@ class _RunSimpleperfTest(unittest.TestCase): ...@@ -144,8 +145,11 @@ class _RunSimpleperfTest(unittest.TestCase):
return_value=_MOCK_ADDRESS_FUNCTION_NAME_PAIRS) return_value=_MOCK_ADDRESS_FUNCTION_NAME_PAIRS)
SimplePerfRunner.RunSimplePerf = mock.Mock() SimplePerfRunner.RunSimplePerf = mock.Mock()
SimplePerfRunner.RunPackageCompile = mock.Mock()
SimplePerfRunner.GetOriginalReportHtml = mock.Mock( SimplePerfRunner.GetOriginalReportHtml = mock.Mock(
return_value=_MOCK_ORIGINAL_REPORT) return_value=_MOCK_ORIGINAL_REPORT)
self.simple_perf_runner.GetCurrentWebViewProvider = mock.Mock(
return_value=_EXAMPLE_WEBVIEW_PACKAGE_NAME)
self.simple_perf_runner.GetWebViewLibraryNameAndPath = mock.Mock( self.simple_perf_runner.GetWebViewLibraryNameAndPath = mock.Mock(
return_value=(_WEBVIEW_LIB_NAME, _WEBVIEW_LIB_PATH)) return_value=(_WEBVIEW_LIB_NAME, _WEBVIEW_LIB_PATH))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment