Bug 927388 - Produce and upload GeckoView AAR during packaging. r=nalexander

This commit is contained in:
Ahmed Khalil 2015-03-06 10:17:00 -08:00
parent f804ea1fe4
commit 4d1013a6c2
3 changed files with 164 additions and 26 deletions

View File

@ -0,0 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mozilla.gecko">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@ -13,14 +13,18 @@ from __future__ import print_function
import argparse
import hashlib
import os
import shutil
import sys
import zipfile
from mozbuild import util
from mozpack.copier import Jarrer
from mozpack.files import (
File,
FileFinder,
JarFinder,
)
from mozpack.mozjar import JarReader
MAVEN_POM_TEMPLATE = r'''
<?xml version="1.0" encoding="UTF-8"?>
@ -31,9 +35,21 @@ MAVEN_POM_TEMPLATE = r'''
<artifactId>{artifactId}</artifactId>
<version>{version}</version>
<packaging>{packaging}</packaging>
<dependencies>
{dependencies}
</dependencies>
</project>
'''.lstrip()
MAVEN_POM_DEPENDENCY_TEMPLATE = r'''
<dependency>
<groupId>{groupId}</groupId>
<artifactId>{artifactId}</artifactId>
<version>{version}</version>
<type>{packaging}</type>
</dependency>
'''.lstrip()
IVY_XML_TEMPLATE = r'''
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
@ -42,10 +58,40 @@ IVY_XML_TEMPLATE = r'''
<publications>
<artifact name="{name}" type="{type}" ext="{ext}"/>
</publications>
<dependencies/>
<dependencies>
{dependencies}
</dependencies>
</ivy-module>
'''.lstrip()
IVY_XML_DEPENDENCY_TEMPLATE = r'''
<dependency org="{organisation}" name="{name}" rev="{revision}" />
'''.lstrip()
def _zipdir(path, output_file):
zip = zipfile.ZipFile(output_file, "w")
for root, dirs, files in os.walk(path, topdown=True):
archive_root = root.replace(path, '')
for file in files:
zip.write(os.path.join(root, file), os.path.join(archive_root, file))
def _generate_geckoview_classes_jar(distdir, base_path):
base_folder = FileFinder(base_path, ignore=['gecko-R.jar'])
# Unzip all jar files into $(DISTDIR)/geckoview_aar_classes.
geckoview_aar_classes_path = os.path.join(distdir, 'geckoview_aar_classes')
shutil.rmtree(geckoview_aar_classes_path, ignore_errors=True)
util.ensureParentDir(geckoview_aar_classes_path)
for p, f in base_folder.find('*.jar'):
with zipfile.ZipFile(f.path) as zf:
zf.extractall(geckoview_aar_classes_path)
# Rezip them into a single classes.jar file.
classes_jar_path = os.path.join(distdir, 'classes.jar')
_zipdir(geckoview_aar_classes_path, classes_jar_path)
return File(classes_jar_path)
def package_geckolibs_aar(topsrcdir, distdir, output_file):
jarrer = Jarrer(optimize=False)
@ -71,12 +117,40 @@ def package_geckolibs_aar(topsrcdir, distdir, output_file):
jarrer.copy(output_file)
return 0
def package_geckoview_aar(topsrcdir, distdir, output_file):
jarrer = Jarrer(optimize=False)
fennec_path = os.path.join(distdir, 'fennec')
assets = FileFinder(os.path.join(fennec_path, 'assets'), ignore=['*.so'])
for p, f in assets.find('omni.ja'):
jarrer.add(os.path.join('assets', p), f)
# The folder that contains Fennec's JAR files and resources.
base_path = os.path.join(distdir, '..', 'mobile', 'android', 'base')
# The resource set is packaged during Fennec's build.
resjar = JarReader(os.path.join(base_path, 'geckoview_resources.zip'))
for p, f in JarFinder(p, resjar).find('*'):
jarrer.add(os.path.join('res', p), f)
# Package the contents of all Fennec JAR files into classes.jar.
classes_jar_file = _generate_geckoview_classes_jar(distdir, base_path)
jarrer.add('classes.jar', classes_jar_file)
# Add R.txt.
jarrer.add('R.txt', File(os.path.join(base_path, 'R.txt')))
# Finally add AndroidManifest.xml.
srcdir = os.path.join(topsrcdir, 'mobile', 'android', 'geckoview_library', 'geckoview')
jarrer.add('AndroidManifest.xml', File(os.path.join(srcdir, 'AndroidManifest.xml')))
jarrer.copy(output_file)
return 0
def main(args):
parser = argparse.ArgumentParser()
parser.add_argument(dest='dir',
metavar='DIR',
help='Path to write geckolibs Android ARchive and metadata to.')
help='Path to write Android ARchives and metadata to.')
parser.add_argument('--verbose', '-v', default=False, action='store_true',
help='be verbose')
parser.add_argument('--revision',
@ -87,33 +161,82 @@ def main(args):
help='Distribution directory (usually $OBJDIR/dist).')
args = parser.parse_args(args)
# An Ivy 'publication' date must be given in the form yyyyMMddHHmmss, and Mozilla buildids are in this format.
if len(args.revision) != 14:
raise ValueError('Revision must be in yyyyMMddHHmmss format: %s' % args.revision)
paths_to_hash = []
aar = os.path.join(args.dir, 'geckolibs-{revision}.aar').format(revision=args.revision)
paths_to_hash.append(aar)
package_geckolibs_aar(args.topsrcdir, args.distdir, aar)
groupId='org.mozilla'
packaging_type='aar'
gecklibs_aar = os.path.join(args.dir, 'geckolibs-{revision}.aar').format(revision=args.revision)
paths_to_hash.append(gecklibs_aar)
geckoview_aar = os.path.join(args.dir, 'geckoview-{revision}.aar').format(revision=args.revision)
paths_to_hash.append(geckoview_aar)
pom = os.path.join(args.dir, 'geckolibs-{revision}.pom').format(revision=args.revision)
paths_to_hash.append(pom)
with open(pom, 'wt') as f:
f.write(MAVEN_POM_TEMPLATE.format(
groupId='org.mozilla',
package_geckolibs_aar(args.topsrcdir, args.distdir, gecklibs_aar)
package_geckoview_aar(args.topsrcdir, args.distdir, geckoview_aar)
geckolibs_pom_path = os.path.join(args.dir, 'geckolibs-{revision}.pom').format(revision=args.revision)
paths_to_hash.append(geckolibs_pom_path)
geckolibs_pom = MAVEN_POM_TEMPLATE.format(
groupId=groupId,
artifactId='geckolibs',
version=args.revision,
packaging='aar',
))
packaging=packaging_type,
dependencies=''
)
ivy = os.path.join(args.dir, 'ivy-geckolibs-{revision}.xml').format(revision=args.revision)
paths_to_hash.append(ivy)
with open(ivy, 'wt') as f:
with open(geckolibs_pom_path, 'wt') as f:
f.write(geckolibs_pom)
geckoview_pom_path = os.path.join(args.dir, 'geckoview-{revision}.pom').format(revision=args.revision)
paths_to_hash.append(geckoview_pom_path)
geckoview_pom = MAVEN_POM_TEMPLATE.format(
groupId=groupId,
artifactId='geckoview',
version=args.revision,
packaging=packaging_type,
dependencies=MAVEN_POM_DEPENDENCY_TEMPLATE.format(
groupId=groupId,
artifactId='geckolibs',
version=args.revision,
packaging=packaging_type
)
)
with open(geckoview_pom_path, 'wt') as f:
f.write(geckoview_pom)
geckolibs_ivy_path = os.path.join(args.dir, 'ivy-geckolibs-{revision}.xml').format(revision=args.revision)
paths_to_hash.append(geckolibs_ivy_path)
with open(geckolibs_ivy_path, 'wt') as f:
f.write(IVY_XML_TEMPLATE.format(
organisation='org.mozilla',
organisation=groupId,
module='geckolibs',
revision=args.revision,
publication=args.revision, # A white lie.
name='geckolibs',
type='aar',
ext='aar',
type=packaging_type,
ext=packaging_type,
dependencies=''
))
geckoview_ivy_path = os.path.join(args.dir, 'ivy-geckoview-{revision}.xml').format(revision=args.revision)
paths_to_hash.append(geckoview_ivy_path)
with open(geckoview_ivy_path, 'wt') as f:
f.write(IVY_XML_TEMPLATE.format(
organisation=groupId,
module='geckoview',
revision=args.revision,
publication=args.revision, # A white lie.
name='geckoview',
type=packaging_type,
ext=packaging_type,
dependencies=IVY_XML_DEPENDENCY_TEMPLATE.format(
organisation=groupId,
name='geckolibs',
revision=args.revision)
))
for p in paths_to_hash:

