Skip to content
Snippets Groups Projects
Verified Commit 6ca57264 authored by Georg Koppen's avatar Georg Koppen Committed by Pier Angelo Vendrame
Browse files

[android] Modify build system

Bug 40083: Make locale ordering in BuildConfig deterministic

Bug 40042: Add option do overwrite timestamp in extension version

Bug 40059: Use MOZ_BUILD_DATE for versionCode

At the same time we adapt MOZ_BUILD_DATE to our needs where it is
actually used and not in tor-browser-build. This gives us more
flexibility. See: tor-browser-build#40084.

Bug 40067: Fix reproducibility issue in classes2.dex

We make sure our MOZ_BUILD_DATE gets used as a source for showing date
related information on the Fenix about page.

Bug 40071: Show only supported locales

Bug 40064: Use Gecko Beta for Nightly and Debug variants

Bug 40123: Allow building the instrumented tests apks for variants other than debug

This allows to specify the variant of the instrumented tests via
a `testBuildType` gradle argument. It also applies a workaround for
a R8 issue from https://issuetracker.google.com/issues/140851070.

Bug 40143: Use deterministic date in Test apk

The build config was using Date() when generating the Test apk's
versionName.
parent c3e8400c
Branches
Tags
1 merge request!1222Bug 43166: Rebased alpha onto 128.3.0esr
......@@ -354,3 +354,11 @@ media/libvpx/config/**/config.log
# Ignore binary base of Tor Browser
.binaries
# Other files modified at build time
mobile/android/.experimenter.json
# Tor libraries for local builds
mobile/android/fenix/app/tor-expert-bundle.aar
mobile/android/fenix/app/src/main/assets/extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi
......@@ -18,6 +18,8 @@ typealias DatetimeMetricType = mozilla.telemetry.glean.private.DatetimeMetricTyp
typealias DenominatorMetricType = mozilla.telemetry.glean.private.DenominatorMetricType
typealias EventMetricType<T> = mozilla.telemetry.glean.private.EventMetricType<T>
typealias HistogramMetricBase = mozilla.telemetry.glean.private.HistogramBase
// Some of our tooling seems to be still autogenerating the old HistogramBase still
typealias HistogramBase = mozilla.telemetry.glean.private.HistogramBase
typealias HistogramType = mozilla.telemetry.glean.private.HistogramType
typealias LabeledMetricType<T> = mozilla.telemetry.glean.private.LabeledMetricType<T>
typealias MemoryDistributionMetricType = mozilla.telemetry.glean.private.MemoryDistributionMetricType
......
......@@ -20,7 +20,12 @@ object Config {
@JvmStatic
private fun generateDebugVersionName(): String {
val today = Date()
val today = if (System.getenv("MOZ_BUILD_DATE") != null) {
val format = SimpleDateFormat("yyyyMMddHHmmss", Locale.US)
format.parse(System.getenv("MOZ_BUILD_DATE"))
} else {
Date()
}
// Append the year (2 digits) and week in year (2 digits). This will make it easier to distinguish versions and
// identify ancient versions when debugging issues. However this will still keep the same version number during
// the week so that we do not end up with a lot of versions in tools like Sentry. As an extra this matches the
......@@ -65,13 +70,20 @@ object Config {
*/
@JvmStatic
fun generateBuildDate(): String {
return LocalDateTime.now().toString()
return if (System.getenv("MOZ_BUILD_DATE") != null) {
// Converting our MOZ_BUILD_DATE to LocalDateTime
val format = SimpleDateFormat("yyyyMMddHHmmss", Locale.US)
val date = format.parse(System.getenv("MOZ_BUILD_DATE"))
java.sql.Timestamp(date.getTime()).toLocalDateTime().toString()
} else {
LocalDateTime.now().toString()
}
}
private val fennecBaseVersionCode by lazy {
val format = SimpleDateFormat("yyyyMMddHHmmss", Locale.US)
val cutoff = format.parse("20141228000000")
val build = Date()
val build = if (System.getenv("MOZ_BUILD_DATE") != null) format.parse(System.getenv("MOZ_BUILD_DATE")) else Date()
Math.floor((build.time - cutoff.time) / (1000.0 * 60.0 * 60.0)).toInt()
}
......
......@@ -30,7 +30,17 @@ import static org.gradle.api.tasks.testing.TestResult.ResultType
apply from: 'benchmark.gradle'
def obtainTestBuildType() {
def result = "debug";
if (project.hasProperty("testBuildType")) {
result = project.getProperties().get("testBuildType")
}
result
}
android {
testBuildType obtainTestBuildType()
project.maybeConfigForJetpackBenchmark(it)
if (project.hasProperty("testBuildType")) {
// Allowing to configure the test build type via command line flag (./gradlew -PtestBuildType=beta ..)
......@@ -911,14 +921,22 @@ def getSupportedLocales() {
// This isn't running as a task, instead the array is build when the gradle file is parsed.
// https://github.com/mozilla-mobile/fenix/issues/14175
def foundLocales = new StringBuilder()
def languageCodes = []
foundLocales.append("new String[]{")
fileTree("src/main/res").visit { FileVisitDetails details ->
if (details.file.path.endsWith("${File.separator}strings.xml")) {
if (details.file.path.endsWith("${File.separator}torbrowser_strings.xml")) {
def languageCode = details.file.parent.tokenize(File.separator).last().replaceAll('values-', '').replaceAll('-r', '-')
languageCode = (languageCode == "values") ? "en-US" : languageCode
foundLocales.append("\"").append(languageCode).append("\"").append(",")
languageCodes.add(languageCode)
}
}
// The order of files in a `FileTree` is not stable, even on a single
// computer. Thus we need to sort the `languageCode`s. See: fenix#40083.
languageCodes.sort()
languageCodes.each {
foundLocales.append("\"").append(it).append("\"").append(",")
}
foundLocales.append("}")
......
......@@ -130,3 +130,6 @@
-dontwarn java.beans.IntrospectionException
-dontwarn java.beans.Introspector
-dontwarn java.beans.PropertyDescriptor
# Workaround for 'already has mapping' r8 issue (https://issuetracker.google.com/issues/140851070)
-keep class com.google.android.gms.common.internal.BaseGmsClient { *; }
......@@ -10,6 +10,7 @@ import java.nio.file.StandardCopyOption
buildscript {
// This logic is duplicated in the allprojects block: I don't know how to fix that.
repositories {
mavenLocal()
gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORIES.each { repository ->
maven {
url repository
......@@ -51,6 +52,7 @@ plugins {
allprojects {
// This logic is duplicated in the buildscript block: I don't know how to fix that.
repositories {
mavenLocal()
gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORIES.each { repository ->
maven {
url repository
......
#!/bin/bash
cd "$(dirname $(realpath "$0"))/.."
if [ -z "$TOR_BROWSER_BUILD" ]; then
TOR_BROWSER_BUILD=../../../../tor-browser-build
fi
tor_expert_bundle_aar="$(ls -1td "$TOR_BROWSER_BUILD/out/tor-expert-bundle-aar/"tor-expert-bundle-aar-* | head -1)"
if [ -z "tor_expert_bundle_aar" ]; then
echo "Cannot find Tor Expert Bundle arr artifacts!"
exit 2
fi
cp "$tor_expert_bundle_aar"/* app/
noscript="$(find "$TOR_BROWSER_BUILD/out/browser" -name 'noscript*.xpi' -print | sort | tail -1)"
mkdir -p "app/src/main/assets/extensions"
if [ -f "$noscript" ]; then
cp "$noscript" "app/src/main/assets/extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
fi
#!/bin/bash
cd "$(dirname $(realpath "$0"))/.."
if [ -z "$TOR_BROWSER_BUILD" ]; then
TOR_BROWSER_BUILD=../../tor-browser-build
fi
key="$TOR_BROWSER_BUILD/projects/browser/android-qa.keystore"
if [ ! -f "$key" ]; then
echo "Please define TOR_BROWSER_BUILD with the path to tor-browser-build"
exit 2
fi
tools="$ANDROID_HOME/build-tools/31.0.0"
apksigner="$tools/apksigner"
zipalign="$tools/zipalign"
if [ ! -x "$apksigner" ]; then
echo "apksigner not found at $apksigner. Please make sure ANDROID_HOME is defined"
exit 3
fi
noscript="$(find "$TOR_BROWSER_BUILD/out/browser" -name 'noscript*.xpi' -print | sort | tail -1)"
tmpdir="$(mktemp -d)"
mkdir -p "$tmpdir/assets/extensions"
if [ -f "$noscript" ]; then
cp "$noscript" "$tmpdir/assets/extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
fi
sign () {
apk="$(realpath $1)"
out="$apk"
if [ ! -f "$apk" ]; then
return
fi
out="${out/unsigned/signed}"
aligned="$apk"
aligned="${aligned/unsigned/aligned}"
pushd "$tmpdir" > /dev/null
zip -Xr "$apk" assets > /dev/null
popd > /dev/null
rm -f "$aligned"
"$zipalign" -p 4 "$apk" "$aligned"
"$apksigner" sign --ks "$key" --in "$aligned" --out "$out" --ks-key-alias androidqakey --key-pass pass:android --ks-pass pass:android
echo "Signed $out"
}
for channel in app/build/outputs/apk/fenix/*; do
for apk in $channel/*-unsigned.apk; do
sign "$apk"
done
done
rm -rf "$tmpdir"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment