From 92b6d4a9250f62af71fd34e0e907c2710c400ae6 Mon Sep 17 00:00:00 2001 From: Mitchell Hentges Date: Mon, 22 Apr 2019 20:02:39 +0200 Subject: [PATCH] Moves release flavour to build type (#1693) --- app/build.gradle | 87 +++++++------------ app/src/firefoxBeta/AndroidManifest.xml | 11 --- app/src/firefoxNightly/AndroidManifest.xml | 11 --- app/src/firefoxRelease/AndroidManifest.xml | 11 --- .../metrics/AdjustMetricsService.kt | 2 +- .../fenix/settings/SettingsFragment.kt | 4 +- .../java/org/mozilla/fenix/utils/Settings.kt | 2 +- automation/taskcluster/decision_task.py | 6 +- automation/taskcluster/lib/tasks.py | 82 +++++------------ config/pre-push-recommended.sh | 2 +- 10 files changed, 63 insertions(+), 155 deletions(-) delete mode 100644 app/src/firefoxBeta/AndroidManifest.xml delete mode 100644 app/src/firefoxNightly/AndroidManifest.xml delete mode 100644 app/src/firefoxRelease/AndroidManifest.xml diff --git a/app/build.gradle b/app/build.gradle index c93049d25..72dd716e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,36 +30,48 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' manifestPlaceholders.isRaptorEnabled = "false" + buildConfigField "boolean", "IS_RELEASED", "false" + } + + def releaseTemplate = { + shrinkResources true + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + matchingFallbacks = ['release'] // Use on the "release" build type in dependencies (AARs) } buildTypes { - release { - shrinkResources true - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - releaseRaptor { - initWith release - manifestPlaceholders.isRaptorEnabled = "true" - matchingFallbacks = ['release'] - } debug { shrinkResources false minifyEnabled false applicationIdSuffix ".debug" manifestPlaceholders.isRaptorEnabled = "true" } + // "releaseRaptor" is only used for performance testing, and isn't a real "release" type + releaseRaptor releaseTemplate >> { // the ">>" concatenates the releaseRaptor-specific options with the template + manifestPlaceholders.isRaptorEnabled = "true" + } + nightly releaseTemplate >> { + buildConfigField "boolean", "IS_RELEASED", "true" + } + beta releaseTemplate >> { + buildConfigField "boolean", "IS_RELEASED", "true" + } + } + + variantFilter { // There's a "release" build type that exists by default that we don't use (it's replaced by "nightly" and "beta") + if (buildType.name == 'release') { + setIgnore true + } } testOptions { execution 'ANDROIDX_TEST_ORCHESTRATOR' } - flavorDimensions "abi", "channel" + flavorDimensions "abi" productFlavors { - // Processor architectures (abi dimension) - arm { dimension "abi" ndk { @@ -78,41 +90,6 @@ android { abiFilter "arm64-v8a" } } - - // Product channels (channel dimension) - - // "Greenfield" is our clean version of Fenix without any of the "Fennec transition" code. - greenfield { - dimension "channel" - } - firefoxNightly { - dimension "channel" - - // Aurora was a channel between nightly builds and beta versions. Aurora builds were published on Google - // Play. When the Aurora channel was shutdown in April 2017 the decision was made to instead ship Nightly - // builds to Google Play using the existing application id. Previously Nightly builds were not available - // on Google Play. Since then our Nightly package name is "fennec_aurora" instead of "fennec_nightly". - applicationId "org.mozilla.fennec_aurora" - } - firefoxBeta { - dimension "channel" - - applicationId "org.mozilla.firefox_beta" - } - firefoxRelease { - dimension "channel" - - applicationId "org.mozilla.firefox" - } - } - - variantFilter { variant -> - def flavors = variant.flavors*.name.toString().toLowerCase() - - if (!flavors.contains("greenfield")) { - // For now everything that isn't a "greenfield" build isn't used. So let's ignore those variants. - setIgnore(true) - } } compileOptions { @@ -148,11 +125,12 @@ android.applicationVariants.all { variant -> // ------------------------------------------------------------------------------------------------- def buildType = variant.buildType.name + def versionCode = null buildConfigField 'Boolean', 'COLLECTIONS_ENABLED', (buildType != "release").toString() - if (buildType == "release") { - def versionCode = generatedVersionCode + if (buildType == "nightly") { + versionCode = generatedVersionCode // The Google Play Store does not allow multiple APKs for the same app that all have the // same version code. Therefore we need to have different version codes for our ARM and x86 @@ -168,15 +146,16 @@ android.applicationVariants.all { variant -> versionCode = versionCode + 1 }// else variant.flavorName.contains("Arm")) use generated version code - variant.outputs.all { output -> + variant.outputs.all { setVersionCodeOverride(versionCode) } } println("----------------------------------------------") - println("Build type: " + buildType) + println("Variant name: " + variant.name) + println("Build type: " + variant.buildType.name) println("Flavor: " + variant.flavorName) - println("Version code: " + variant.mergedFlavor.versionCode) + println("Version code: " + (versionCode ?: variant.mergedFlavor.versionCode)) // ------------------------------------------------------------------------------------------------- // BuildConfig: Set variables for Sentry, Crash Reporting, and Telemetry @@ -215,7 +194,7 @@ android.applicationVariants.all { variant -> print("Adjust token: ") - if (variantName.contains("Release")) { + if (variant.buildType.buildConfigFields['IS_RELEASED']?.value) { try { def token = new File("${rootDir}/.adjust_token").text.trim() buildConfigField 'String', 'ADJUST_TOKEN', '"' + token + '"' diff --git a/app/src/firefoxBeta/AndroidManifest.xml b/app/src/firefoxBeta/AndroidManifest.xml deleted file mode 100644 index 4f6328151..000000000 --- a/app/src/firefoxBeta/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/app/src/firefoxNightly/AndroidManifest.xml b/app/src/firefoxNightly/AndroidManifest.xml deleted file mode 100644 index b108579eb..000000000 --- a/app/src/firefoxNightly/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/app/src/firefoxRelease/AndroidManifest.xml b/app/src/firefoxRelease/AndroidManifest.xml deleted file mode 100644 index 46a1c91bb..000000000 --- a/app/src/firefoxRelease/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt index e9df8fbea..b761c6da8 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt @@ -18,7 +18,7 @@ class AdjustMetricsService(private val application: Application) : MetricsServic if ((BuildConfig.ADJUST_TOKEN.isNullOrEmpty())) { Log.i(LOGTAG, "No adjust token defined") - if (!BuildConfig.DEBUG) { + if (BuildConfig.IS_RELEASED) { throw IllegalStateException("No adjust token defined for release build") } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index d549d8329..b8ca282d8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -193,8 +193,8 @@ class SettingsFragment : PreferenceFragmentCompat(), CoroutineScope, AccountObse preferenceMakeDefaultBrowser?.onPreferenceClickListener = getClickListenerForMakeDefaultBrowser() - preferenceLeakCanary?.isVisible = BuildConfig.DEBUG - if (BuildConfig.DEBUG) { + preferenceLeakCanary?.isVisible = !BuildConfig.IS_RELEASED + if (!BuildConfig.IS_RELEASED) { preferenceLeakCanary?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> (context?.applicationContext as FenixApplication).toggleLeakCanary(newValue as Boolean) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 3e275e762..8e3c8246e 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -44,7 +44,7 @@ class Settings private constructor(context: Context) { val isCrashReportingEnabled: Boolean get() = preferences.getBoolean(appContext.getPreferenceKey(R.string.pref_key_crash_reporter), true) && - BuildConfig.CRASH_REPORTING && BuildConfig.BUILD_TYPE == "release" + BuildConfig.CRASH_REPORTING && BuildConfig.IS_RELEASED val isRemoteDebuggingEnabled: Boolean get() = preferences.getBoolean(appContext.getPreferenceKey(R.string.pref_key_remote_debugging), false) diff --git a/automation/taskcluster/decision_task.py b/automation/taskcluster/decision_task.py index 118d567e8..1f7bd3ae9 100644 --- a/automation/taskcluster/decision_task.py +++ b/automation/taskcluster/decision_task.py @@ -13,7 +13,7 @@ import os import taskcluster from lib import build_variants -from lib.tasks import TaskBuilder, schedule_task_graph, _get_architecture_and_build_type_and_product_from_variant +from lib.tasks import TaskBuilder, schedule_task_graph, get_architecture_and_build_type_from_variant from lib.chain_of_trust import ( populate_chain_of_trust_task_graph, populate_chain_of_trust_required_but_unused_files @@ -57,7 +57,7 @@ def pr_or_push(is_master_push): build_tasks[assemble_task_id] = BUILDER.craft_assemble_task(variant) build_tasks[taskcluster.slugId()] = BUILDER.craft_test_task(variant) - arch, build_type, _ = _get_architecture_and_build_type_and_product_from_variant(variant) + arch, build_type = get_architecture_and_build_type_from_variant(variant) # autophone only supports arm and aarch64, so only sign/perftest those builds if ( build_type == 'releaseRaptor' and @@ -88,7 +88,7 @@ def nightly(track): push_tasks = {} build_task_id = taskcluster.slugId() - build_tasks[build_task_id] = BUILDER.craft_assemble_release_task(architectures, is_staging) + build_tasks[build_task_id] = BUILDER.craft_assemble_nightly_task(architectures, is_staging) signing_task_id = taskcluster.slugId() signing_tasks[signing_task_id] = BUILDER.craft_nightly_signing_task( diff --git a/automation/taskcluster/lib/tasks.py b/automation/taskcluster/lib/tasks.py index 26a45b729..453dcfc12 100644 --- a/automation/taskcluster/lib/tasks.py +++ b/automation/taskcluster/lib/tasks.py @@ -39,12 +39,12 @@ class TaskBuilder(object): self.date = arrow.get(date_string) self.trust_level = trust_level - def craft_assemble_release_task(self, architectures, is_staging=False): + def craft_assemble_nightly_task(self, architectures, is_staging=False): artifacts = { 'public/target.{}.apk'.format(arch): { "type": 'file', "path": '/opt/fenix/app/build/outputs/apk/' - '{}Greenfield/release/app-{}-greenfield-release-unsigned.apk'.format(arch, arch), + '{}/nightly/app-{}-nightly-unsigned.apk'.format(arch, arch), "expires": taskcluster.stringDate(taskcluster.fromNow(DEFAULT_EXPIRES_IN)), } for arch in architectures @@ -72,7 +72,7 @@ class TaskBuilder(object): ) gradle_commands = ( - './gradlew --no-daemon -PcrashReports=true -Ptelemetry=true clean test assembleRelease', + './gradlew --no-daemon -PcrashReports=true -Ptelemetry=true clean test assembleNightly', ) command = ' && '.join( @@ -172,8 +172,8 @@ class TaskBuilder(object): def craft_lint_task(self): return self._craft_clean_gradle_task( name='lint', - description='Running lint for arm64 release variant', - gradle_task='lintAarch64GreenfieldRelease', + description='Running lint for aarch64 release variant', + gradle_task='lintAarch64Release', treeherder={ 'jobKind': 'test', 'machine': { @@ -331,22 +331,20 @@ class TaskBuilder(object): def craft_master_commit_signing_task( self, assemble_task_id, variant ): - architecture, build_type, product = _get_architecture_and_build_type_and_product_from_variant(variant) - product = convert_camel_case_into_kebab_case(product) - postfix = convert_camel_case_into_kebab_case('{}-{}'.format(architecture, build_type)) + architecture, build_type = get_architecture_and_build_type_from_variant(variant) routes = [ - 'index.project.mobile.fenix.branch.master.revision.{}.{}.{}'.format( - self.commit, product, postfix + 'index.project.mobile.fenix.v2.branch.master.revision.{}.{}.{}'.format( + self.commit, build_type, architecture ), - 'index.project.mobile.fenix.branch.master.latest.{}.{}'.format( - product, postfix + 'index.project.mobile.fenix.v2.branch.master.latest.{}.{}.{}'.format( + product, build_type, architecture ), - 'index.project.mobile.fenix.branch.master.pushdate.{}.{}.{}.revision.{}.{}.{}'.format( + 'index.project.mobile.fenix.v2.branch.master.pushdate.{}.{}.{}.revision.{}.{}.{}'.format( self.date.year, self.date.month, self.date.day, self.commit, - product, postfix + build_type, architecture ), - 'index.project.mobile.fenix.branch.master.pushdate.{}.{}.{}.latest.{}.{}'.format( - self.date.year, self.date.month, self.date.day, product, postfix + 'index.project.mobile.fenix.v2.branch.master.pushdate.{}.{}.{}.latest.{}.{}'.format( + self.date.year, self.date.month, self.date.day, build_type, architecture ), ] @@ -439,15 +437,13 @@ class TaskBuilder(object): def _craft_treeherder_platform_from_variant(variant): - architecture, build_type, _ = _get_architecture_and_build_type_and_product_from_variant( - variant - ) + architecture, build_type = get_architecture_and_build_type_from_variant(variant) return 'android-{}-{}'.format(architecture, build_type) def _craft_treeherder_group_symbol_from_variant(variant): - _, __, product = _get_architecture_and_build_type_and_product_from_variant(variant) - return product + _, build_type = get_architecture_and_build_type_from_variant(variant) + return build_type def _craft_artifacts_from_variant(variant): @@ -461,29 +457,19 @@ def _craft_artifacts_from_variant(variant): def _craft_apk_full_path_from_variant(variant): - architecture, build_type, product = _get_architecture_and_build_type_and_product_from_variant( - variant - ) - - short_variant = variant[:-len(build_type)] + architecture, build_type = get_architecture_and_build_type_from_variant(variant) postfix = '-unsigned' if build_type.startswith('release') else '' - product = lower_case_first_letter(product) - - return '/opt/fenix/app/build/outputs/apk/{short_variant}/{build_type}/app-{architecture}-{product}-{build_type}{postfix}.apk'.format( # noqa: E501 + return '/opt/fenix/app/build/outputs/apk/{architecture}/{build_type}/app-{architecture}-{build_type}{postfix}.apk'.format( # noqa: E501 architecture=architecture, build_type=build_type, - product=product, - short_variant=short_variant, postfix=postfix ) _SUPPORTED_ARCHITECTURES = ('aarch64', 'arm', 'x86') -_SUPPORTED_BUILD_TYPES = ('Debug', 'Release', 'ReleaseRaptor') -_SUPPORTED_PRODUCTS = ('FirefoxBeta', 'FirefoxNightly', 'FirefoxRelease', 'Greenfield') -def _get_architecture_and_build_type_and_product_from_variant(variant): +def get_architecture_and_build_type_from_variant(variant): for supported_architecture in _SUPPORTED_ARCHITECTURES: if variant.startswith(supported_architecture): architecture = supported_architecture @@ -496,32 +482,8 @@ def _get_architecture_and_build_type_and_product_from_variant(variant): ) ) - for supported_build_type in _SUPPORTED_BUILD_TYPES: - if variant.endswith(supported_build_type): - build_type = lower_case_first_letter(supported_build_type) - break - else: - raise ValueError( - 'Cannot identify build type in "{}". ' - 'Expected to find one of these supported ones: {}'.format( - variant, _SUPPORTED_BUILD_TYPES - ) - ) - - remaining_variant_data = variant[len(architecture):len(variant) - len(build_type)] - for supported_product in _SUPPORTED_PRODUCTS: - if remaining_variant_data == supported_product: - product = supported_product - break - else: - raise ValueError( - 'Cannot identify product in "{}" "{}". ' - 'Expected to find one of these supported ones: {}'.format( - remaining_variant_data, variant, _SUPPORTED_PRODUCTS - ) - ) - - return architecture, build_type, product + build_type = variant[len(architecture):] + return architecture, build_type def schedule_task(queue, taskId, task): diff --git a/config/pre-push-recommended.sh b/config/pre-push-recommended.sh index d42119b25..364dc9f7f 100755 --- a/config/pre-push-recommended.sh +++ b/config/pre-push-recommended.sh @@ -17,4 +17,4 @@ ./gradlew -q \ ktlint \ detekt \ - app:assembleX86GreenfieldDebug + app:assembleX86Debug