diff --git a/tools/generator/GenBaseSupport.cs b/tools/generator/GenBaseSupport.cs
index ed91ebc12..481d9f978 100644
--- a/tools/generator/GenBaseSupport.cs
+++ b/tools/generator/GenBaseSupport.cs
@@ -204,7 +204,7 @@ public XmlGenBaseSupport (XmlElement pkg, XmlElement elem)
full_name = String.Format ("{0}.{1}{2}", ns, idx > 0 ? StringRocks.TypeToPascalCase (java_name.Substring (0, idx + 1)) : String.Empty, name);
}
- obfuscated = IsObfuscatedName (java_name) && elem.XGetAttribute ("obfuscated") != "false";
+ obfuscated = IsObfuscatedName (pkg.ChildNodes.Count, java_name) && elem.XGetAttribute ("obfuscated") != "false";
}
public override bool IsAcw {
@@ -302,12 +302,21 @@ public override bool ValidateNamespace ()
return true;
}
- bool IsObfuscatedName (String name)
+ bool IsObfuscatedName (int threshold, string name)
{
if (name.StartsWith ("R.", StringComparison.Ordinal))
return false;
int idx = name.LastIndexOf ('.');
string last = idx < 0 ? name : name.Substring (idx + 1);
+ // probably new proguard within Gradle tasks, used in recent GooglePlayServices in 2016 or later.
+ if (last.StartsWith ("zz", StringComparison.Ordinal))
+ return true;
+ // do not expect any name with more than 3 letters is an 'obfuscated' one.
+ if (last.Length > 3)
+ return false;
+ // Only short ones ('a', 'b', 'c' ... 'aa', 'ab', ... 'zzz') are the targets.
+ if (!(last.Length == 3 && threshold > 26*26 || last.Length == 2 && threshold > 26 || last.Length == 1))
+ return false;
if (last.Any (c => (c < 'a' || 'z' < c) && (c < '0' || '9' < c)))
return false;
return true;
diff --git a/tools/generator/Tests-Core/api-cp.xml b/tools/generator/Tests-Core/api-cp.xml
index c20b00f98..41015a890 100644
--- a/tools/generator/Tests-Core/api-cp.xml
+++ b/tools/generator/Tests-Core/api-cp.xml
@@ -3,6 +3,8 @@
+
+
@@ -13,6 +15,12 @@
+
+
+
+
+
+
diff --git a/tools/generator/Tests-Core/expected.cp/GeneratedFiles.projitems b/tools/generator/Tests-Core/expected.cp/GeneratedFiles.projitems
index 864450984..7e5723e9e 100644
--- a/tools/generator/Tests-Core/expected.cp/GeneratedFiles.projitems
+++ b/tools/generator/Tests-Core/expected.cp/GeneratedFiles.projitems
@@ -7,6 +7,8 @@
+
+
diff --git a/tools/generator/Tests-Core/expected.cp/Java.Interop.__TypeRegistrations.cs b/tools/generator/Tests-Core/expected.cp/Java.Interop.__TypeRegistrations.cs
index 6008ae6da..210cb8258 100644
--- a/tools/generator/Tests-Core/expected.cp/Java.Interop.__TypeRegistrations.cs
+++ b/tools/generator/Tests-Core/expected.cp/Java.Interop.__TypeRegistrations.cs
@@ -14,8 +14,10 @@ public static void RegisterPackages ()
#endif // def MONODROID_TIMING
Java.Interop.TypeManager.RegisterPackages (
new string[]{
+ "xamarin/test/invalidnames",
},
new Converter[]{
+ lookup_xamarin_test_invalidnames_package,
});
#if MONODROID_TIMING
var end = DateTime.Now;
@@ -30,5 +32,17 @@ static Type Lookup (string[] mappings, string javaType)
return null;
return Type.GetType (managedType);
}
+
+ static string[] package_xamarin_test_invalidnames_mappings;
+ static Type lookup_xamarin_test_invalidnames_package (string klass)
+ {
+ if (package_xamarin_test_invalidnames_mappings == null) {
+ package_xamarin_test_invalidnames_mappings = new string[]{
+ "xamarin/test/invalidnames/in:Xamarin.Test.Invalidnames.In",
+ };
+ }
+
+ return Lookup (package_xamarin_test_invalidnames_mappings, klass);
+ }
}
}
diff --git a/tools/generator/Tests-Core/expected.cp/Java.Lang.String.cs b/tools/generator/Tests-Core/expected.cp/Java.Lang.String.cs
new file mode 100644
index 000000000..88051e79a
--- /dev/null
+++ b/tools/generator/Tests-Core/expected.cp/Java.Lang.String.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using Android.Runtime;
+
+namespace Java.Lang {
+
+ // Metadata.xml XPath class reference: path="/api/package[@name='java.lang']/class[@name='String']"
+ [global::Android.Runtime.Register ("java/lang/String", DoNotGenerateAcw=true)]
+ public partial class String : Java.Lang.Object {
+
+ protected String (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
+
+ }
+}
diff --git a/tools/generator/Tests-Core/expected.cp/Xamarin.Test.Invalidnames.In.cs b/tools/generator/Tests-Core/expected.cp/Xamarin.Test.Invalidnames.In.cs
new file mode 100644
index 000000000..1de9800a2
--- /dev/null
+++ b/tools/generator/Tests-Core/expected.cp/Xamarin.Test.Invalidnames.In.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using Android.Runtime;
+
+namespace Xamarin.Test.Invalidnames {
+
+ // Metadata.xml XPath class reference: path="/api/package[@name='xamarin.test.invalidnames']/class[@name='in']"
+ [global::Android.Runtime.Register ("xamarin/test/invalidnames/in", DoNotGenerateAcw=true)]
+ public partial class In : Java.Lang.Object {
+
+ protected In (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
+
+ }
+}