Skip to content

Commit

Permalink
Add AAR support to Chrome and convert support libraries to using AARs
Browse files Browse the repository at this point in the history
Chrome has been using Jar and resources from support library for years.
In Q1 2016, Android team stops shipping jars/res for support libray.
Instead, AAR is promoted, which is a zip that wraps jars and resources.

This CL introduces a utility python script that processes an AAR file.
In GN gen time, it lists all files in the AAR, yet it does not extract
it. Actual unpacking is postponed until compilation.

Two other things to notice:
1. In the old jar we depended on, support-v13 contains support-v4 and
support-annotations. After converting to AAR, these two libraries are no
longer part of support-v13. Thus this change needs to be reflected.
2. In the new AAR format, support-v4 now contains two jars instead of
one. All public classes are in classes.jar, and all hidden classes are
in libs/internal_impl-$VERSION.jar.

This work is not possible without bajones@'s pioneering work in
https://chromiumcodereview.appspot.com/2069273002/

BUG=611171

Review-Url: https://codereview.chromium.org/2156453002
Cr-Commit-Position: refs/heads/master@{#406603}
  • Loading branch information
jollycopper authored and Commit bot committed Jul 20, 2016
1 parent 0e8ac09 commit c84b975
Show file tree
Hide file tree
Showing 17 changed files with 237 additions and 77 deletions.
65 changes: 65 additions & 0 deletions build/android/gyp/aar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/usr/bin/env python
#
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Processes an Android AAR file."""

import argparse
import os
import shutil
import sys
import zipfile

from util import build_utils

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
os.pardir, os.pardir)))
import gn_helpers


def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--input-file',
help='Path to the AAR file.',
required=True,
metavar='FILE')
parser.add_argument('--extract',
help='Extract the files to output directory.',
action='store_true')
parser.add_argument('--list',
help='List all the resource and jar files.',
action='store_true')
parser.add_argument('--output-dir',
help='Output directory for the extracted files. Must '
'be set if --extract is set.',
metavar='DIR')

args = parser.parse_args()
if not args.extract and not args.list:
parser.error('Either --extract or --list has to be specified.')

aar_file = args.input_file
output_dir = args.output_dir

if args.extract:
# Clear previously extracted versions of the AAR.
shutil.rmtree(output_dir, True)
build_utils.ExtractAll(aar_file, path=output_dir)

if args.list:
data = {}
data['resources'] = []
data['jars'] = []
with zipfile.ZipFile(aar_file) as z:
for name in z.namelist():
if name.startswith('res/') and not name.endswith('/'):
data['resources'].append(name)
if name.endswith('.jar'):
data['jars'].append(name)
print gn_helpers.ToGNString(data)


if __name__ == '__main__':
sys.exit(main())
1 change: 1 addition & 0 deletions build/config/android/internal_rules.gni
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ _java_target_blacklist = [
"//chrome:packed_extra_resources",
"//chrome:packed_resources",
"//remoting/android:remoting_android_raw_resources",
"*:*_unpack_aar",
]

# Write the target's .build_config file. This is a json file that contains a
Expand Down
111 changes: 111 additions & 0 deletions build/config/android/rules.gni
Original file line number Diff line number Diff line change
Expand Up @@ -2558,4 +2558,115 @@ if (enable_java_templates) {
]
}
}

# Declare an Android library target for a prebuilt AAR.
#
# This target creates an Android library containing java code and Android
# resources. For libraries without resources, it will not generate
# corresponding android_resources targets.
#
# Variables
# aar_path: Path to the AAR.
# TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed.
# requires_android: Whether this target can only be used for compiling Android related targets.
#
# Example
# android_aar_prebuilt("foo_java") {
# aar_path = "foo.aar"
# }
template("android_aar_prebuilt") {
assert(defined(invoker.aar_path))
_output_path = "${target_gen_dir}/${target_name}"
_unpack_target_name = "${target_name}__unpack_aar"

# Scan the AAR file and determine the resources and jar files.
# Some libraries might not have resources; others might have two jars.
_scanned_files =
exec_script("//build/android/gyp/aar.py",
[
"--input-file",
rebase_path(invoker.aar_path, root_build_dir),
"--list",
],
"scope")

action(_unpack_target_name) {
script = "//build/android/gyp/aar.py" # Unzips the AAR
args = [
"--input-file",
rebase_path(invoker.aar_path, root_build_dir),
"--output-dir",
rebase_path(_output_path, root_build_dir),
"--extract",
]
inputs = [
invoker.aar_path,
]
outputs = [
"${_output_path}/AndroidManifest.xml",
]

if (_scanned_files.resources != []) {
outputs += [ "${_output_path}/R.txt" ]
outputs += get_path_info(
rebase_path(_scanned_files.resources, "", _output_path),
"abspath")
}
if (defined(_scanned_files.jars)) {
outputs +=
get_path_info(rebase_path(_scanned_files.jars, "", _output_path),
"abspath")
}
}

_sub_target_names = []

# Create android_java_prebuilt targets for jar files.
_counter = 0
foreach(jar, _scanned_files.jars) {
_counter += 1
_current_target = "${target_name}__jar_$_counter"
_sub_target_names += [ ":$_current_target" ]
java_prebuilt(_current_target) {
forward_variables_from(invoker,
[
"deps",
"requires_android",
])
if (!defined(deps)) {
deps = []
}
deps += [ ":$_unpack_target_name" ]
if (!defined(requires_android)) {
requires_android = true
}
supports_android = true
jar_path = "${_output_path}/$jar"
}
}

# Create the android_resources target for resources.
if (_scanned_files.resources != []) {
_res_target_name = "${target_name}__res"
_sub_target_names += [ ":$_res_target_name" ]
android_resources(_res_target_name) {
forward_variables_from(invoker, [ "deps" ])
if (!defined(deps)) {
deps = []
}
deps += [ ":$_unpack_target_name" ]
resource_dirs = []
generated_resource_dirs = [ "${_output_path}/res" ]
generated_resource_files =
rebase_path(_scanned_files.resources, "", _output_path)
android_manifest_dep = ":$_unpack_target_name"
android_manifest = "${_output_path}/AndroidManifest.xml"
v14_skip = true
}
}

java_group(target_name) {
deps = _sub_target_names
}
}
}
98 changes: 42 additions & 56 deletions build/secondary/third_party/android_tools/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ source_set("cpu_features") {
]
}

lib_version = "23.2.1"
lib_path = "$android_sdk_root/extras/android/m2repository/com/android/support"

android_java_prebuilt("android_gcm_java") {
jar_path = "$android_sdk_root/extras/google/gcm/gcm-client/dist/gcm.jar"
}
Expand All @@ -40,87 +43,77 @@ android_java_prebuilt("emma_device") {
jar_path = "$android_sdk_root/tools/lib/emma_device.jar"
}

android_resources("android_support_design_resources") {
v14_skip = true
android_aar_prebuilt("android_support_design_java") {
deps = [
":android_support_v7_appcompat_resources",
]
resource_dirs = [ "$android_sdk_root/extras/android/support/design/res" ]
custom_package = "android.support.design"
}

android_java_prebuilt("android_support_design_java") {
deps = [
":android_support_design_resources",
":android_support_v7_appcompat_java",
]
jar_path = "$android_sdk_root/extras/android/support/design/libs/android-support-design.jar"
lib_name = "design"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

java_prebuilt("android_support_multidex_java") {
supports_android = true
jar_path = "$android_sdk_root/extras/android/support/multidex/library/libs/android-support-multidex.jar"
android_aar_prebuilt("android_support_multidex_java") {
# TODO(jbudorick): remove requires_android after crbug.com/522043 is fixed.
requires_android = false
aar_path = "$lib_path/multidex/1.0.1/multidex-1.0.1.aar"
}

android_java_prebuilt("android_support_v13_java") {
jar_path =
"$android_sdk_root/extras/android/support/v13/android-support-v13.jar"
android_java_prebuilt("android_support_annotations_java") {
lib_name = "support-annotations"
jar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.jar"
}

android_resources("android_support_v7_appcompat_resources") {
v14_skip = true
resource_dirs =
[ "$android_sdk_root/extras/android/support/v7/appcompat/res" ]
custom_package = "android.support.v7.appcompat"
android_aar_prebuilt("android_support_v4_java") {
lib_name = "support-v4"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

android_java_prebuilt("android_support_v7_appcompat_java") {
android_aar_prebuilt("android_support_v13_java") {
deps = [
":android_support_v7_appcompat_resources",
":android_support_annotations_java",
":android_support_v4_java",
]
jar_path = "$android_sdk_root/extras/android/support/v7/appcompat/libs/android-support-v7-appcompat.jar"
lib_name = "support-v13"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

android_resources("android_support_v7_mediarouter_resources") {
v14_skip = true
resource_dirs =
[ "$android_sdk_root/extras/android/support/v7/mediarouter/res" ]
android_aar_prebuilt("android_support_v7_appcompat_java_internal") {
lib_name = "appcompat-v7"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

java_group("android_support_v7_appcompat_java") {
deps = [
":android_support_v7_appcompat_resources",
":android_support_v4_java",
":android_support_v7_appcompat_java_internal",
]
custom_package = "android.support.v7.mediarouter"
}

android_java_prebuilt("android_support_v7_mediarouter_java") {
android_aar_prebuilt("android_support_v7_mediarouter_java") {
deps = [
":android_support_v7_appcompat_java",
":android_support_v7_mediarouter_resources",
]
jar_path = "$android_sdk_root/extras/android/support/v7/mediarouter/libs/android-support-v7-mediarouter.jar"
}

android_resources("android_support_v7_recyclerview_resources") {
v14_skip = true
resource_dirs =
[ "$android_sdk_root/extras/android/support/v7/recyclerview/res" ]
custom_package = "android.support.v7.recyclerview"
lib_name = "mediarouter-v7"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

android_java_prebuilt("android_support_v7_recyclerview_java") {
android_aar_prebuilt("android_support_v7_recyclerview_java") {
deps = [
":android_support_v7_appcompat_java",
":android_support_v7_recyclerview_resources",
]
jar_path = "$android_sdk_root/extras/android/support/v7/recyclerview/libs/android-support-v7-recyclerview.jar"
lib_name = "recyclerview-v7"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

android_resources("google_play_services_default_resources") {
v14_skip = true
resource_dirs = [ "$android_sdk_root/extras/google/google_play_services/libproject/google-play-services_lib/res" ]
custom_package = "com.google.android.gms"
}

android_java_prebuilt("google_play_services_default_java") {
deps = [
":android_support_v13_java",
":android_support_annotations_java",
":android_support_v4_java",
":android_support_v7_mediarouter_java",
":google_play_services_default_resources",
]
Expand All @@ -130,19 +123,12 @@ android_java_prebuilt("google_play_services_default_java") {
jar_path = "$android_sdk_root/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar"
}

android_resources("android_support_v17_leanback_resources") {
v14_skip = true
resource_dirs =
[ "$android_sdk_root/extras/android/support/v17/leanback/res" ]
custom_package = "android.support.v17.leanback"
}

android_java_prebuilt("android_support_v17_leanback_java") {
android_aar_prebuilt("android_support_v17_leanback_java") {
deps = [
":android_support_v17_leanback_resources",
":android_support_v7_recyclerview_java",
]
jar_path = "$android_sdk_root/extras/android/support/v17/leanback/libs/android-support-v17-leanback.jar"
lib_name = "leanback-v17"
aar_path = "$lib_path/$lib_name/$lib_version/$lib_name-$lib_version.aar"
}

# TODO(jbudorick): Remove this once net_java_test_support no longer needs it.
Expand Down
3 changes: 1 addition & 2 deletions chrome/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ android_library("chrome_java") {
"//third_party/android_protobuf:protobuf_nano_javalib",
"//third_party/android_swipe_refresh:android_swipe_refresh_java",
"//third_party/android_tools:android_gcm_java",
"//third_party/android_tools:android_support_annotations_java",
"//third_party/android_tools:android_support_design_java",
"//third_party/android_tools:android_support_v13_java",
"//third_party/android_tools:android_support_v7_appcompat_java",
Expand Down Expand Up @@ -379,7 +380,6 @@ android_library("chrome_test_java") {
"//third_party/WebKit/public:android_mojo_bindings_java",
"//third_party/WebKit/public:blink_headers_java",
"//third_party/android_tools:android_support_design_java",
"//third_party/android_tools:android_support_v13_java",
"//third_party/android_tools:android_support_v7_appcompat_java",
"//third_party/android_tools:android_support_v7_recyclerview_java",
"//third_party/android_tools:legacy_http_javalib",
Expand Down Expand Up @@ -590,7 +590,6 @@ android_library("chrome_sync_shell_test_apk_java") {
"//sync:test_support_sync_proto_java",
"//sync/android:sync_java",
"//third_party/android_protobuf:protobuf_nano_javalib",
"//third_party/android_tools:android_support_v13_java",
"//third_party/android_tools:android_support_v7_appcompat_java",
"//ui/android:ui_java",
]
Expand Down
1 change: 0 additions & 1 deletion chrome/test/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ android_library("chrome_java_test_support") {
"//sync:sync_java_test_support",
"//sync/android:sync_java",
"//testing/android/reporter:reporter_java",
"//third_party/android_tools:android_support_v13_java",
"//third_party/android_tools:android_support_v7_appcompat_java",
"//third_party/android_tools:legacy_http_javalib",
"//third_party/jsr-305:jsr_305_javalib",
Expand Down
2 changes: 1 addition & 1 deletion chromecast/browser/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ android_library("cast_shell_java") {
"//net/android:net_java",

# TODO(slan): We may need to pass this in as a parameter.
"//third_party/android_tools:android_support_v13_java",
"//third_party/android_tools:android_support_v4_java",
"//ui/android:ui_java",
]
}
Loading

0 comments on commit c84b975

Please sign in to comment.