Merge changes I545be996,I2bef893e,I8c026cd2

* changes:
  gn2bp: create single java library from all sources
  gn2bp: collect java sources
  gn2bp: be explicit about dropping java_group dependencies
diff --git a/tools/gn2bp/Android.bp.swp b/tools/gn2bp/Android.bp.swp
index 4a7cf21..92ae832 100644
--- a/tools/gn2bp/Android.bp.swp
+++ b/tools/gn2bp/Android.bp.swp
@@ -1861,6 +1861,34 @@
     name: "cronet_aml_ipc_param_traits",
 }
 
+// GN: //gn:java
+java_library {
+    name: "cronet_aml_java",
+    srcs: [
+        "//base/android/java/src/org/chromium/base/JniException.java",
+        "//base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
+        "//base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
+        "//base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
+        "//base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
+        "//base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
+        "//base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
+        "//base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
+        "//base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
+        "//base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
+        "//base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
+        "//base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
+        "//build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
+        "//build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
+        "//build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
+        "//build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
+        "//build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
+        "//build/android/java/src/org/chromium/build/annotations/MainDex.java",
+        "//build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
+        "//build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
+        "//url/android/java/src/org/chromium/url/IDNStringUtil.java",
+    ],
+}
+
 // GN: //net/base/registry_controlled_domains:registry_controlled_domains
 genrule {
     name: "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains",
diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp
index f157b22..be9c3ba 100755
--- a/tools/gn2bp/gen_android_bp
+++ b/tools/gn2bp/gen_android_bp
@@ -1131,6 +1131,11 @@
 
   return module
 
+def create_java_module(blueprint, gn):
+  bp_module_name = module_prefix + 'java'
+  module = Module('java_library', bp_module_name, '//gn:java')
+  module.srcs.update(gn.java_sources)
+  blueprint.add_module(module)
 
 def create_blueprint_for_targets(gn, desc, targets):
   """Generate a blueprint for a list of GN targets."""
@@ -1153,6 +1158,8 @@
 
   for target in targets:
     create_modules_from_target(blueprint, gn, target)
+
+  create_java_module(blueprint, gn)
   return blueprint
 
 
diff --git a/tools/gn2bp/gn_utils.py b/tools/gn2bp/gn_utils.py
index d706bd8..1aa352e 100644
--- a/tools/gn2bp/gn_utils.py
+++ b/tools/gn2bp/gn_utils.py
@@ -170,6 +170,7 @@
     self.source_sets = {}
     self.actions = {}
     self.proto_libs = {}
+    self.java_sources = set()
 
   def _get_response_file_contents(self, action_desc):
     # response_file_contents are formatted as:
@@ -291,6 +292,23 @@
           target.deps.add(dep_name)
       elif dep.type in LINKER_UNIT_TYPES:
         target.deps.add(dep_name)
+      elif dep.type == 'java_group':
+        # Explicitly break dependency chain when a java_group is added.
+        # Java sources are collected and eventually compiled as one large
+        # java_library.
+        pass
+
+      # Collect java sources. Java sources are kept inside the __compile_java target.
+      # This target can be used for both host and target compilation; only add
+      # the sources if they are destined for the target (i.e. they are a
+      # dependency of the __dex target)
+      # Note: this skips prebuilt java dependencies. These will have to be
+      # added manually when building the jar.
+      if re.match('.*__dex$', target.name):
+        if re.match('.*__compile_java$', dep.name):
+          log.debug('Adding java sources for %s', dep.name)
+          java_srcs = [src for src in dep.inputs if os.path.splitext(src)[1] == '.java']
+          self.java_sources.update(java_srcs)
 
     return target