Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file |
| 3 | # for details. All rights reserved. Use of this source code is governed by a |
| 4 | # BSD-style license that can be found in the LICENSE file. |
| 5 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 6 | import apk_masseur |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 7 | import apk_utils |
Morten Krogh-Jespersen | c2fbde2 | 2019-02-07 13:59:55 +0100 | [diff] [blame] | 8 | import golem |
Søren Gjesse | eed839d | 2019-01-11 15:19:16 +0100 | [diff] [blame] | 9 | import gradle |
Ian Zerny | 3f54e22 | 2019-02-12 10:51:17 +0100 | [diff] [blame] | 10 | import jdk |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 11 | import os |
| 12 | import optparse |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 13 | import shutil |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 14 | import subprocess |
| 15 | import sys |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 16 | import time |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 17 | import utils |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 18 | import zipfile |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 19 | |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 20 | import as_utils |
| 21 | |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 22 | SHRINKERS = ['r8', 'r8-full', 'r8-nolib', 'r8-nolib-full', 'pg'] |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 23 | WORKING_DIR = os.path.join(utils.BUILD, 'opensource_apps') |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 24 | |
Morten Krogh-Jespersen | aeb665e | 2019-02-07 12:29:03 +0100 | [diff] [blame] | 25 | if ('R8_BENCHMARK_DIR' in os.environ |
| 26 | and os.path.isdir(os.environ['R8_BENCHMARK_DIR'])): |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 27 | WORKING_DIR = os.environ['R8_BENCHMARK_DIR'] |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 28 | |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 29 | # For running on Golem all APPS are bundled as an x20-dependency and then copied |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 30 | # to WORKING_DIR. To update the app-bundle use 'run_on_as_app_x20_packager.py'. |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 31 | APPS = { |
| 32 | # 'app-name': { |
| 33 | # 'git_repo': ... |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 34 | # 'revision': ..., |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 35 | # 'app_module': ... (default app) |
| 36 | # 'archives_base_name': ... (default same as app_module) |
| 37 | # 'flavor': ... (default no flavor) |
Søren Gjesse | 8c11148 | 2018-12-21 14:47:57 +0100 | [diff] [blame] | 38 | # 'releaseTarget': ... (default <app_module>:assemble<flavor>Release |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 39 | # }, |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 40 | 'AnExplorer': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 41 | 'app_id': 'dev.dworks.apps.anexplorer.pro', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 42 | 'git_repo': 'https://github.com/christofferqa/AnExplorer', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 43 | 'revision': '365927477b8eab4052a1882d5e358057ae3dee4d', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 44 | 'flavor': 'googleMobilePro', |
| 45 | 'signed-apk-name': 'AnExplorer-googleMobileProRelease-4.0.3.apk', |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 46 | 'min_sdk': 17 |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 47 | }, |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 48 | 'AntennaPod': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 49 | 'app_id': 'de.danoeh.antennapod', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 50 | 'git_repo': 'https://github.com/christofferqa/AntennaPod.git', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 51 | 'revision': '77e94f4783a16abe9cc5b78dc2d2b2b1867d8c06', |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 52 | 'flavor': 'play', |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 53 | 'min_sdk': 14, |
| 54 | 'compile_sdk': 26 |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 55 | }, |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 56 | 'apps-android-wikipedia': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 57 | 'app_id': 'org.wikipedia', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 58 | 'git_repo': 'https://github.com/christofferqa/apps-android-wikipedia', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 59 | 'revision': '686e8aa5682af8e6a905054b935dd2daa57e63ee', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 60 | 'flavor': 'prod', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 61 | 'signed-apk-name': 'app-prod-universal-release.apk', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 62 | }, |
Morten Krogh-Jespersen | 2dbbc1b | 2019-01-24 16:31:52 +0100 | [diff] [blame] | 63 | 'chanu': { |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 64 | 'app_id': 'com.chanapps.four.activity', |
| 65 | 'git_repo': 'https://github.com/mkj-gram/chanu.git', |
| 66 | 'revision': '04ade1e9c33d707f0850d5eb9d6fa5e8af814a26', |
Morten Krogh-Jespersen | 2dbbc1b | 2019-01-24 16:31:52 +0100 | [diff] [blame] | 67 | }, |
Christoffer Quist Adamsen | 61b8c80 | 2018-12-20 08:18:40 +0100 | [diff] [blame] | 68 | 'friendlyeats-android': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 69 | 'app_id': 'com.google.firebase.example.fireeats', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 70 | 'git_repo': 'https://github.com/christofferqa/friendlyeats-android.git', |
| 71 | 'revision': '10091fa0ec37da12e66286559ad1b6098976b07b', |
Christoffer Quist Adamsen | 61b8c80 | 2018-12-20 08:18:40 +0100 | [diff] [blame] | 72 | }, |
Christoffer Quist Adamsen | a2d16cd | 2019-02-07 10:41:20 +0100 | [diff] [blame] | 73 | 'Instabug-Android': { |
| 74 | 'app_id': 'com.example.instabug', |
| 75 | 'git_repo': 'https://github.com/christofferqa/Instabug-Android.git', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 76 | 'revision': 'b8df78c96630a6537fbc07787b4990afc030cc0f' |
Christoffer Quist Adamsen | a2d16cd | 2019-02-07 10:41:20 +0100 | [diff] [blame] | 77 | }, |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 78 | 'KISS': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 79 | 'app_id': 'fr.neamar.kiss', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 80 | 'git_repo': 'https://github.com/christofferqa/KISS', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 81 | 'revision': '093da9ee0512e67192f62951c45a07a616fc3224', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 82 | }, |
| 83 | 'materialistic': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 84 | 'app_id': 'io.github.hidroh.materialistic', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 85 | 'git_repo': 'https://github.com/christofferqa/materialistic', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 86 | 'revision': '2b2b2ee25ce9e672d5aab1dc90a354af1522b1d9', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 87 | }, |
| 88 | 'Minimal-Todo': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 89 | 'app_id': 'com.avjindersinghsekhon.minimaltodo', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 90 | 'git_repo': 'https://github.com/christofferqa/Minimal-Todo', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 91 | 'revision': '9d8c73746762cd376b718858ec1e8783ca07ba7c', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 92 | }, |
| 93 | 'NewPipe': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 94 | 'app_id': 'org.schabi.newpipe', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 95 | 'git_repo': 'https://github.com/christofferqa/NewPipe', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 96 | 'revision': 'ed543099c7823be00f15d9340f94bdb7cb37d1e6', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 97 | }, |
Morten Krogh-Jespersen | 4293dcd | 2019-01-28 11:38:50 +0100 | [diff] [blame] | 98 | 'rover-android': { |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 99 | 'app_id': 'io.rover.app.debug', |
| 100 | 'app_module': 'debug-app', |
| 101 | 'git_repo': 'https://github.com/mkj-gram/rover-android.git', |
| 102 | 'revision': 'd2e876e597b3af7eab406e38a0e08327a38bd942', |
Morten Krogh-Jespersen | 4293dcd | 2019-01-28 11:38:50 +0100 | [diff] [blame] | 103 | }, |
Morten Krogh-Jespersen | 2dbbc1b | 2019-01-24 16:31:52 +0100 | [diff] [blame] | 104 | 'Signal-Android': { |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 105 | 'app_id': 'org.thoughtcrime.securesms', |
| 106 | 'app_module': '', |
| 107 | 'flavor': 'play', |
| 108 | 'git_repo': 'https://github.com/mkj-gram/Signal-Android.git', |
Morten Krogh-Jespersen | 0362726 | 2019-02-18 14:30:22 +0100 | [diff] [blame] | 109 | 'main_dex_rules': 'multidex-config.pro', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 110 | 'revision': '85e1a10993e5e9ffe923f0798b26cbc44068ba31', |
| 111 | 'releaseTarget': 'assemblePlayRelease', |
| 112 | 'signed-apk-name': 'Signal-play-release-4.32.7.apk', |
Morten Krogh-Jespersen | 2dbbc1b | 2019-01-24 16:31:52 +0100 | [diff] [blame] | 113 | }, |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 114 | 'Simple-Calendar': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 115 | 'app_id': 'com.simplemobiletools.calendar.pro', |
Christoffer Quist Adamsen | 4e661df | 2019-01-22 10:03:06 +0100 | [diff] [blame] | 116 | 'git_repo': 'https://github.com/christofferqa/Simple-Calendar', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 117 | 'revision': '82dad8c203eea5a0f0ddb513506d8f1de986ef2b', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 118 | 'signed-apk-name': 'calendar-release.apk' |
| 119 | }, |
Christoffer Quist Adamsen | c479a42 | 2019-02-07 10:23:50 +0100 | [diff] [blame] | 120 | 'sqldelight': { |
| 121 | 'app_id': 'com.example.sqldelight.hockey', |
| 122 | 'git_repo': 'https://github.com/christofferqa/sqldelight.git', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 123 | 'revision': '2e67a1126b6df05e4119d1e3a432fde51d76cdc8', |
Christoffer Quist Adamsen | c479a42 | 2019-02-07 10:23:50 +0100 | [diff] [blame] | 124 | 'app_module': 'sample/android', |
| 125 | 'archives_base_name': 'android', |
| 126 | 'min_sdk': 14, |
| 127 | 'compile_sdk': 28, |
| 128 | }, |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 129 | 'tachiyomi': { |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 130 | 'app_id': 'eu.kanade.tachiyomi', |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 131 | 'git_repo': 'https://github.com/sgjesse/tachiyomi.git', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 132 | 'revision': 'b15d2fe16864645055af6a745a62cc5566629798', |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 133 | 'flavor': 'standard', |
Søren Gjesse | 8c11148 | 2018-12-21 14:47:57 +0100 | [diff] [blame] | 134 | 'releaseTarget': 'app:assembleRelease', |
Christoffer Quist Adamsen | e59840b | 2019-01-22 15:25:15 +0100 | [diff] [blame] | 135 | 'min_sdk': 16 |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 136 | }, |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 137 | 'tivi': { |
| 138 | 'app_id': 'app.tivi', |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 139 | 'git_repo': 'https://github.com/sgjesse/tivi.git', |
Søren Gjesse | dbe6ebc | 2019-02-14 09:38:47 +0100 | [diff] [blame] | 140 | 'revision': '25c52e3593e7c98da4e537b49b29f6f67f88754d', |
Christoffer Quist Adamsen | 3b6f106 | 2019-02-07 09:49:43 +0100 | [diff] [blame] | 141 | 'min_sdk': 23, |
| 142 | 'compile_sdk': 28, |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 143 | }, |
Morten Krogh-Jespersen | 580dc64 | 2019-01-25 10:18:22 +0100 | [diff] [blame] | 144 | 'Tusky': { |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 145 | 'app_id': 'com.keylesspalace.tusky', |
| 146 | 'git_repo': 'https://github.com/mkj-gram/Tusky.git', |
| 147 | 'revision': 'b794f3ab90388add98461ffe70edb65c39351c33', |
| 148 | 'flavor': 'blue' |
Morten Krogh-Jespersen | 580dc64 | 2019-01-25 10:18:22 +0100 | [diff] [blame] | 149 | }, |
Morten Krogh-Jespersen | af6377d | 2019-01-29 11:18:31 +0100 | [diff] [blame] | 150 | 'Vungle-Android-SDK': { |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 151 | 'app_id': 'com.publisher.vungle.sample', |
| 152 | 'git_repo': 'https://github.com/mkj-gram/Vungle-Android-SDK.git', |
| 153 | 'revision': '3e231396ea7ce97b2655e03607497c75730e45f6', |
Morten Krogh-Jespersen | af6377d | 2019-01-29 11:18:31 +0100 | [diff] [blame] | 154 | }, |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 155 | # This does not build yet. |
| 156 | 'muzei': { |
| 157 | 'git_repo': 'https://github.com/sgjesse/muzei.git', |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 158 | 'revision': 'bed2a5f79c6e08b0a21e3e3f9242232d0848ef74', |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 159 | 'app_module': 'main', |
| 160 | 'archives_base_name': 'muzei', |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 161 | 'skip': True, |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 162 | }, |
| 163 | } |
| 164 | |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 165 | # TODO(christofferqa): Do not rely on 'emulator-5554' name |
| 166 | emulator_id = 'emulator-5554' |
| 167 | |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 168 | def ComputeSizeOfDexFilesInApk(apk): |
| 169 | dex_size = 0 |
| 170 | z = zipfile.ZipFile(apk, 'r') |
| 171 | for filename in z.namelist(): |
| 172 | if filename.endswith('.dex'): |
| 173 | dex_size += z.getinfo(filename).file_size |
| 174 | return dex_size |
| 175 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 176 | def IsBuiltWithR8(apk, temp_dir, options): |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 177 | r8_jar = os.path.join(temp_dir, 'r8.jar') |
| 178 | |
| 179 | # Use the copy of r8.jar if it is there. |
| 180 | if os.path.isfile(r8_jar): |
Ian Zerny | 3f54e22 | 2019-02-12 10:51:17 +0100 | [diff] [blame] | 181 | cmd = [jdk.GetJavaExecutable(), '-ea', '-jar', r8_jar, 'extractmarker', apk] |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 182 | else: |
| 183 | script = os.path.join(utils.TOOLS_DIR, 'extractmarker.py') |
| 184 | cmd = ['python', script, apk] |
| 185 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 186 | utils.PrintCmd(cmd, quiet=options.quiet) |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 187 | return '~~R8' in subprocess.check_output(cmd).strip() |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 188 | |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 189 | def IsMinifiedR8(shrinker): |
| 190 | return 'nolib' not in shrinker |
| 191 | |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 192 | def IsTrackedByGit(file): |
| 193 | return subprocess.check_output(['git', 'ls-files', file]).strip() != '' |
| 194 | |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 195 | def GitClone(git_url, revision, checkout_dir, quiet): |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 196 | result = subprocess.check_output( |
| 197 | ['git', 'clone', git_url, checkout_dir]).strip() |
| 198 | head_rev = utils.get_HEAD_sha1_for_checkout(checkout_dir) |
| 199 | if revision == head_rev: |
| 200 | return result |
| 201 | warn('Target revision is not head in {}.'.format(checkout_dir)) |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 202 | with utils.ChangedWorkingDirectory(checkout_dir, quiet=quiet): |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 203 | subprocess.check_output(['git', 'reset', '--hard', revision]) |
| 204 | return result |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 205 | |
| 206 | def GitCheckout(file): |
| 207 | return subprocess.check_output(['git', 'checkout', file]).strip() |
| 208 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 209 | def InstallApkOnEmulator(apk_dest, options): |
| 210 | cmd = ['adb', '-s', emulator_id, 'install', '-r', '-d', apk_dest] |
| 211 | if options.quiet: |
| 212 | with open(os.devnull, 'w') as devnull: |
| 213 | subprocess.check_call(cmd, stdout=devnull) |
| 214 | else: |
| 215 | subprocess.check_call(cmd) |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 216 | |
Christoffer Quist Adamsen | 81321b6 | 2019-01-15 14:39:53 +0100 | [diff] [blame] | 217 | def PercentageDiffAsString(before, after): |
| 218 | if after < before: |
| 219 | return '-' + str(round((1.0 - after / before) * 100)) + '%' |
| 220 | else: |
| 221 | return '+' + str(round((after - before) / before * 100)) + '%' |
| 222 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 223 | def UninstallApkOnEmulator(app, config, options): |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 224 | app_id = config.get('app_id') |
| 225 | process = subprocess.Popen( |
Christoffer Quist Adamsen | 6760898 | 2019-02-08 10:09:35 +0100 | [diff] [blame] | 226 | ['adb', '-s', emulator_id, 'uninstall', app_id], |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 227 | stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| 228 | stdout, stderr = process.communicate() |
| 229 | |
| 230 | if stdout.strip() == 'Success': |
| 231 | # Successfully uninstalled |
| 232 | return |
| 233 | |
| 234 | if 'Unknown package: {}'.format(app_id) in stderr: |
| 235 | # Application not installed |
| 236 | return |
| 237 | |
| 238 | raise Exception( |
| 239 | 'Unexpected result from `adb uninstall {}\nStdout: {}\nStderr: {}'.format( |
| 240 | app_id, stdout, stderr)) |
| 241 | |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 242 | def WaitForEmulator(): |
| 243 | stdout = subprocess.check_output(['adb', 'devices']) |
| 244 | if '{}\tdevice'.format(emulator_id) in stdout: |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 245 | return True |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 246 | |
| 247 | print('Emulator \'{}\' not connected; waiting for connection'.format( |
| 248 | emulator_id)) |
| 249 | |
| 250 | time_waited = 0 |
| 251 | while True: |
| 252 | time.sleep(10) |
| 253 | time_waited += 10 |
| 254 | stdout = subprocess.check_output(['adb', 'devices']) |
| 255 | if '{}\tdevice'.format(emulator_id) not in stdout: |
| 256 | print('... still waiting for connection') |
| 257 | if time_waited >= 5 * 60: |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 258 | return False |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 259 | else: |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 260 | return True |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 261 | |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 262 | def GetResultsForApp(app, config, options, temp_dir): |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 263 | # Checkout and build in the build directory. |
| 264 | checkout_dir = os.path.join(WORKING_DIR, app) |
| 265 | |
Christoffer Quist Adamsen | 724bfb0 | 2019-01-10 09:54:38 +0100 | [diff] [blame] | 266 | result = {} |
| 267 | |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 268 | if not os.path.exists(checkout_dir) and not options.golem: |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 269 | with utils.ChangedWorkingDirectory(WORKING_DIR, quiet=options.quiet): |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 270 | GitClone( |
| 271 | config['git_repo'], config['revision'], checkout_dir, options.quiet) |
Christoffer Quist Adamsen | 860fa93 | 2019-01-10 14:27:39 +0100 | [diff] [blame] | 272 | |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 273 | checkout_rev = utils.get_HEAD_sha1_for_checkout(checkout_dir) |
| 274 | if config['revision'] != checkout_rev: |
| 275 | msg = 'Checkout is not target revision for {} in {}.'.format( |
| 276 | app, checkout_dir) |
| 277 | if options.ignore_versions: |
| 278 | warn(msg) |
| 279 | else: |
| 280 | raise Exception(msg) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 281 | |
Christoffer Quist Adamsen | 724bfb0 | 2019-01-10 09:54:38 +0100 | [diff] [blame] | 282 | result['status'] = 'success' |
| 283 | |
| 284 | result_per_shrinker = BuildAppWithSelectedShrinkers( |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 285 | app, config, options, checkout_dir, temp_dir) |
Christoffer Quist Adamsen | 724bfb0 | 2019-01-10 09:54:38 +0100 | [diff] [blame] | 286 | for shrinker, shrinker_result in result_per_shrinker.iteritems(): |
| 287 | result[shrinker] = shrinker_result |
| 288 | |
| 289 | return result |
| 290 | |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 291 | def BuildAppWithSelectedShrinkers(app, config, options, checkout_dir, temp_dir): |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 292 | result_per_shrinker = {} |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 293 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 294 | with utils.ChangedWorkingDirectory(checkout_dir, quiet=options.quiet): |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 295 | for shrinker in SHRINKERS: |
Christoffer Quist Adamsen | 860fa93 | 2019-01-10 14:27:39 +0100 | [diff] [blame] | 296 | if options.shrinker and shrinker not in options.shrinker: |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 297 | continue |
| 298 | |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 299 | apk_dest = None |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 300 | |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 301 | result = {} |
| 302 | try: |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 303 | out_dir = os.path.join(checkout_dir, 'out', shrinker) |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 304 | (apk_dest, profile_dest_dir, proguard_config_file) = \ |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 305 | BuildAppWithShrinker(app, config, shrinker, checkout_dir, out_dir, |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 306 | temp_dir, options) |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 307 | dex_size = ComputeSizeOfDexFilesInApk(apk_dest) |
Morten Krogh-Jespersen | d35065e | 2019-02-07 10:28:52 +0100 | [diff] [blame] | 308 | result['apk_dest'] = apk_dest |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 309 | result['build_status'] = 'success' |
| 310 | result['dex_size'] = dex_size |
Christoffer Quist Adamsen | 1d87ca6 | 2019-01-11 12:22:26 +0100 | [diff] [blame] | 311 | result['profile_dest_dir'] = profile_dest_dir |
Christoffer Quist Adamsen | 81321b6 | 2019-01-15 14:39:53 +0100 | [diff] [blame] | 312 | |
| 313 | profile = as_utils.ParseProfileReport(profile_dest_dir) |
| 314 | result['profile'] = { |
| 315 | task_name:duration for task_name, duration in profile.iteritems() |
| 316 | if as_utils.IsGradleCompilerTask(task_name, shrinker)} |
Christoffer Quist Adamsen | 1d87ca6 | 2019-01-11 12:22:26 +0100 | [diff] [blame] | 317 | except Exception as e: |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 318 | warn('Failed to build {} with {}'.format(app, shrinker)) |
Christoffer Quist Adamsen | 1d87ca6 | 2019-01-11 12:22:26 +0100 | [diff] [blame] | 319 | if e: |
| 320 | print('Error: ' + str(e)) |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 321 | result['build_status'] = 'failed' |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 322 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 323 | if result.get('build_status') == 'success': |
| 324 | if options.monkey: |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 325 | result['monkey_status'] = 'success' if RunMonkey( |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 326 | app, config, options, apk_dest) else 'failed' |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 327 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 328 | if 'r8' in shrinker and options.r8_compilation_steps > 1: |
| 329 | recompilation_results = [] |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 330 | |
| 331 | # Build app with gradle using -D...keepRuleSynthesisForRecompilation= |
| 332 | # true. |
| 333 | out_dir = os.path.join(checkout_dir, 'out', shrinker + '-1') |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 334 | (apk_dest, profile_dest_dir, ext_proguard_config_file) = \ |
| 335 | BuildAppWithShrinker(app, config, shrinker, checkout_dir, out_dir, |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 336 | temp_dir, options, keepRuleSynthesisForRecompilation=True) |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 337 | dex_size = ComputeSizeOfDexFilesInApk(apk_dest) |
| 338 | recompilation_result = { |
| 339 | 'apk_dest': apk_dest, |
| 340 | 'build_status': 'success', |
| 341 | 'dex_size': ComputeSizeOfDexFilesInApk(apk_dest), |
| 342 | 'monkey_status': 'skipped' |
| 343 | } |
| 344 | recompilation_results.append(recompilation_result) |
| 345 | |
| 346 | # Sanity check that keep rules have changed. |
| 347 | with open(ext_proguard_config_file) as new: |
| 348 | with open(proguard_config_file) as old: |
Christoffer Quist Adamsen | d2bfcde | 2019-01-22 10:05:15 +0100 | [diff] [blame] | 349 | assert(sum(1 for line in new) > sum(1 for line in old)) |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 350 | |
Christoffer Quist Adamsen | e59840b | 2019-01-22 15:25:15 +0100 | [diff] [blame] | 351 | # Extract min-sdk and target-sdk |
| 352 | (min_sdk, compile_sdk) = as_utils.GetMinAndCompileSdk(app, config, |
| 353 | checkout_dir, apk_dest) |
| 354 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 355 | # Now rebuild generated apk. |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 356 | previous_apk = apk_dest |
Morten Krogh-Jespersen | 0362726 | 2019-02-18 14:30:22 +0100 | [diff] [blame] | 357 | |
| 358 | # We may need main dex rules when re-compiling with R8 as standalone. |
| 359 | main_dex_rules = None |
| 360 | if config.get('main_dex_rules'): |
| 361 | main_dex_rules = os.path.join( |
| 362 | checkout_dir, config.get('main_dex_rules')) |
| 363 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 364 | for i in range(1, options.r8_compilation_steps): |
| 365 | try: |
| 366 | recompiled_apk_dest = os.path.join( |
| 367 | checkout_dir, 'out', shrinker, 'app-release-{}.apk'.format(i)) |
| 368 | RebuildAppWithShrinker( |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 369 | app, previous_apk, recompiled_apk_dest, |
| 370 | ext_proguard_config_file, shrinker, min_sdk, compile_sdk, |
Morten Krogh-Jespersen | 0362726 | 2019-02-18 14:30:22 +0100 | [diff] [blame] | 371 | options, temp_dir, main_dex_rules) |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 372 | recompilation_result = { |
| 373 | 'apk_dest': recompiled_apk_dest, |
| 374 | 'build_status': 'success', |
| 375 | 'dex_size': ComputeSizeOfDexFilesInApk(recompiled_apk_dest) |
| 376 | } |
| 377 | if options.monkey: |
| 378 | recompilation_result['monkey_status'] = 'success' if RunMonkey( |
| 379 | app, config, options, recompiled_apk_dest) else 'failed' |
| 380 | recompilation_results.append(recompilation_result) |
| 381 | previous_apk = recompiled_apk_dest |
| 382 | except Exception as e: |
| 383 | warn('Failed to recompile {} with {}'.format(app, shrinker)) |
| 384 | recompilation_results.append({ 'build_status': 'failed' }) |
| 385 | break |
| 386 | result['recompilation_results'] = recompilation_results |
| 387 | |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 388 | result_per_shrinker[shrinker] = result |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 389 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 390 | if not options.app: |
| 391 | print('') |
| 392 | LogResultsForApp(app, result_per_shrinker, options) |
| 393 | print('') |
| 394 | |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 395 | return result_per_shrinker |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 396 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 397 | def BuildAppWithShrinker( |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 398 | app, config, shrinker, checkout_dir, out_dir, temp_dir, options, |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 399 | keepRuleSynthesisForRecompilation=False): |
| 400 | print('Building {} with {}{}'.format( |
| 401 | app, |
| 402 | shrinker, |
| 403 | ' for recompilation' if keepRuleSynthesisForRecompilation else '')) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 404 | |
Morten Krogh-Jespersen | de566ea | 2019-02-18 11:59:48 +0100 | [diff] [blame] | 405 | # Add settings.gradle file if it is not present to prevent gradle from finding |
| 406 | # the settings.gradle file in the r8 root when apps are placed under |
| 407 | # $R8/build. |
| 408 | as_utils.add_settings_gradle(checkout_dir, app) |
| 409 | |
Morten Krogh-Jespersen | aeb665e | 2019-02-07 12:29:03 +0100 | [diff] [blame] | 410 | # Add 'r8.jar' from top-level build.gradle. |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 411 | as_utils.add_r8_dependency(checkout_dir, temp_dir, IsMinifiedR8(shrinker)) |
Christoffer Quist Adamsen | f8ad479 | 2019-01-09 13:19:19 +0100 | [diff] [blame] | 412 | |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 413 | app_module = config.get('app_module', 'app') |
Morten Krogh-Jespersen | 47d62ba | 2019-01-22 08:35:49 +0100 | [diff] [blame] | 414 | archives_base_name = config.get('archives_base_name', app_module) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 415 | flavor = config.get('flavor') |
| 416 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 417 | if not os.path.exists(out_dir): |
| 418 | os.makedirs(out_dir) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 419 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 420 | # Set -printconfiguration in Proguard rules. |
| 421 | proguard_config_dest = os.path.abspath( |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 422 | os.path.join(out_dir, 'proguard-rules.pro')) |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 423 | as_utils.SetPrintConfigurationDirective( |
| 424 | app, config, checkout_dir, proguard_config_dest) |
| 425 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 426 | env = {} |
Morten Krogh-Jespersen | c8efedd | 2019-01-28 11:36:17 +0100 | [diff] [blame] | 427 | env['ANDROID_HOME'] = utils.ANDROID_HOME |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 428 | env['JAVA_OPTS'] = '-ea:com.android.tools.r8...' |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 429 | |
Søren Gjesse | 8c11148 | 2018-12-21 14:47:57 +0100 | [diff] [blame] | 430 | releaseTarget = config.get('releaseTarget') |
| 431 | if not releaseTarget: |
Christoffer Quist Adamsen | c479a42 | 2019-02-07 10:23:50 +0100 | [diff] [blame] | 432 | releaseTarget = app_module.replace('/', ':') + ':' + 'assemble' + ( |
Søren Gjesse | 8c11148 | 2018-12-21 14:47:57 +0100 | [diff] [blame] | 433 | flavor.capitalize() if flavor else '') + 'Release' |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 434 | |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 435 | # Value for property android.enableR8. |
| 436 | enableR8 = 'r8' in shrinker |
| 437 | # Value for property android.enableR8.fullMode. |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 438 | enableR8FullMode = shrinker == 'r8-full' or shrinker == 'r8-nolib-full' |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 439 | # Build gradlew command line. |
| 440 | cmd = ['./gradlew', '--no-daemon', 'clean', releaseTarget, |
| 441 | '--profile', '--stacktrace', |
| 442 | '-Pandroid.enableR8=' + str(enableR8).lower(), |
| 443 | '-Pandroid.enableR8.fullMode=' + str(enableR8FullMode).lower()] |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 444 | if keepRuleSynthesisForRecompilation: |
| 445 | cmd.append('-Dcom.android.tools.r8.keepRuleSynthesisForRecompilation=true') |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 446 | if options.gradle_flags: |
| 447 | cmd.extend(options.gradle_flags.split(' ')) |
Christoffer Quist Adamsen | 1d87ca6 | 2019-01-11 12:22:26 +0100 | [diff] [blame] | 448 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 449 | stdout = utils.RunCmd(cmd, env, quiet=options.quiet) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 450 | |
| 451 | apk_base_name = (archives_base_name |
| 452 | + (('-' + flavor) if flavor else '') + '-release') |
| 453 | signed_apk_name = config.get('signed-apk-name', apk_base_name + '.apk') |
| 454 | unsigned_apk_name = apk_base_name + '-unsigned.apk' |
| 455 | |
| 456 | build_dir = config.get('build_dir', 'build') |
| 457 | build_output_apks = os.path.join(app_module, build_dir, 'outputs', 'apk') |
| 458 | if flavor: |
| 459 | build_output_apks = os.path.join(build_output_apks, flavor, 'release') |
| 460 | else: |
| 461 | build_output_apks = os.path.join(build_output_apks, 'release') |
| 462 | |
| 463 | signed_apk = os.path.join(build_output_apks, signed_apk_name) |
| 464 | unsigned_apk = os.path.join(build_output_apks, unsigned_apk_name) |
| 465 | |
| 466 | if options.sign_apks and not os.path.isfile(signed_apk): |
| 467 | assert os.path.isfile(unsigned_apk) |
| 468 | if options.sign_apks: |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 469 | apk_utils.sign_with_apksigner( |
Morten Krogh-Jespersen | c8efedd | 2019-01-28 11:36:17 +0100 | [diff] [blame] | 470 | utils.ANDROID_BUILD_TOOLS, |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 471 | unsigned_apk, |
| 472 | signed_apk, |
Christoffer Quist Adamsen | 3b6f106 | 2019-02-07 09:49:43 +0100 | [diff] [blame] | 473 | options.keystore, |
| 474 | options.keystore_password, |
| 475 | quiet=options.quiet) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 476 | |
| 477 | if os.path.isfile(signed_apk): |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 478 | apk_dest = os.path.join(out_dir, signed_apk_name) |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 479 | as_utils.MoveFile(signed_apk, apk_dest, quiet=options.quiet) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 480 | else: |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 481 | apk_dest = os.path.join(out_dir, unsigned_apk_name) |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 482 | as_utils.MoveFile(unsigned_apk, apk_dest, quiet=options.quiet) |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 483 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 484 | assert IsBuiltWithR8(apk_dest, temp_dir, options) == ('r8' in shrinker), ( |
Christoffer Quist Adamsen | 3aa8d25 | 2018-12-13 14:56:40 +0100 | [diff] [blame] | 485 | 'Unexpected marker in generated APK for {}'.format(shrinker)) |
| 486 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 487 | profile_dest_dir = os.path.join(out_dir, 'profile') |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 488 | as_utils.MoveProfileReportTo(profile_dest_dir, stdout, quiet=options.quiet) |
Christoffer Quist Adamsen | 1d87ca6 | 2019-01-11 12:22:26 +0100 | [diff] [blame] | 489 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 490 | return (apk_dest, profile_dest_dir, proguard_config_dest) |
| 491 | |
Christoffer Quist Adamsen | e59840b | 2019-01-22 15:25:15 +0100 | [diff] [blame] | 492 | def RebuildAppWithShrinker( |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 493 | app, apk, apk_dest, proguard_config_file, shrinker, min_sdk, compile_sdk, |
Morten Krogh-Jespersen | 0362726 | 2019-02-18 14:30:22 +0100 | [diff] [blame] | 494 | options, temp_dir, main_dex_rules): |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 495 | assert 'r8' in shrinker |
| 496 | assert apk_dest.endswith('.apk') |
Søren Gjesse | 9fb4880 | 2019-01-18 11:00:00 +0100 | [diff] [blame] | 497 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 498 | print('Rebuilding {} with {}'.format(app, shrinker)) |
| 499 | |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 500 | # Compile given APK with shrinker to temporary zip file. |
Christoffer Quist Adamsen | 17879c1 | 2019-01-22 16:13:54 +0100 | [diff] [blame] | 501 | android_jar = utils.get_android_jar(compile_sdk) |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 502 | r8_jar = os.path.join( |
| 503 | temp_dir, 'r8lib.jar' if IsMinifiedR8(shrinker) else 'r8.jar') |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 504 | zip_dest = apk_dest[:-4] + '.zip' |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 505 | |
Christoffer Quist Adamsen | e59840b | 2019-01-22 15:25:15 +0100 | [diff] [blame] | 506 | # TODO(christofferqa): Entry point should be CompatProguard if the shrinker |
| 507 | # is 'r8'. |
| 508 | entry_point = 'com.android.tools.r8.R8' |
| 509 | |
Ian Zerny | 3f54e22 | 2019-02-12 10:51:17 +0100 | [diff] [blame] | 510 | cmd = [jdk.GetJavaExecutable(), '-ea:com.android.tools.r8...', '-cp', r8_jar, entry_point, |
Christoffer Quist Adamsen | e59840b | 2019-01-22 15:25:15 +0100 | [diff] [blame] | 511 | '--release', '--min-api', str(min_sdk), '--pg-conf', proguard_config_file, |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 512 | '--lib', android_jar, '--output', zip_dest, apk] |
Christoffer Quist Adamsen | 17879c1 | 2019-01-22 16:13:54 +0100 | [diff] [blame] | 513 | |
| 514 | for android_optional_jar in utils.get_android_optional_jars(compile_sdk): |
| 515 | cmd.append('--lib') |
| 516 | cmd.append(android_optional_jar) |
| 517 | |
Morten Krogh-Jespersen | 0362726 | 2019-02-18 14:30:22 +0100 | [diff] [blame] | 518 | if main_dex_rules: |
| 519 | cmd.append('--main-dex-rules') |
| 520 | cmd.append(main_dex_rules) |
| 521 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 522 | utils.RunCmd(cmd, quiet=options.quiet) |
Christoffer Quist Adamsen | 4038bbe | 2019-01-15 14:31:46 +0100 | [diff] [blame] | 523 | |
| 524 | # Make a copy of the given APK, move the newly generated dex files into the |
| 525 | # copied APK, and then sign the APK. |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 526 | apk_masseur.masseur( |
| 527 | apk, dex=zip_dest, out=apk_dest, quiet=options.quiet) |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 528 | |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 529 | def RunMonkey(app, config, options, apk_dest): |
| 530 | if not WaitForEmulator(): |
| 531 | return False |
| 532 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 533 | UninstallApkOnEmulator(app, config, options) |
| 534 | InstallApkOnEmulator(apk_dest, options) |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 535 | |
| 536 | app_id = config.get('app_id') |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 537 | number_of_events_to_generate = options.monkey_events |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 538 | |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 539 | # Intentionally using a constant seed such that the monkey generates the same |
| 540 | # event sequence for each shrinker. |
| 541 | random_seed = 42 |
| 542 | |
| 543 | cmd = ['adb', 'shell', 'monkey', '-p', app_id, '-s', str(random_seed), |
Christoffer Quist Adamsen | 88b7ebe | 2019-01-14 11:22:17 +0100 | [diff] [blame] | 544 | str(number_of_events_to_generate)] |
Christoffer Quist Adamsen | 88b7ebe | 2019-01-14 11:22:17 +0100 | [diff] [blame] | 545 | |
| 546 | try: |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 547 | stdout = utils.RunCmd(cmd, quiet=options.quiet) |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 548 | succeeded = ( |
| 549 | 'Events injected: {}'.format(number_of_events_to_generate) in stdout) |
Christoffer Quist Adamsen | 88b7ebe | 2019-01-14 11:22:17 +0100 | [diff] [blame] | 550 | except subprocess.CalledProcessError as e: |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 551 | succeeded = False |
Christoffer Quist Adamsen | 88b7ebe | 2019-01-14 11:22:17 +0100 | [diff] [blame] | 552 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 553 | UninstallApkOnEmulator(app, config, options) |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 554 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 555 | return succeeded |
| 556 | |
| 557 | def LogResultsForApps(result_per_shrinker_per_app, options): |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 558 | print('') |
| 559 | for app, result_per_shrinker in sorted( |
Morten Krogh-Jespersen | aeb665e | 2019-02-07 12:29:03 +0100 | [diff] [blame] | 560 | result_per_shrinker_per_app.iteritems(), key=lambda s: s[0].lower()): |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 561 | LogResultsForApp(app, result_per_shrinker, options) |
Christoffer Quist Adamsen | 724bfb0 | 2019-01-10 09:54:38 +0100 | [diff] [blame] | 562 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 563 | def LogResultsForApp(app, result_per_shrinker, options): |
Morten Krogh-Jespersen | aeb665e | 2019-02-07 12:29:03 +0100 | [diff] [blame] | 564 | if options.print_dexsegments: |
| 565 | LogSegmentsForApp(app, result_per_shrinker, options) |
| 566 | else: |
| 567 | LogComparisonResultsForApp(app, result_per_shrinker, options) |
| 568 | |
| 569 | def LogSegmentsForApp(app, result_per_shrinker, options): |
| 570 | for shrinker in SHRINKERS: |
| 571 | if shrinker not in result_per_shrinker: |
| 572 | continue |
| 573 | result = result_per_shrinker[shrinker]; |
| 574 | benchmark_name = '{}-{}'.format(options.print_dexsegments, app) |
| 575 | utils.print_dexsegments(benchmark_name, [result.get('apk_dest')]) |
| 576 | duration = sum(result.get('profile').values()) |
| 577 | print('%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration * 1000)) |
| 578 | print('%s-Total(CodeSize): %s' % (benchmark_name, result.get('dex_size'))) |
| 579 | |
| 580 | |
| 581 | def LogComparisonResultsForApp(app, result_per_shrinker, options): |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 582 | print(app + ':') |
| 583 | |
Christoffer Quist Adamsen | 1de3dde | 2019-01-24 13:17:46 +0100 | [diff] [blame] | 584 | if result_per_shrinker.get('status', 'success') != 'success': |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 585 | error_message = result_per_shrinker.get('error_message') |
| 586 | print(' skipped ({})'.format(error_message)) |
| 587 | return |
| 588 | |
Morten Krogh-Jespersen | aeb665e | 2019-02-07 12:29:03 +0100 | [diff] [blame] | 589 | proguard_result = result_per_shrinker.get('pg', {}) |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 590 | proguard_dex_size = float(proguard_result.get('dex_size', -1)) |
| 591 | proguard_duration = sum(proguard_result.get('profile', {}).values()) |
| 592 | |
| 593 | for shrinker in SHRINKERS: |
| 594 | if shrinker not in result_per_shrinker: |
Christoffer Quist Adamsen | 724bfb0 | 2019-01-10 09:54:38 +0100 | [diff] [blame] | 595 | continue |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 596 | result = result_per_shrinker.get(shrinker) |
| 597 | build_status = result.get('build_status') |
| 598 | if build_status != 'success': |
| 599 | warn(' {}: {}'.format(shrinker, build_status)) |
| 600 | else: |
| 601 | print(' {}:'.format(shrinker)) |
| 602 | dex_size = result.get('dex_size') |
| 603 | msg = ' dex size: {}'.format(dex_size) |
| 604 | if dex_size != proguard_dex_size and proguard_dex_size >= 0: |
| 605 | msg = '{} ({}, {})'.format( |
| 606 | msg, dex_size - proguard_dex_size, |
| 607 | PercentageDiffAsString(proguard_dex_size, dex_size)) |
| 608 | success(msg) if dex_size < proguard_dex_size else warn(msg) |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 609 | else: |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 610 | print(msg) |
Christoffer Quist Adamsen | 81321b6 | 2019-01-15 14:39:53 +0100 | [diff] [blame] | 611 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 612 | profile = result.get('profile') |
| 613 | duration = sum(profile.values()) |
| 614 | msg = ' performance: {}s'.format(duration) |
| 615 | if duration != proguard_duration and proguard_duration > 0: |
| 616 | msg = '{} ({}s, {})'.format( |
| 617 | msg, duration - proguard_duration, |
| 618 | PercentageDiffAsString(proguard_duration, duration)) |
| 619 | success(msg) if duration < proguard_duration else warn(msg) |
| 620 | else: |
| 621 | print(msg) |
| 622 | if len(profile) >= 2: |
| 623 | for task_name, task_duration in profile.iteritems(): |
| 624 | print(' {}: {}s'.format(task_name, task_duration)) |
Christoffer Quist Adamsen | 81321b6 | 2019-01-15 14:39:53 +0100 | [diff] [blame] | 625 | |
Christoffer Quist Adamsen | d0e0a7c | 2019-01-22 10:00:30 +0100 | [diff] [blame] | 626 | if options.monkey: |
| 627 | monkey_status = result.get('monkey_status') |
| 628 | if monkey_status != 'success': |
| 629 | warn(' monkey: {}'.format(monkey_status)) |
| 630 | else: |
| 631 | success(' monkey: {}'.format(monkey_status)) |
| 632 | recompilation_results = result.get('recompilation_results', []) |
| 633 | i = 0 |
| 634 | for recompilation_result in recompilation_results: |
| 635 | build_status = recompilation_result.get('build_status') |
| 636 | if build_status != 'success': |
| 637 | print(' recompilation #{}: {}'.format(i, build_status)) |
| 638 | else: |
| 639 | dex_size = recompilation_result.get('dex_size') |
| 640 | print(' recompilation #{}'.format(i)) |
| 641 | print(' dex size: {}'.format(dex_size)) |
| 642 | if options.monkey: |
| 643 | monkey_status = recompilation_result.get('monkey_status') |
| 644 | msg = ' monkey: {}'.format(monkey_status) |
| 645 | if monkey_status == 'success': |
| 646 | success(msg) |
| 647 | elif monkey_status == 'skipped': |
| 648 | print(msg) |
| 649 | else: |
| 650 | warn(msg) |
| 651 | i += 1 |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 652 | |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 653 | def ParseOptions(argv): |
| 654 | result = optparse.OptionParser() |
| 655 | result.add_option('--app', |
| 656 | help='What app to run on', |
| 657 | choices=APPS.keys()) |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 658 | result.add_option('--download-only', '--download_only', |
| 659 | help='Whether to download apps without any compilation', |
| 660 | default=False, |
| 661 | action='store_true') |
| 662 | result.add_option('--golem', |
| 663 | help='Running on golem, do not download', |
| 664 | default=False, |
| 665 | action='store_true') |
Morten Krogh-Jespersen | d35065e | 2019-02-07 10:28:52 +0100 | [diff] [blame] | 666 | result.add_option('--gradle-flags', '--gradle_flags', |
| 667 | help='Flags to pass in to gradle') |
Morten Krogh-Jespersen | e0ce6a3 | 2019-02-07 11:44:45 +0100 | [diff] [blame] | 668 | result.add_option('--ignore-versions', '--ignore_versions', |
| 669 | help='Allow checked-out app to differ in revision from ' |
| 670 | 'pinned', |
| 671 | default=False, |
| 672 | action='store_true') |
Christoffer Quist Adamsen | 3b6f106 | 2019-02-07 09:49:43 +0100 | [diff] [blame] | 673 | result.add_option('--keystore', |
| 674 | help='Path to app.keystore', |
| 675 | default='app.keystore') |
| 676 | result.add_option('--keystore-password', '--keystore_password', |
| 677 | help='Password for app.keystore', |
| 678 | default='android') |
Christoffer Quist Adamsen | 1d0a0fe | 2018-12-21 14:28:56 +0100 | [diff] [blame] | 679 | result.add_option('--monkey', |
| 680 | help='Whether to install and run app(s) with monkey', |
| 681 | default=False, |
| 682 | action='store_true') |
Christoffer Quist Adamsen | bae3661 | 2019-01-15 12:23:51 +0100 | [diff] [blame] | 683 | result.add_option('--monkey_events', |
| 684 | help='Number of events that the monkey should trigger', |
| 685 | default=250, |
| 686 | type=int) |
Morten Krogh-Jespersen | d35065e | 2019-02-07 10:28:52 +0100 | [diff] [blame] | 687 | result.add_option('--no-build', '--no_build', |
| 688 | help='Run without building ToT first (only when using ToT)', |
| 689 | default=False, |
| 690 | action='store_true') |
Morten Krogh-Jespersen | d35065e | 2019-02-07 10:28:52 +0100 | [diff] [blame] | 691 | result.add_option('--quiet', |
| 692 | help='Disable verbose logging', |
| 693 | default=False, |
| 694 | action='store_true') |
Morten Krogh-Jespersen | aeb665e | 2019-02-07 12:29:03 +0100 | [diff] [blame] | 695 | result.add_option('--print-dexsegments', |
| 696 | metavar='BENCHMARKNAME', |
| 697 | help='Print the sizes of individual dex segments as ' + |
| 698 | '\'<BENCHMARKNAME>-<APP>-<segment>(CodeSize): ' |
| 699 | '<bytes>\'') |
Morten Krogh-Jespersen | d35065e | 2019-02-07 10:28:52 +0100 | [diff] [blame] | 700 | result.add_option('--r8-compilation-steps', '--r8_compilation_steps', |
| 701 | help='Number of times R8 should be run on each app', |
| 702 | default=2, |
| 703 | type=int) |
Søren Gjesse | eed839d | 2019-01-11 15:19:16 +0100 | [diff] [blame] | 704 | result.add_option('--sign-apks', '--sign_apks', |
Christoffer Quist Adamsen | 10b7db8 | 2018-12-13 14:50:38 +0100 | [diff] [blame] | 705 | help='Whether the APKs should be signed', |
| 706 | default=False, |
| 707 | action='store_true') |
| 708 | result.add_option('--shrinker', |
Christoffer Quist Adamsen | 860fa93 | 2019-01-10 14:27:39 +0100 | [diff] [blame] | 709 | help='The shrinkers to use (by default, all are run)', |
| 710 | action='append') |
Christoffer Quist Adamsen | 860fa93 | 2019-01-10 14:27:39 +0100 | [diff] [blame] | 711 | (options, args) = result.parse_args(argv) |
| 712 | if options.shrinker: |
| 713 | for shrinker in options.shrinker: |
| 714 | assert shrinker in SHRINKERS |
| 715 | return (options, args) |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 716 | |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 717 | def download_apps(quiet): |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 718 | # Download apps and place in build |
| 719 | with utils.ChangedWorkingDirectory(WORKING_DIR): |
| 720 | for app, config in APPS.iteritems(): |
| 721 | app_dir = os.path.join(WORKING_DIR, app) |
| 722 | if not os.path.exists(app_dir): |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 723 | GitClone(config['git_repo'], config['revision'], app_dir, quiet) |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 724 | |
| 725 | |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 726 | def main(argv): |
Christoffer Quist Adamsen | f8ad479 | 2019-01-09 13:19:19 +0100 | [diff] [blame] | 727 | global SHRINKERS |
| 728 | |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 729 | (options, args) = ParseOptions(argv) |
Christoffer Quist Adamsen | f8ad479 | 2019-01-09 13:19:19 +0100 | [diff] [blame] | 730 | |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 731 | if options.golem: |
Morten Krogh-Jespersen | c2fbde2 | 2019-02-07 13:59:55 +0100 | [diff] [blame] | 732 | golem.link_third_party() |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 733 | if os.path.exists(WORKING_DIR): |
| 734 | shutil.rmtree(WORKING_DIR) |
| 735 | shutil.copytree(utils.OPENSOURCE_APPS_FOLDER, WORKING_DIR) |
| 736 | |
| 737 | if not os.path.exists(WORKING_DIR): |
| 738 | os.makedirs(WORKING_DIR) |
| 739 | |
| 740 | if options.download_only: |
Morten Krogh-Jespersen | 5409086 | 2019-02-19 11:31:10 +0100 | [diff] [blame^] | 741 | download_apps(options.quiet) |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 742 | return |
| 743 | |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 744 | with utils.TempDir() as temp_dir: |
Morten Krogh-Jespersen | 6474020 | 2019-02-07 13:06:04 +0100 | [diff] [blame] | 745 | if not options.no_build or options.golem: |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 746 | gradle.RunGradle(['r8', 'r8lib']) |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 747 | |
Morten Krogh-Jespersen | d45d95e | 2019-02-07 13:27:17 +0100 | [diff] [blame] | 748 | # Make a copy of r8.jar and r8lib.jar such that they stay the same for |
| 749 | # the entire execution of this script. |
Christoffer Quist Adamsen | f2ac20a | 2019-02-15 10:33:04 +0100 | [diff] [blame] | 750 | all_shrinkers_enabled = (options.shrinker == None) |
| 751 | if all_shrinkers_enabled or 'r8-nolib' in options.shrinker: |
Morten Krogh-Jespersen | 19ffe18 | 2019-02-15 10:12:31 +0100 | [diff] [blame] | 752 | assert os.path.isfile(utils.R8_JAR), 'Cannot build without r8.jar' |
| 753 | shutil.copyfile(utils.R8_JAR, os.path.join(temp_dir, 'r8.jar')) |
Christoffer Quist Adamsen | f2ac20a | 2019-02-15 10:33:04 +0100 | [diff] [blame] | 754 | if all_shrinkers_enabled or 'r8' in options.shrinker: |
Morten Krogh-Jespersen | 19ffe18 | 2019-02-15 10:12:31 +0100 | [diff] [blame] | 755 | assert os.path.isfile(utils.R8LIB_JAR), 'Cannot build without r8lib.jar' |
| 756 | shutil.copyfile(utils.R8LIB_JAR, os.path.join(temp_dir, 'r8lib.jar')) |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 757 | |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 758 | result_per_shrinker_per_app = {} |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 759 | |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 760 | if options.app: |
| 761 | result_per_shrinker_per_app[options.app] = GetResultsForApp( |
| 762 | options.app, APPS.get(options.app), options, temp_dir) |
| 763 | else: |
Morten Krogh-Jespersen | d35065e | 2019-02-07 10:28:52 +0100 | [diff] [blame] | 764 | for app, config in sorted(APPS.iteritems(), key=lambda s: s[0].lower()): |
Christoffer Quist Adamsen | bbe5d7d | 2019-01-23 13:15:21 +0100 | [diff] [blame] | 765 | if not config.get('skip', False): |
| 766 | result_per_shrinker_per_app[app] = GetResultsForApp( |
| 767 | app, config, options, temp_dir) |
| 768 | |
| 769 | LogResultsForApps(result_per_shrinker_per_app, options) |
Christoffer Quist Adamsen | 404aade | 2018-12-20 13:00:09 +0100 | [diff] [blame] | 770 | |
| 771 | def success(message): |
| 772 | CGREEN = '\033[32m' |
| 773 | CEND = '\033[0m' |
| 774 | print(CGREEN + message + CEND) |
| 775 | |
| 776 | def warn(message): |
| 777 | CRED = '\033[91m' |
| 778 | CEND = '\033[0m' |
| 779 | print(CRED + message + CEND) |
Søren Gjesse | cdae879 | 2018-12-12 09:02:43 +0100 | [diff] [blame] | 780 | |
| 781 | if __name__ == '__main__': |
| 782 | sys.exit(main(sys.argv[1:])) |