Skip to content

Commit ad22968

Browse files
authored
Measure per-architecture sizes for firebase crashlytics ndk. (#2937)
1 parent 82b02af commit ad22968

File tree

6 files changed

+69
-19
lines changed

6 files changed

+69
-19
lines changed

apk-size/app/build.gradle

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,42 @@
1515
apply plugin: "com.android.application"
1616
apply from: "default.gradle"
1717
android {
18-
flavorDimensions "apkSize"
18+
flavorDimensions "firebase", "abi"
19+
20+
// https://developer.android.com/ndk/guides/abis
21+
productFlavors {
22+
"universal" {
23+
dimension "abi"
24+
}
25+
26+
"armeabi-v7a" {
27+
dimension "abi"
28+
ndk {
29+
abiFilters "armeabi-v7a"
30+
}
31+
}
32+
33+
"arm64-v8a" {
34+
dimension "abi"
35+
ndk {
36+
abiFilters "arm64-v8a"
37+
}
38+
}
39+
40+
"x86" {
41+
dimension "abi"
42+
ndk {
43+
abiFilters "x86"
44+
}
45+
}
46+
47+
"x86_64" {
48+
dimension "abi"
49+
ndk {
50+
abiFilters "x86_64"
51+
}
52+
}
53+
}
1954

2055
compileOptions {
2156
sourceCompatibility JavaVersion.VERSION_1_8

apk-size/app/configure.gradle

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,30 @@ if (project.hasProperty('sdks')) {
2626
sdks.split(',').each { sdk ->
2727
def (groupId, artifactId, version) = sdk.split(':')
2828
productFlavors.create(artifactId) {
29-
dimension 'apkSize'
29+
dimension 'firebase'
3030
}
3131
dependencies.add("${artifactId}Implementation", sdk)
3232
}
33+
34+
// Ignore debug builds as measurements are not reproducible due to disabled ZipAlign.
35+
// Ignore per-architecture builds for all products except for firebase-crashlytics-ndk.
36+
variantFilter { variant ->
37+
def buildType = variant.buildType.name
38+
def flavors = variant.flavors*.name
39+
if (buildType == 'debug'
40+
|| ('firebase-crashlytics-ndk' in flavors && 'universal' in flavors)
41+
|| !('firebase-crashlytics-ndk' in flavors || 'universal' in flavors)) {
42+
setIgnore(true)
43+
}
44+
}
45+
46+
applicationVariants.all { variant ->
47+
def product = variant.productFlavors[0].name
48+
def abi = variant.productFlavors[1].name
49+
def buildType = variant.buildType.name
50+
variant.outputs.all {
51+
outputFileName = "${product}::${buildType}::${abi}.apk"
52+
}
53+
}
3354
}
3455
}

apk-size/app/default.gradle

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,6 @@ android {
5757
shrinkResources false
5858
}
5959
}
60-
61-
variantFilter { variant ->
62-
def buildTypeName = variant.buildType*.name
63-
if (buildTypeName.contains('debug')) {
64-
setIgnore(true)
65-
}
66-
}
6760
}
6861

6962
dependencies {

apk-size/app/src/base/base.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
android {
1717
productFlavors {
1818
base {
19-
dimension "apkSize"
19+
dimension "firebase"
2020
applicationId "com.google.apksize.base"
2121
}
2222
}

apk-size/gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@
1313
# limitations under the License.
1414

1515
android.useAndroidX=true
16+
android.enableJetifier=true
1617

1718
org.gradle.jvmargs=-Xmx8g -XX:MaxPermSize=8g

ci/fireci/fireciplugins/binary_size.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def binary_size(pull_request, log, metrics_service_url, access_token):
5959

6060
gradle.run('assemble', '--continue', gradle.P('sdks', sdks), workdir='apk-size', check=False)
6161

62-
test_results = _measure_aar_sizes(artifacts) + _measure_apk_sizes(artifacts)
62+
test_results = _measure_aar_sizes(artifacts) + _measure_apk_sizes()
6363
test_report = {'metric': 'BinarySize', 'results': test_results, 'log': log}
6464

6565
uploader.post_report(test_report, metrics_service_url, access_token)
@@ -79,17 +79,17 @@ def _measure_aar_sizes(artifacts):
7979
return test_results
8080

8181

82-
def _measure_apk_sizes(artifacts):
82+
def _measure_apk_sizes():
8383
test_results = []
8484

85-
for artifact in artifacts:
86-
group_id, artifact_id, version = artifact.split(':')
87-
apk_files = glob.glob(f'./apk-size/**/{artifact_id}/**/*.apk', recursive=True)
85+
apk_files = glob.glob(fr'./apk-size/**/*.apk', recursive=True)
86+
for apk_file in apk_files:
87+
filename = os.path.basename(apk_file)
88+
artifact, build_type, abi = os.path.splitext(filename)[0].split('::')
89+
apk_type = build_type if abi == 'universal' else f'{build_type} / {abi}'
90+
apk_size = os.path.getsize(apk_file)
8891

89-
for apk_file in apk_files:
90-
build_type = re.search(fr'{artifact_id}/([^/]*)/', apk_file).group(1)
91-
apk_size = os.path.getsize(apk_file)
92-
test_results.append({'sdk': artifact_id, 'type': f'apk ({build_type})', 'value': apk_size})
92+
test_results.append({'sdk': artifact, 'type': f'apk ({apk_type})', 'value': apk_size})
9393

9494
return test_results
9595

0 commit comments

Comments
 (0)