Bug 1417232 - Part 2: Extract magic Gradle configuration from build into |mach android assemble-app|. r=ted.mielczarek

These magic locations evolve over time.  Baking them into
moz.configure is the easiest way to share them across the build
system, and pushing them into a new |mach android *| command continues
a pattern that has been very successful.

MozReview-Commit-ID: CyxVQ0LHHgl

--HG--
extra : rebase_source : 8350d71665f0126aa4ee2c8fec32c4b8e34dc772
This commit is contained in:
Nick Alexander 2017-11-08 15:27:36 -08:00
parent b76185017f
commit d1d1541e8d
6 changed files with 84 additions and 12 deletions

View File

@ -236,12 +236,7 @@ ifdef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
define gradle_command define gradle_command
$(1): $(2) $(1): $(2)
@$$(TOUCH) $$@ @$$(TOUCH) $$@
$$(topsrcdir)/mach gradle \ $$(topsrcdir)/mach android assemble-app
geckoview:generateJNIWrappersForGeneratedRelease \
app:generateJNIWrappersForFennecOfficialPhotonDebug \
app:assembleOfficialPhotonDebug \
app:assembleOfficialPhotonDebugAndroidTest \
-x lint
endef endef
# .gradle.deps: .aapt.deps FORCE # .gradle.deps: .aapt.deps FORCE
@ -508,7 +503,7 @@ $(eval $(call gradle_command,.gradle.nodeps,AndroidManifest.xml $(constants_PP_J
.aapt.nodeps: .gradle.nodeps FORCE .aapt.nodeps: .gradle.nodeps FORCE
@$(TOUCH) $@ @$(TOUCH) $@
cp $(gradle_dir)/app/outputs/apk/app-official-photon-debug.apk gecko-nodeps.ap_ cp $(GRADLE_ANDROID_APP_APK) gecko-nodeps.ap_
cp $(gradle_dir)/app/intermediates/transforms/dex/officialPhoton/debug/folders/1000/1f/main/classes.dex classes.dex cp $(gradle_dir)/app/intermediates/transforms/dex/officialPhoton/debug/folders/1000/1f/main/classes.dex classes.dex
else else
# .aapt.nodeps: AndroidManifest.xml FORCE # .aapt.nodeps: AndroidManifest.xml FORCE

View File

@ -36,6 +36,75 @@ def gradle(value, build_env):
set_config('GRADLE', gradle) set_config('GRADLE', gradle)
@dependable
@imports(_from='itertools', _import='chain')
def gradle_android_build_config():
def capitalize(s):
# str.capitalize lower cases trailing letters.
if s:
return s[0].upper() + s[1:]
else:
return s
# It's not really possible to abstract the GeckoView details just yet; post
# Android-Gradle plugin 3.0+, the configurations can be more sensible and
# we'll do this work.
def variant(productFlavors, buildType):
return namespace(
productFlavors=productFlavors,
buildType=buildType,
# Like 'OfficialWithoutGeckoBinariesPhotonDebug'
name = ''.join(capitalize(t) for t in chain(productFlavors, (buildType, )))
)
return namespace(
app=namespace(
variant=variant(('official', 'photon'), 'debug'),
),
)
@depends(gradle_android_build_config)
def gradle_android_app_variant_name(build_config):
'''Like "officialPhotonDebug".'''
def uncapitalize(s):
if s:
return s[0].lower() + s[1:]
else:
return s
return uncapitalize(build_config.app.variant.name)
set_config('GRADLE_ANDROID_APP_VARIANT_NAME', gradle_android_app_variant_name)
@depends(gradle_android_build_config)
def gradle_android_app_tasks(build_config):
'''Gradle tasks run by |mach android assemble-app|.'''
return [
'geckoview:generateJNIWrappersForGeneratedRelease',
'app:generateJNIWrappersForFennec{app.variant.name}'.format(app=build_config.app),
'app:assemble{app.variant.name}'.format(app=build_config.app),
'app:assemble{app.variant.name}AndroidTest'.format(app=build_config.app),
]
set_config('GRADLE_ANDROID_APP_TASKS', gradle_android_app_tasks)
@depends(gradle_android_build_config, check_build_environment)
def gradle_android_app_apks(build_config, build_env):
'''Paths to APK files produced by |mach android assemble-app|.'''
flavor = '-'.join(build_config.app.variant.productFlavors)
buildType = build_config.app.variant.buildType
f = '{}/gradle/build/mobile/android/app/outputs/apk/app-{}-{}.apk'
g = '{}/gradle/build/mobile/android/app/outputs/apk/app-{}-{}-androidTest.apk'
return namespace(app_apk=f.format(build_env.topobjdir, flavor, buildType),
app_androidTest_apk=g.format(build_env.topobjdir, flavor, buildType))
set_config('GRADLE_ANDROID_APP_APK', gradle_android_app_apks.app_apk)
set_config('GRADLE_ANDROID_APP_ANDROIDTEST_APK', gradle_android_app_apks.app_androidTest_apk)
# Automation uses this to change log levels, not use the daemon, and use # Automation uses this to change log levels, not use the daemon, and use
# offline mode. # offline mode.
option(env='GRADLE_FLAGS', default='', help='Flags to pass to Gradle.') option(env='GRADLE_FLAGS', default='', help='Flags to pass to Gradle.')

View File

@ -54,6 +54,16 @@ class MachCommands(MachCommandBase):
pass pass
@SubCommand('android', 'assemble-app',
"""Assemble Firefox for Android.
See http://firefox-source-docs.mozilla.org/build/buildsystem/toolchains.html#firefox-for-android-with-gradle""")
@CommandArgument('args', nargs=argparse.REMAINDER)
def android_assemble_app(self, args):
ret = self.gradle(self.substs['GRADLE_ANDROID_APP_TASKS'] + ['-x', 'lint', '--continue'] + args, verbose=True)
return ret
@SubCommand('android', 'test', @SubCommand('android', 'test',
"""Run Android local unit tests. """Run Android local unit tests.
See https://developer.mozilla.org/en-US/docs/Mozilla/Android-specific_test_suites#android-test""") See https://developer.mozilla.org/en-US/docs/Mozilla/Android-specific_test_suites#android-test""")

View File

@ -25,7 +25,7 @@ include $(topsrcdir)/config/android-common.mk
ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
robocop_apk := $(topobjdir)/mobile/android/tests/browser/robocop/robocop-debug-unsigned-unaligned.apk robocop_apk := $(topobjdir)/mobile/android/tests/browser/robocop/robocop-debug-unsigned-unaligned.apk
else else
robocop_apk := $(topobjdir)/gradle/build/mobile/android/app/outputs/apk/app-official-photon-debug-androidTest.apk robocop_apk := $(GRADLE_ANDROID_APP_ANDROIDTEST_APK)
endif endif
stage-package-android: stage-package-android:

View File

@ -1003,9 +1003,7 @@ class AndroidArguments(ArgumentContainer):
if not options.robocopApk and build_obj: if not options.robocopApk and build_obj:
if build_obj.substs.get('MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE'): if build_obj.substs.get('MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE'):
options.robocopApk = os.path.join(build_obj.topobjdir, 'gradle', 'build', options.robocopApk = build_obj.substs.get('GRADLE_ANDROID_APP_ANDROIDTEST_APK')
'mobile', 'android', 'app', 'outputs', 'apk',
'app-official-photon-debug-androidTest.apk')
else: else:
options.robocopApk = os.path.join(build_obj.topobjdir, 'mobile', 'android', options.robocopApk = os.path.join(build_obj.topobjdir, 'mobile', 'android',
'tests', 'browser', 'tests', 'browser',

View File

@ -32,7 +32,7 @@ UPLOAD_EXTRA_FILES += robocop.apk
ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
robocop_apk := $(topobjdir)/mobile/android/tests/browser/robocop/robocop-debug-unsigned-unaligned.apk robocop_apk := $(topobjdir)/mobile/android/tests/browser/robocop/robocop-debug-unsigned-unaligned.apk
else else
robocop_apk := $(topobjdir)/gradle/build/mobile/android/app/outputs/apk/app-official-photon-debug-androidTest.apk robocop_apk := $(GRADLE_ANDROID_APP_ANDROIDTEST_APK)
endif endif
INNER_ROBOCOP_PACKAGE= \ INNER_ROBOCOP_PACKAGE= \