From f09f472f262d6f78ba77e1f40e6a779cb688d7e2 Mon Sep 17 00:00:00 2001 From: maxmoney21m Date: Wed, 15 Mar 2023 09:37:57 +0800 Subject: [PATCH] Add .profm sorting to build.gradle --- app/build.gradle | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 0962aedbe..4e1dd1ad2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -181,3 +181,35 @@ dependencies { ktlint { disabledRules.set(["no-wildcard-imports"]) } + +// https://gitlab.com/fdroid/wiki/-/wikis/HOWTO:-diff-&-fix-APKs-for-Reproducible-Builds#differing-assetsdexoptbaselineprofm-easy-to-fix +// NB: Android Studio can't find the imports; this does not affect the +// actual build since Gradle can find them just fine. +import com.android.tools.profgen.ArtProfileKt +import com.android.tools.profgen.ArtProfileSerializer +import com.android.tools.profgen.DexFile + +project.afterEvaluate { + tasks.each { task -> + if (task.name.startsWith("compile") && task.name.endsWith("ReleaseArtProfile")) { + task.doLast { + outputs.files.each { file -> + if (file.name.endsWith(".profm")) { + println("Sorting ${file} ...") + def version = ArtProfileSerializer.valueOf("METADATA_0_0_2") + def profile = ArtProfileKt.ArtProfile(file) + def keys = new ArrayList(profile.profileData.keySet()) + def sortedData = new LinkedHashMap() + Collections.sort keys, new DexFile.Companion() + keys.each { key -> sortedData[key] = profile.profileData[key] } + new FileOutputStream(file).with { + write(version.magicBytes$profgen) + write(version.versionBytes$profgen) + version.write$profgen(it, sortedData, "") + } + } + } + } + } + } +}