diff --git a/apk-size/apk-size.gradle b/apk-size/apk-size.gradle index f1c40581c0d..3f74dbc0dbc 100644 --- a/apk-size/apk-size.gradle +++ b/apk-size/apk-size.gradle @@ -24,6 +24,10 @@ buildscript { } } +plugins { + id "com.dorongold.task-tree" version "1.5" +} + apply from: '../sdkProperties.gradle' task clean(type: Delete) { diff --git a/apk-size/app/configure.gradle b/apk-size/app/configure.gradle index ea32048c1f5..21b1b70c080 100644 --- a/apk-size/app/configure.gradle +++ b/apk-size/app/configure.gradle @@ -48,3 +48,41 @@ if (project.hasProperty('sdks')) { } } } + + +// Configures two new tasks `unpack` and `repack` for each `assemble` task created for all +// configured application build variants. +// +// `unpack` task takes the apk file and unpacks it into a folder `archive`. `repack` task compresses +// the folder back into a zip file. The size of the generated zip file will then be collected as the +// stable version of the size for its corresponding apk file. +project.afterEvaluate { + def unpack = project.tasks.create("unpack") + def repack = project.tasks.create("repack") + + android.applicationVariants.all { + def assemble = it.assembleProvider.get() + def packageApplication = it.packageApplicationProvider.get() + def apk = packageApplication.apkNames[0] + def dir = packageApplication.outputDirectory + def unpackTaskName = "unpack" + it.name.capitalize() + def repackTaskName = "repack" + it.name.capitalize() + + def unpackVariant = project.tasks.create(unpackTaskName, Copy.class) { + dependsOn assemble + + from zipTree(file("$dir/$apk")) + into file("$dir/archive") + } + unpack.dependsOn unpackVariant + + def repackVariant = project.tasks.create(repackTaskName, Zip.class) { + dependsOn unpackTaskName + + archiveFileName = apk.replace(".apk", ".zip") + destinationDirectory = file(dir) + from "$dir/archive" + } + repack.dependsOn repackVariant + } +} diff --git a/ci/fireci/fireciplugins/binary_size.py b/ci/fireci/fireciplugins/binary_size.py index febaf165648..f0d27346fa3 100644 --- a/ci/fireci/fireciplugins/binary_size.py +++ b/ci/fireci/fireciplugins/binary_size.py @@ -57,7 +57,7 @@ def binary_size(pull_request, log, metrics_service_url, access_token): artifacts = affected_artifacts if pull_request else all_artifacts sdks = ','.join(artifacts) - gradle.run('assemble', '-p', 'apk-size', '--continue', gradle.P('sdks', sdks), check=False) + gradle.run('repack', '-p', 'apk-size', '--continue', gradle.P('sdks', sdks), check=False) test_results = _measure_aar_sizes(artifacts) + _measure_apk_sizes(artifacts) test_report = {'metric': 'BinarySize', 'results': test_results, 'log': log} @@ -84,11 +84,11 @@ def _measure_apk_sizes(artifacts): for artifact in artifacts: group_id, artifact_id, version = artifact.split(':') - apk_files = glob.glob(f'./apk-size/**/{artifact_id}/**/*.apk', recursive=True) + apk_zip_files = glob.glob(f'./apk-size/**/{artifact_id}/**/*.zip', recursive=True) - for apk_file in apk_files: - build_type = re.search(fr'{artifact_id}/([^/]*)/', apk_file).group(1) - apk_size = os.path.getsize(apk_file) + for zip_file in apk_zip_files: + build_type = re.search(fr'{artifact_id}/([^/]*)/', zip_file).group(1) + apk_size = os.path.getsize(zip_file) test_results.append({'sdk': artifact_id, 'type': f'apk ({build_type})', 'value': apk_size}) return test_results