Add EXCLUDED_CRATES and better default names

* protobuf_bin_gen_rust_do_not_use is in EXCLUDED_CRATES
* build_default_name returns a short and readable name
  for a rust_defaults module, from the following choices:
    (1) root_pkg + '_defaults',
    (2) root_pkg + '_defaults_' + crate_name
    (3) root_pkg + '_defaults_' + main_src_basename_path
    (4) root_pkg + '_defaults_' + a_positive_sequence_number

Test: regen external/rust/crates/*/Android.bp
Change-Id: I6aa16a8a6c7ea05744a31a9d4ff0c4524ef91fea
diff --git a/scripts/cargo2android.py b/scripts/cargo2android.py
index 08f23fa..df841d9 100755
--- a/scripts/cargo2android.py
+++ b/scripts/cargo2android.py
@@ -60,6 +60,10 @@
 import re
 import sys
 
+# Some Rust packages include extra unwanted crates.
+# This set contains all such excluded crate names.
+EXCLUDED_CRATES = set(['protobuf_bin_gen_rust_do_not_use'])
+
 RENAME_MAP = {
     # This map includes all changes to the default rust module names
     # to resolve name conflicts, avoid confusion, or work as plugin.
@@ -462,7 +466,8 @@
 
   def skip_crate(self):
     """Return crate_name or a message if this crate should be skipped."""
-    if is_build_crate_name(self.crate_name):
+    if (is_build_crate_name(self.crate_name) or
+        self.crate_name in EXCLUDED_CRATES):
       return self.crate_name
     if is_dependent_file_path(self.main_src):
       return 'dependent crate'
@@ -531,10 +536,26 @@
       self.decide_one_module_type(crate_type)
       self.dump_one_android_module(crate_type)
 
+  def build_default_name(self):
+    """Return a short and readable name for the rust_defaults module."""
+    # Choices: (1) root_pkg + '_defaults',
+    # (2) root_pkg + '_defaults_' + crate_name
+    # (3) root_pkg + '_defaults_' + main_src_basename_path
+    # (4) root_pkg + '_defaults_' + a_positive_sequence_number
+    name1 = altered_defaults(self.root_pkg) + '_defaults'
+    if self.runner.try_claim_module_name(name1, self):
+      return name1
+    name2 = name1 + '_' + self.crate_name
+    if self.runner.try_claim_module_name(name2, self):
+      return name2
+    name3 = name1 + '_' + self.main_src_basename_path()
+    if self.runner.try_claim_module_name(name3, self):
+      return name3
+    return self.runner.claim_module_name(name1, self, 0)
+
   def dump_defaults_module(self):
     """Dump a rust_defaults module to be shared by other modules."""
-    name = altered_defaults(self.root_pkg) + '_defaults'
-    name = self.runner.claim_module_name(name, self, 0)
+    name = self.build_default_name()
     self.defaults = name
     self.write('\nrust_defaults {')
     self.write('    name: "' + name + '",')
@@ -618,10 +639,13 @@
     self.dump_android_property_list('static_libs', '"lib%s"', self.static_libs)
     self.dump_android_property_list('shared_libs', '"lib%s"', self.shared_libs)
 
+  def main_src_basename_path(self):
+    return re.sub('/', '_', re.sub('.rs$', '', self.main_src))
+
   def test_module_name(self):
     """Return a unique name for a test module."""
     # root_pkg+(_host|_device) + '_test_'+source_file_name
-    suffix = re.sub('/', '_', re.sub('.rs$', '', self.main_src))
+    suffix = self.main_src_basename_path()
     host_device = '_host'
     if self.device_supported:
       host_device = '_device'
@@ -980,16 +1004,20 @@
       with open(name, 'w') as outf:
         outf.write(ANDROID_BP_HEADER.format(args=' '.join(sys.argv[1:])))
 
+  def try_claim_module_name(self, name, owner):
+    """Reserve and return True if it has not been reserved yet."""
+    if name not in self.name_owners or owner == self.name_owners[name]:
+      self.name_owners[name] = owner
+      return True
+    return False
+
   def claim_module_name(self, prefix, owner, counter):
     """Return prefix if not owned yet, otherwise, prefix+str(counter)."""
     while True:
       name = prefix
       if counter > 0:
-        name += str(counter)
-      if name not in self.name_owners:
-        self.name_owners[name] = owner
-        return name
-      if owner == self.name_owners[name]:
+        name += '_' + str(counter)
+      if self.try_claim_module_name(name, owner):
         return name
       counter += 1