Esempio n. 1
0
        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();
                }
            }
        }
Esempio n. 2
0
        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 ();
                }
            }
        }