Add apps to run_on_as_app.py
This CL also extends the script such that it runs all shrinkers on all apps if --app is not provided.
Change-Id: I93ab30836c4ff56d29bb4144f69165866c74caa1
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 0c6ea6c..82fa5bd 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -25,10 +25,36 @@
# 'archives_base_name': ... (default same as app_module)
# 'flavor': ... (default no flavor)
# },
+ 'AnExplorer': {
+ 'git_repo': 'https://github.com/1hakr/AnExplorer',
+ 'flavor': 'googleMobilePro',
+ 'signed-apk-name': 'AnExplorer-googleMobileProRelease-4.0.3.apk',
+ },
'AntennaPod': {
'git_repo': 'https://github.com/AntennaPod/AntennaPod.git',
'flavor': 'play',
},
+ 'apps-android-wikipedia': {
+ 'git_repo': 'https://github.com/wikimedia/apps-android-wikipedia',
+ 'flavor': 'prod',
+ 'signed-apk-name': 'app-prod-universal-release.apk'
+ },
+ 'KISS': {
+ 'git_repo': 'https://github.com/Neamar/KISS',
+ },
+ 'materialistic': {
+ 'git_repo': 'https://github.com/hidroh/materialistic',
+ },
+ 'Minimal-Todo': {
+ 'git_repo': 'https://github.com/avjinder/Minimal-Todo',
+ },
+ 'NewPipe': {
+ 'git_repo': 'https://github.com/TeamNewPipe/NewPipe',
+ },
+ 'Simple-Calendar': {
+ 'git_repo': 'https://github.com/SimpleMobileTools/Simple-Calendar',
+ 'signed-apk-name': 'calendar-release.apk'
+ },
'tachiyomi': {
'git_repo': 'https://github.com/sgjesse/tachiyomi.git',
'flavor': 'standard',
@@ -38,9 +64,17 @@
'git_repo': 'https://github.com/sgjesse/muzei.git',
'app_module': 'main',
'archives_base_name': 'muzei',
+ 'skip': True,
},
}
+# Common environment setup.
+user_home = os.path.expanduser('~')
+android_home = os.path.join(user_home, 'Android', 'Sdk')
+android_build_tools_version = '28.0.3'
+android_build_tools = os.path.join(
+ android_home, 'build-tools', android_build_tools_version)
+
def IsBuiltWithR8(apk):
script = os.path.join(utils.TOOLS_DIR, 'extractmarker.py')
return '~~R8' in subprocess.check_output(['python', script, apk]).strip()
@@ -64,6 +98,105 @@
os.remove(apk_dest)
os.rename(apk, apk_dest)
+def BuildAppWithSelectedShrinkers(app, config, options):
+ git_repo = config['git_repo']
+
+ # Checkout and build in the build directory.
+ checkout_dir = os.path.join(WORKING_DIR, app)
+
+ if not os.path.exists(checkout_dir):
+ with utils.ChangedWorkingDirectory(WORKING_DIR):
+ GitClone(git_repo)
+ else:
+ with utils.ChangedWorkingDirectory(checkout_dir):
+ GitPull()
+
+ if options.use_tot:
+ as_utils.add_r8_dependency(checkout_dir)
+ else:
+ as_utils.remove_r8_dependency(checkout_dir)
+
+ with utils.ChangedWorkingDirectory(checkout_dir):
+ for shrinker in SHRINKERS:
+ if options.shrinker is not None and shrinker != options.shrinker:
+ continue
+
+ BuildAppWithShrinker(app, config, shrinker, checkout_dir, options)
+
+ if IsTrackedByGit('gradle.properties'):
+ GitCheckout('gradle.properties')
+
+def BuildAppWithShrinker(app, config, shrinker, checkout_dir, options):
+ print('Building {} with {}'.format(app, shrinker))
+
+ app_module = config.get('app_module', 'app')
+ archives_base_name = config.get(' archives_base_name', app_module)
+ flavor = config.get('flavor')
+
+ # Ensure that gradle.properties are not modified before modifying it to
+ # select shrinker.
+ if IsTrackedByGit('gradle.properties'):
+ GitCheckout('gradle.properties')
+ with open("gradle.properties", "a") as gradle_properties:
+ if 'r8' in shrinker:
+ gradle_properties.write('\nandroid.enableR8=true\n')
+ if shrinker == 'r8full':
+ gradle_properties.write('android.enableR8.fullMode=true\n')
+ else:
+ assert shrinker == 'proguard'
+ gradle_properties.write('\nandroid.enableR8=false\n')
+
+ out = os.path.join(checkout_dir, 'out', shrinker)
+ if not os.path.exists(out):
+ os.makedirs(out)
+
+ env = os.environ.copy()
+ env['ANDROID_HOME'] = android_home
+ env['JAVA_OPTS'] = '-ea'
+ releaseTarget = app_module + ':' + 'assemble' + (
+ flavor.capitalize() if flavor else '') + 'Release'
+
+ cmd = ['./gradlew', '--no-daemon', 'clean', releaseTarget, '--stacktrace']
+ utils.PrintCmd(cmd)
+ subprocess.check_call(cmd, env=env)
+
+ apk_base_name = (archives_base_name
+ + (('-' + flavor) if flavor else '') + '-release')
+ signed_apk_name = config.get('signed-apk-name', apk_base_name + '.apk')
+ unsigned_apk_name = apk_base_name + '-unsigned.apk'
+
+ build_dir = config.get('build_dir', 'build')
+ build_output_apks = os.path.join(app_module, build_dir, 'outputs', 'apk')
+ if flavor:
+ build_output_apks = os.path.join(build_output_apks, flavor, 'release')
+ else:
+ build_output_apks = os.path.join(build_output_apks, 'release')
+
+ signed_apk = os.path.join(build_output_apks, signed_apk_name)
+ unsigned_apk = os.path.join(build_output_apks, unsigned_apk_name)
+
+ if options.sign_apks and not os.path.isfile(signed_apk):
+ assert os.path.isfile(unsigned_apk)
+ if options.sign_apks:
+ keystore = 'app.keystore'
+ keystore_password = 'android'
+ apk_utils.sign_with_apksigner(
+ android_build_tools,
+ unsigned_apk,
+ signed_apk,
+ keystore,
+ keystore_password)
+
+ if os.path.isfile(signed_apk):
+ apk_dest = os.path.join(out, signed_apk_name)
+ MoveApkToDest(signed_apk, apk_dest)
+ else:
+ apk_dest = os.path.join(out, unsigned_apk_name)
+ MoveApkToDest(unsigned_apk, apk_dest)
+
+ assert IsBuiltWithR8(apk_dest) == ('r8' in shrinker), (
+ 'Unexpected marker in generated APK for {}'.format(shrinker))
+
def ParseOptions(argv):
result = optparse.OptionParser()
result.add_option('--app',
@@ -87,110 +220,12 @@
assert not options.use_tot or os.path.isfile(utils.R8_JAR), (
'Cannot build from ToT without r8.jar')
- # Common environment setup.
- user_home = os.path.expanduser('~')
- android_home = os.path.join(user_home, 'Android', 'Sdk')
- android_build_tools_version = '28.0.3'
- android_build_tools = os.path.join(
- android_home, 'build-tools', android_build_tools_version)
-
- # App setup.
- app = options.app
- if not app:
- raise Exception(
- "You need to specify '--app={}'".format('|'.join(APPS.keys())))
- config = APPS.get(app)
- git_repo = config['git_repo']
- app_module = config.get('app_module', 'app')
- archives_base_name = config.get(' archives_base_name', app_module)
- flavor = config.get('flavor')
-
- # Checkout and build in the build directory.
- checkout_dir = os.path.join(WORKING_DIR, app)
-
- if not os.path.exists(checkout_dir):
- with utils.ChangedWorkingDirectory(WORKING_DIR):
- GitClone(git_repo)
+ if options.app:
+ BuildAppWithSelectedShrinkers(options.app, APPS.get(app), options)
else:
- with utils.ChangedWorkingDirectory(checkout_dir):
- GitPull()
-
- if options.use_tot:
- as_utils.add_r8_dependency(checkout_dir)
- else:
- as_utils.remove_r8_dependency(checkout_dir)
-
- with utils.ChangedWorkingDirectory(checkout_dir):
- for shrinker in SHRINKERS:
- if options.shrinker is not None and shrinker != options.shrinker:
- continue
-
- print('Building with {}'.format(shrinker))
-
- # Ensure that gradle.properties are not modified before modifying it to
- # select shrinker.
- if IsTrackedByGit('gradle.properties'):
- GitCheckout('gradle.properties')
- with open("gradle.properties", "a") as gradle_properties:
- if 'r8' in shrinker:
- gradle_properties.write('\nandroid.enableR8=true\n')
- if shrinker == 'r8full':
- gradle_properties.write('android.enableR8.fullMode=true\n')
- else:
- assert shrinker == 'proguard'
- gradle_properties.write('\nandroid.enableR8=false\n')
-
- out = os.path.join(checkout_dir, 'out', shrinker)
- if not os.path.exists(out):
- os.makedirs(out)
-
- env = os.environ.copy()
- env['ANDROID_HOME'] = android_home
- env['JAVA_OPTS'] = '-ea'
- releaseTarget = app_module + ':' + 'assemble' + (
- flavor.capitalize() if flavor else '') + 'Release'
-
- cmd = ['./gradlew', '--no-daemon', 'clean', releaseTarget, '--stacktrace']
- utils.PrintCmd(cmd)
- subprocess.check_call(cmd, env=env)
-
- apk_base_name = (archives_base_name
- + (('-' + flavor) if flavor else '') + '-release')
- signed_apk_name = apk_base_name + '.apk'
- unsigned_apk_name = apk_base_name + '-unsigned.apk'
-
- build_output_apks = os.path.join(app_module, 'build', 'outputs', 'apk')
- if flavor:
- build_output_apks = os.path.join(build_output_apks, flavor, 'release')
- else:
- build_output_apks = os.path.join(build_output_apks, 'release')
-
- signed_apk = os.path.join(build_output_apks, signed_apk_name)
- unsigned_apk = os.path.join(build_output_apks, unsigned_apk_name)
-
- if options.sign_apks and not os.path.isfile(signed_apk):
- assert os.path.isfile(unsigned_apk)
- if options.sign_apks:
- keystore = 'app.keystore'
- keystore_password = 'android'
- apk_utils.sign_with_apksigner(
- android_build_tools,
- unsigned_apk,
- signed_apk,
- keystore,
- keystore_password)
-
- if os.path.isfile(signed_apk):
- apk_dest = os.path.join(out, signed_apk_name)
- MoveApkToDest(signed_apk, apk_dest)
- else:
- apk_dest = os.path.join(out, unsigned_apk_name)
- MoveApkToDest(unsigned_apk, apk_dest)
-
- assert IsBuiltWithR8(apk_dest) == ('r8' in shrinker)
-
- if IsTrackedByGit('gradle.properties'):
- GitCheckout('gradle.properties')
+ for app, config in APPS.iteritems():
+ if not config.get('skip', False):
+ BuildAppWithSelectedShrinkers(app, config, options)
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))