private void GenerateConfiguration() { var resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(AndroidIntermediateAssetsDir); var assembly = AssemblyDefinition.ReadAssembly(MainAssembly, new ReaderParameters() { AssemblyResolver = resolver, }); // Assumption is that the assemblies have been stripped already, thus all of the referencing assemblies // only have recerences to existing Java classes var extTypes = assembly.Modules .SelectMany(m => m.AssemblyReferences .Where(r => r.Name != "Mono.Android") .Select(r => m.AssemblyResolver.Resolve(r))) .SelectMany(a => a.Modules) .SelectMany(m => m.Types) .SelectMany(t => new List <TypeDefinition> () { t }.Concat(t.NestedTypes)); var indexer = new JniIndexer(); var types = indexer.Crawl(extTypes); // Generate Proguard configuration using (var sw = new StreamWriter(Config)) { // Keep all generated resource files: sw.WriteLine("-keepclassmembers class **.R$* {"); sw.WriteLine("\tpublic static <fields>;"); sw.WriteLine("}"); // Keep all mono java & ACWs: sw.WriteLine("-keep class mono.** { *; }"); sw.WriteLine("-keep class * implements mono.android.IGCUserPeer { *; }"); // Keep Java used by bindings: foreach (var t in types) { sw.Write("-keep class {0}", t); if (t.Members.Count > 0) { sw.WriteLine(" {"); if (t.Members.Any(m => m.Signature == null)) { sw.WriteLine("\t<fields>;"); } foreach (var m in t.Members.Where(m => m.Signature != null)) { sw.Write('\t'); sw.Write(m); sw.WriteLine(';'); } sw.Write("}"); } sw.WriteLine(); } } }
private void GenerateConfiguration() { var resolver = new DefaultAssemblyResolver (); resolver.AddSearchDirectory (AndroidIntermediateAssetsDir); var assembly = AssemblyDefinition.ReadAssembly (MainAssembly, new ReaderParameters () { AssemblyResolver = resolver, }); // Assumption is that the assemblies have been stripped already, thus all of the referencing assemblies // only have recerences to existing Java classes var extTypes = assembly.Modules .SelectMany (m => m.AssemblyReferences .Where (r => r.Name != "Mono.Android") .Select (r => m.AssemblyResolver.Resolve (r))) .SelectMany (a => a.Modules) .SelectMany (m => m.Types) .SelectMany (t => new List<TypeDefinition> () { t }.Concat (t.NestedTypes)); var indexer = new JniIndexer (); var types = indexer.Crawl (extTypes); // Generate Proguard configuration using (var sw = new StreamWriter (Config)) { // Keep all generated resource files: sw.WriteLine ("-keepclassmembers class **.R$* {"); sw.WriteLine ("\tpublic static <fields>;"); sw.WriteLine ("}"); // Keep all mono java & ACWs: sw.WriteLine ("-keep class mono.** { *; }"); sw.WriteLine ("-keep class * implements mono.android.IGCUserPeer { *; }"); // Keep Java used by bindings: foreach (var t in types) { sw.Write ("-keep class {0}", t); if (t.Members.Count > 0) { sw.WriteLine (" {"); if (t.Members.Any (m => m.Signature == null)) { sw.WriteLine ("\t<fields>;"); } foreach (var m in t.Members.Where(m => m.Signature != null)) { sw.Write ('\t'); sw.Write (m); sw.WriteLine (';'); } sw.Write ("}"); } sw.WriteLine (); } } }