View File

@ -363,18 +363,24 @@ INNER_MAKE_GECKOVIEW_LIBRARY=echo 'GeckoView library packaging is only enabled o
INNER_MAKE_GECKOVIEW_EXAMPLE=echo 'GeckoView example packaging is only enabled on Nightly'
endif
# Create geckolibs Android ARchive and metadata for download by local
# Create Android ARchives and metadata for download by local
# developers using Gradle.
ifdef MOZ_ANDROID_GECKOLIBS_AAR
geckolibs-revision := $(BUILDID)
geckoaar-revision := $(BUILDID)
UPLOAD_EXTRA_FILES += \
geckolibs-$(geckolibs-revision).aar \
geckolibs-$(geckolibs-revision).aar.sha1 \
geckolibs-$(geckolibs-revision).pom \
geckolibs-$(geckolibs-revision).pom.sha1 \
ivy-geckolibs-$(geckolibs-revision).xml \
ivy-geckolibs-$(geckolibs-revision).xml.sha1 \
geckolibs-$(geckoaar-revision).aar \
geckolibs-$(geckoaar-revision).aar.sha1 \
geckolibs-$(geckoaar-revision).pom \
geckolibs-$(geckoaar-revision).pom.sha1 \
ivy-geckolibs-$(geckoaar-revision).xml \
ivy-geckolibs-$(geckoaar-revision).xml.sha1 \
geckoview-$(geckoaar-revision).aar \
geckoview-$(geckoaar-revision).aar.sha1 \
geckoview-$(geckoaar-revision).pom \
geckoview-$(geckoaar-revision).pom.sha1 \
ivy-geckoview-$(geckoaar-revision).xml \
ivy-geckoview-$(geckoaar-revision).xml.sha1 \
$(NULL)
INNER_MAKE_GECKOLIBS_AAR= \