(bug 1411688) Make --with-gradle handle single-locale repack r=snorp a=reland
authorCsoregi Natalia <ncsoregi@mozilla.com>
Mon, 06 Nov 2017 15:23:47 +0200
changeset 441083 958eef714e2b68bdfd364fa3ff39ed1a79cb616a
parent 441082 dc45ee24c55d1061951956321bd8481d517ce22a
child 441084 2535bad09d720e71a982f3f70dd6925f66ab8ec7
push id8123
push userryanvm@gmail.com
push dateMon, 06 Nov 2017 14:00:39 +0000
treeherdermozilla-beta@4ff8cd6da5d3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssnorp, reland
bugs1411688
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
(bug 1411688) Make --with-gradle handle single-locale repack r=snorp a=reland
build.gradle
mobile/android/config/mozconfigs/android-aarch64/l10n-nightly
mobile/android/config/mozconfigs/android-api-16/l10n-nightly
mobile/android/config/mozconfigs/android-x86/l10n-nightly
mobile/android/geckoview/build.gradle
mobile/android/gradle/with_gecko_binaries.gradle
taskcluster/ci/l10n/kind.yml
taskcluster/ci/nightly-l10n/kind.yml
taskcluster/taskgraph/transforms/l10n.py
testing/mozharness/configs/single_locale/tc_android-api-16.py
testing/mozharness/scripts/mobile_l10n.py
toolkit/mozapps/installer/upload-files-APK.mk
--- a/build.gradle
+++ b/build.gradle
@@ -62,16 +62,20 @@ if ('multi' == System.env.AB_CD) {
     // Multi-l10n builds set `AB_CD=multi`, which isn't a valid locale.  This
     // causes the
     //
     // |mach build| > |mach gradle| > |make gradle-targets| > AndroidManifest.xml > strings.xml > multi/brand.dtd
     //
     // dependency chain to fail, since multi isn't a real locale.  To avoid
     // this, if Gradle is invoked with AB_CD=multi, we don't invoke Make at all.
     task generateCodeAndResources()
+} else if (System.env.IS_LANGUAGE_REPACK == '1') {
+    // Single-locale l10n repacks set `IS_LANGUAGE_REPACK=1` and handle resource
+    // and code generation themselves.
+    task generateCodeAndResources()
 } else {
     task generateCodeAndResources(type:Exec) {
         workingDir "${topobjdir}"
 
         commandLine mozconfig.substs.GMAKE
         args '-C'
         args "${topobjdir}/mobile/android/base"
         args 'gradle-targets'
--- a/mobile/android/config/mozconfigs/android-aarch64/l10n-nightly
+++ b/mobile/android/config/mozconfigs/android-aarch64/l10n-nightly
@@ -1,40 +1,22 @@
 NO_NDK=1
 
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
+. "$topsrcdir/mobile/android/config/mozconfigs/android-aarch64/nightly"
+
 # L10n
 ac_add_options --with-l10n-base=../../l10n-central
 
+# Don't autoclobber l10n, as this can lead to missing binaries and broken builds
+# Bug 1283438
+mk_add_options AUTOCLOBBER=
+
 . "$topsrcdir/build/mozconfig.no-compile"
 
 # Global options
 ac_add_options --disable-tests
 
-# Android
-ac_add_options --with-android-min-sdk=21
-ac_add_options --target=aarch64-linux-android
-
 ac_add_options --enable-updater
 ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
 
-export MOZILLA_OFFICIAL=1
-
-ac_add_options --with-branding=mobile/android/branding/nightly
-
-ac_add_options --disable-stdcxx-compat
-
-# Don't autoclobber l10n, as this can lead to missing binaries and broken builds
-# Bug 1283438
-mk_add_options AUTOCLOBBER=
-
-# Disable Keyfile Loading (and checks) since l10n doesn't need these keys
-# This overrides the settings in the common android mozconfig
-ac_add_options --without-mozilla-api-keyfile
-ac_add_options --without-google-api-keyfile
-ac_add_options --without-adjust-sdk-keyfile
-ac_add_options --without-leanplum-sdk-keyfile
-ac_add_options --without-pocket-api-keyfile
-# Similarly explicitly disable install tracking for l10n, we'll inherit from en-US
-export MOZ_INSTALL_TRACKING=
-
 . "$topsrcdir/mobile/android/config/mozconfigs/common.override"
--- a/mobile/android/config/mozconfigs/android-api-16/l10n-nightly
+++ b/mobile/android/config/mozconfigs/android-api-16/l10n-nightly
@@ -1,45 +1,22 @@
 NO_NDK=1
 
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
+. "$topsrcdir/mobile/android/config/mozconfigs/android-api-16/nightly"
+
 # L10n
 ac_add_options --with-l10n-base=../../l10n-central
 
+# Don't autoclobber l10n, as this can lead to missing binaries and broken builds
+# Bug 1283438
+mk_add_options AUTOCLOBBER=
+
 . "$topsrcdir/build/mozconfig.no-compile"
 
 # Global options
 ac_add_options --disable-tests
 
-# Android
-# Warning: Before increasing the with-android-min-sdk value, please note several places in and out
-# of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org will
-# advertise a bad API level. This may confuse people. As an example, please look at bug 1384482.
-# If you think you can't handle the whole set of changes, please reach out to the Release
-# Engineering team.
-ac_add_options --with-android-min-sdk=16
-ac_add_options --target=arm-linux-androideabi
-
 ac_add_options --enable-updater
 ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
 
-export MOZILLA_OFFICIAL=1
-
-ac_add_options --with-branding=mobile/android/branding/nightly
-
-ac_add_options --disable-stdcxx-compat
-
-# Don't autoclobber l10n, as this can lead to missing binaries and broken builds
-# Bug 1283438
-mk_add_options AUTOCLOBBER=
-
-# Disable Keyfile Loading (and checks) since l10n doesn't need these keys
-# This overrides the settings in the common android mozconfig
-ac_add_options --without-mozilla-api-keyfile
-ac_add_options --without-google-api-keyfile
-ac_add_options --without-adjust-sdk-keyfile
-ac_add_options --without-leanplum-sdk-keyfile
-ac_add_options --without-pocket-api-keyfile
-# Similarly explicitly disable install tracking for l10n, we'll inherit from en-US
-export MOZ_INSTALL_TRACKING=
-
 . "$topsrcdir/mobile/android/config/mozconfigs/common.override"
--- a/mobile/android/config/mozconfigs/android-x86/l10n-nightly
+++ b/mobile/android/config/mozconfigs/android-x86/l10n-nightly
@@ -1,35 +1,22 @@
 NO_NDK=1
 
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
+. "$topsrcdir/mobile/android/config/mozconfigs/android-x86/nightly"
+
 # L10n
 ac_add_options --with-l10n-base=../../l10n-central
 
+# Don't autoclobber l10n, as this can lead to missing binaries and broken builds
+# Bug 1283438
+mk_add_options AUTOCLOBBER=
+
 . "$topsrcdir/build/mozconfig.no-compile"
 
 # Global options
 ac_add_options --disable-tests
 
-# Android
-# Warning: Before increasing the with-android-min-sdk value, please note several places in and out
-# of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org will
-# advertise a bad API level. This may confuse people. As an example, please look at bug 1384482.
-# If you think you can't handle the whole set of changes, please reach out to the Release
-# Engineering team.
-ac_add_options --target=i386-linux-android
-ac_add_options --with-android-min-sdk=16
-
 ac_add_options --enable-updater
 ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
 
-export MOZILLA_OFFICIAL=1
-
-ac_add_options --with-branding=mobile/android/branding/nightly
-
-ac_add_options --disable-stdcxx-compat
-
-# Don't autoclobber l10n, as this can lead to missing binaries and broken builds
-# Bug 1283438
-mk_add_options AUTOCLOBBER=
-
 . "$topsrcdir/mobile/android/config/mozconfigs/common.override"
--- a/mobile/android/geckoview/build.gradle
+++ b/mobile/android/geckoview/build.gradle
@@ -50,17 +50,18 @@ android {
 
         versionCode computeVersionCode()
         versionName "${mozconfig.substs.MOZ_APP_VERSION}-${mozconfig.substs.MOZ_UPDATE_CHANNEL}"
         consumerProguardFiles 'proguard-rules.txt'
 
         // TODO: ensure these fields always agree with mobile/android/geckoview/BuildConfig.java.in,
         // either by diffing the processed files or by generating the output from a single source.
         buildConfigField 'String', "GRE_MILESTONE", "\"${mozconfig.substs.GRE_MILESTONE}\""
-        buildConfigField 'String', "MOZ_APP_ABI", "\"${mozconfig.substs.TARGET_XPCOM_ABI}\"";
+        // This should really come from the included binaries, but that's not easy.
+        buildConfigField 'String', "MOZ_APP_ABI", mozconfig.substs['COMPILE_ENVIRONMENT'] ? "\"${ mozconfig.substs.TARGET_XPCOM_ABI}\"" : '"arm-eabi-gcc3"';
         buildConfigField 'String', "MOZ_APP_BASENAME", "\"${mozconfig.substs.MOZ_APP_BASENAME}\"";
 
         // For the benefit of future archaeologists:
         // GRE_BUILDID is exactly the same as MOZ_APP_BUILDID unless you're running
         // on XULRunner, which is never the case on Android.
         // 
         // Mimic Python: open(os.path.join(buildconfig.topobjdir, 'buildid.h')).readline().split()[2]
         buildConfigField 'String', "MOZ_APP_BUILDID", "\"${file("${topobjdir}/buildid.h").getText('utf-8').split()[2]}\"";
--- a/mobile/android/gradle/with_gecko_binaries.gradle
+++ b/mobile/android/gradle/with_gecko_binaries.gradle
@@ -147,35 +147,42 @@ ext.configureVariantWithJNIWrappers = { 
     // by configuring the classpath at evaluation-time, not configuration-time.
     //
     // The specific dependency on the `prepareDependencies` task may not be
     // necessary, but commits like
     // https://github.com/evant/gradle-retrolambda/commit/15108c65ee43be499a1359d9d4f88b0851d46769
     // suggest that it is.  It certainly doesn't hurt.
     def prepareDependenciesTask = tasks.getByName("prepare${variant.name.capitalize()}Dependencies")
 
-    def wrapperTask = task("generateJNIWrappersFor${module}${variant.name.capitalize()}", type: JavaExec) {
-        classpath "${topobjdir}/build/annotationProcessors/annotationProcessors.jar"
-
-        // Configure the classpath at evaluation-time, not at
-        // configuration-time: see above comment.
-        doFirst {
-            classpath variant.javaCompile.classpath
-            // Include android.jar.
-            classpath variant.javaCompile.options.bootClasspath
+    def wrapperTask
+    if (System.env.IS_LANGUAGE_REPACK == '1') {
+        // Single-locale l10n repacks set `IS_LANGUAGE_REPACK=1` and don't
+        // really have a build environment.
+        wrapperTask = task("generateJNIWrappersFor${module}${variant.name.capitalize()}")
+    } else {
+        wrapperTask = task("generateJNIWrappersFor${module}${variant.name.capitalize()}", type: JavaExec) {
+            classpath "${topobjdir}/build/annotationProcessors/annotationProcessors.jar"
+    
+            // Configure the classpath at evaluation-time, not at
+            // configuration-time: see above comment.
+            doFirst {
+                classpath variant.javaCompile.classpath
+                // Include android.jar.
+                classpath variant.javaCompile.options.bootClasspath
+            }
+    
+            main = 'org.mozilla.gecko.annotationProcessors.AnnotationProcessor'
+            args module
+            args jarTask.outputs.files.iterator().next()
+    
+            workingDir "${topobjdir}/mobile/android/base"
+    
+            dependsOn jarTask
+            dependsOn prepareDependenciesTask
         }
-
-        main = 'org.mozilla.gecko.annotationProcessors.AnnotationProcessor'
-        args module
-        args jarTask.outputs.files.iterator().next()
-
-        workingDir "${topobjdir}/mobile/android/base"
-
-        dependsOn jarTask
-        dependsOn prepareDependenciesTask
     }
 
     if (module == 'Generated') {
         tasks["bundle${variant.name.capitalize()}"].dependsOn wrapperTask
     } else {
         tasks["assemble${variant.name.capitalize()}"].dependsOn wrapperTask
     }
 }
--- a/taskcluster/ci/l10n/kind.yml
+++ b/taskcluster/ci/l10n/kind.yml
@@ -41,16 +41,20 @@ job-template:
          android-api-16-l10n: 18000
    docker-image:
       by-build-platform:
          default:
            in-tree: desktop-build
          android-api-16-l10n:
            in-tree: android-build
          win.*: null
+   secrets:
+      by-build-platform:
+         default: false
+         android-api-16-l10n: true
    toolchains:
       by-build-platform:
          default: []
          android-api-16-l10n:
             - android-gradle-dependencies
             - android-sdk-linux
             - proguard-jar
    tooltool:
@@ -105,17 +109,18 @@ job-template:
                - total-chunks=1
                - this-chunk=1
             default:
                - total-chunks=1
                - this-chunk=1
       actions:
          by-build-platform:
             default: [clone-locales list-locales setup repack summary]
-            android-api-16-l10n: [clone-locales list-locales setup repack
+            android-api-16-l10n: [get-secrets
+                                  clone-locales list-locales setup repack
                                   upload-repacks summary]
       script:
          by-build-platform:
             default: mozharness/scripts/desktop_l10n.py
             android-api-16-l10n: mozharness/scripts/mobile_l10n.py
    when:
       files-changed:
          - browser/locales/l10n-changesets.json
--- a/taskcluster/ci/nightly-l10n/kind.yml
+++ b/taskcluster/ci/nightly-l10n/kind.yml
@@ -44,16 +44,20 @@ job-template:
          android-api-16-nightly: 18000
    docker-image:
       by-build-platform:
          default:
            in-tree: desktop-build
          android-api-16-nightly:
            in-tree: android-build
          win.*: null
+   secrets:
+      by-build-platform:
+         default: false
+         android-api-16-nightly: true
    toolchains:
       by-build-platform:
          default: []
          android-api-16-nightly:
             - android-gradle-dependencies
             - android-sdk-linux
             - proguard-jar
    tooltool:
@@ -166,14 +170,15 @@ job-template:
                - config=single_locale/tc_win64.py
                - config=taskcluster_nightly.py
                - revision=$GECKO_HEAD_REV
             default: [ ]
       actions:
          by-build-platform:
             default: ['clone-locales', 'list-locales', 'setup', 'repack',
                       'submit-to-balrog', 'summary']
-            android-api-16-nightly: ['clone-locales', 'list-locales', 'setup', 'repack',
+            android-api-16-nightly: ['get-secrets',
+                                     'clone-locales', 'list-locales', 'setup', 'repack',
                                      'upload-repacks', 'submit-to-balrog', 'summary']
       script:
          by-build-platform:
             default: mozharness/scripts/desktop_l10n.py
             android-api-16-nightly: mozharness/scripts/mobile_l10n.py
--- a/taskcluster/taskgraph/transforms/l10n.py
+++ b/taskcluster/taskgraph/transforms/l10n.py
@@ -102,16 +102,23 @@ l10n_description_schema = Schema({
     Required('docker-image'): _by_platform(Any(
         # an in-tree generated docker image (from `taskcluster/docker/<name>`)
         {'in-tree': basestring},
         None,
     )),
 
     Optional('toolchains'): _by_platform([basestring]),
 
+    # The set of secret names to which the task has access; these are prefixed
+    # with `project/releng/gecko/{treeherder.kind}/level-{level}/`.  Setting
+    # this will enable any worker features required and set the task's scopes
+    # appropriately.  `true` here means ['*'], all secrets.  Not supported on
+    # Windows
+    Required('secrets', default=False): _by_platform(Any(bool, [basestring])),
+
     # Information for treeherder
     Required('treeherder'): {
         # Platform to display the task on in treeherder
         Required('platform'): _by_platform(basestring),
 
         # Symbol to use
         Required('symbol'): basestring,
 
@@ -246,16 +253,17 @@ def handle_keyed_by(config, jobs):
     """Resolve fields that can be keyed by platform, etc."""
     fields = [
         "locales-file",
         "locales-per-chunk",
         "worker-type",
         "description",
         "run-time",
         "docker-image",
+        "secrets",
         "toolchains",
         "tooltool",
         "env",
         "ignore-locales",
         "mozharness.config",
         "mozharness.options",
         "mozharness.actions",
         "mozharness.script",
@@ -380,16 +388,17 @@ def make_job_description(config, jobs):
             'description': job['description'],
             'run': {
                 'using': 'mozharness',
                 'job-script': 'taskcluster/scripts/builder/build-l10n.sh',
                 'config': job['mozharness']['config'],
                 'script': job['mozharness']['script'],
                 'actions': job['mozharness']['actions'],
                 'options': job['mozharness']['options'],
+                'secrets': job['secrets'],
             },
             'attributes': job['attributes'],
             'treeherder': {
                 'kind': 'build',
                 'tier': job['treeherder']['tier'],
                 'symbol': job['treeherder']['symbol'],
                 'platform': job['treeherder']['platform'],
             },
--- a/testing/mozharness/configs/single_locale/tc_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/tc_android-api-16.py
@@ -10,9 +10,42 @@ config = {
     "tooltool_servers": ['http://relengapi/tooltool/'],
 
     "upload_env": {
         'UPLOAD_HOST': 'localhost',
         'UPLOAD_PATH': '/builds/worker/artifacts/',
     },
     "mozilla_dir": "src/",
     "simple_name_move": True,
+    'secret_files': [
+        {'filename': '/builds/gapi.data',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/gapi.data',
+         'min_scm_level': 1},
+        {'filename': '/builds/mozilla-fennec-geoloc-api.key',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/mozilla-fennec-geoloc-api.key',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/adjust-sdk.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/adjust-sdk.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/adjust-sdk-beta.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/adjust-sdk-beta.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/leanplum-sdk-release.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/leanplum-sdk-release.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/leanplum-sdk-beta.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/leanplum-sdk-beta.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/leanplum-sdk-nightly.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/leanplum-sdk-nightly.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/pocket-api-release.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/pocket-api-release.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/pocket-api-beta.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/pocket-api-beta.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+        {'filename': '/builds/pocket-api-nightly.token',
+         'secret_name': 'project/releng/gecko/build/level-%(scm-level)s/pocket-api-nightly.token',
+         'min_scm_level': 2, 'default': 'try-build-has-no-secrets'},
+
+    ],
 }
--- a/testing/mozharness/scripts/mobile_l10n.py
+++ b/testing/mozharness/scripts/mobile_l10n.py
@@ -33,26 +33,27 @@ from mozharness.base.transfer import Tra
 from mozharness.mozilla.buildbot import BuildbotMixin
 from mozharness.mozilla.purge import PurgeMixin
 from mozharness.mozilla.release import ReleaseMixin
 from mozharness.mozilla.signing import MobileSigningMixin
 from mozharness.mozilla.tooltool import TooltoolMixin
 from mozharness.base.vcs.vcsbase import MercurialScript
 from mozharness.mozilla.l10n.locales import LocalesMixin
 from mozharness.mozilla.mock import MockMixin
+from mozharness.mozilla.secrets import SecretsMixin
 from mozharness.mozilla.updates.balrog import BalrogMixin
 from mozharness.base.python import VirtualenvMixin
 from mozharness.mozilla.taskcluster_helper import Taskcluster
 
 
 # MobileSingleLocale {{{1
 class MobileSingleLocale(MockMixin, LocalesMixin, ReleaseMixin,
                          MobileSigningMixin, TransferMixin, TooltoolMixin,
                          BuildbotMixin, PurgeMixin, MercurialScript, BalrogMixin,
-                         VirtualenvMixin):
+                         VirtualenvMixin, SecretsMixin):
     config_options = [[
         ['--locale', ],
         {"action": "extend",
          "dest": "locales",
          "type": "string",
          "help": "Specify the locale(s) to sign and update"
          }
     ], [
@@ -119,16 +120,17 @@ class MobileSingleLocale(MockMixin, Loca
          "type": "string",
          "help": "Override the gecko revision to use (otherwise use buildbot supplied"
                  " value, or en-US revision) "}
     ]]
 
     def __init__(self, require_config_file=True):
         buildscript_kwargs = {
             'all_actions': [
+                "get-secrets",
                 "clobber",
                 "pull",
                 "clone-locales",
                 "list-locales",
                 "setup",
                 "repack",
                 "validate-repacks-signed",
                 "upload-repacks",
@@ -180,16 +182,30 @@ class MobileSingleLocale(MockMixin, Loca
         repack_env = self.query_env(partial_env=c.get("repack_env"),
                                     replace_dict=replace_dict)
         if c.get('base_en_us_binary_url') and c.get('release_config_file'):
             rc = self.query_release_config()
             repack_env['EN_US_BINARY_URL'] = c['base_en_us_binary_url'] % replace_dict
         if 'MOZ_SIGNING_SERVERS' in os.environ:
             repack_env['MOZ_SIGN_CMD'] = \
                 subprocess.list2cmdline(self.query_moz_sign_cmd(formats=['jar']))
+
+        if self.query_is_nightly() or self.query_is_nightly_promotion():
+            if self.query_is_nightly():
+                # Nightly promotion needs to set update_channel but not do all
+                # the 'IS_NIGHTLY' automation parts, like uploading symbols
+                # (for now).
+                repack_env["IS_NIGHTLY"] = "yes"
+            # In branch_specifics.py we might set update_channel explicitly.
+            if c.get('update_channel'):
+                repack_env["MOZ_UPDATE_CHANNEL"] = c['update_channel']
+            else:  # Let's just give the generic channel based on branch.
+                repack_env["MOZ_UPDATE_CHANNEL"] = \
+                    "nightly-%s" % (c['branch'],)
+
         self.repack_env = repack_env
         return self.repack_env
 
     def query_l10n_env(self):
         return self.query_env()
 
     def query_upload_env(self):
         if self.upload_env:
--- a/toolkit/mozapps/installer/upload-files-APK.mk
+++ b/toolkit/mozapps/installer/upload-files-APK.mk
@@ -89,16 +89,17 @@ package_fennec = \
 repackage_fennec = \
   $(MAKE) -C $(GECKO_APP_AP_PATH) gecko-nodeps.ap_ && \
   $(PYTHON) -m mozbuild.action.package_fennec_apk \
     --verbose \
     --inputs \
       $(UNPACKAGE) \
       $(GECKO_APP_AP_PATH)/gecko-nodeps.ap_ \
     --omnijar $(MOZ_PKG_DIR)/$(OMNIJAR_NAME) \
+    --classes-dex $(GECKO_APP_AP_PATH)/classes.dex \
     --output $(PACKAGE:.apk=-unsigned-unaligned.apk) && \
   $(call RELEASE_SIGN_ANDROID_APK,$(PACKAGE:.apk=-unsigned-unaligned.apk),$(PACKAGE))
 
 INNER_MAKE_PACKAGE = $(if $(UNPACKAGE),$(repackage_fennec),$(package_fennec))
 
 # Language repacks root the resources contained in assets/omni.ja
 # under assets/, but the repacks expect them to be rooted at /.
 # Therefore, we we move the omnijar back to / so the resources are