Exemplo n.º 1
0
        protected override CommandLineBuilder GetCommandLineBuilder()
        {
            var cmd = base.GetCommandLineBuilder ();

            if (!string.IsNullOrEmpty (AcwMapFile)) {
                var acwLines = File.ReadAllLines (AcwMapFile);
                using (var appcfg = File.CreateText (ProguardGeneratedApplicationConfiguration)) {
                    for (int i = 0; i + 2 < acwLines.Length; i += 3) {
                        try {
                            var line = acwLines [i + 2];
                            var java = line.Substring (line.IndexOf (';') + 1);
                            appcfg.WriteLine ("-keep class " + java + " { *; }");
                        } catch {
                            // skip invalid lines
                        }
                    }
                }
            }
            if (!string.IsNullOrWhiteSpace (ProguardCommonXamarinConfiguration)) {
                using (var xamcfg = File.CreateText (ProguardCommonXamarinConfiguration)) {
                    GetType ().Assembly.GetManifestResourceStream ("proguard_xamarin.cfg").CopyTo (xamcfg.BaseStream);
                    if (IgnoreWarnings) {
                        xamcfg.WriteLine ("-ignorewarnings");
                    }
                }
            }
            if (!string.IsNullOrEmpty (ProguardConfigurationFiles)) {
                var configs = ProguardConfigurationFiles
                    .Replace ("{sdk.dir}", AndroidSdkDirectory + Path.DirectorySeparatorChar)
                    .Replace ("{intermediate.common.xamarin}", ProguardCommonXamarinConfiguration)
                    .Replace ("{intermediate.references}", ProguardGeneratedReferenceConfiguration)
                    .Replace ("{intermediate.application}", ProguardGeneratedApplicationConfiguration)
                    .Replace ("{project}", string.Empty) // current directory anyways.
                    .Split (';')
                    .Select (s => s.Trim ())
                    .Where (s => !string.IsNullOrWhiteSpace (s));
                foreach (var file in configs) {
                    if (File.Exists (file))
                        cmd.AppendSwitchIfNotNull ("--pg-conf ", file);
                    else
                        Log.LogCodedWarning ("XA4304", file, 0, Properties.Resources.XA4304, file);
                }
            }

            return cmd;
        }
Exemplo n.º 2
0
        protected override string GenerateCommandLineCommands()
        {
            var cmd = new CommandLineBuilder();

            if (!UseProguard)
            {
                // Add the JavaOptions if they are not null
                // These could be any of the additional options
                if (!string.IsNullOrEmpty(JavaOptions))
                {
                    cmd.AppendSwitch(JavaOptions);
                }

                // Add the specific -XmxN to override the default heap size for the JVM
                // N can be in the form of Nm or NGB (e.g 100m or 1GB )
                cmd.AppendSwitchIfNotNull("-Xmx", JavaMaximumHeapSize);

                cmd.AppendSwitchIfNotNull("-jar ", Path.Combine(ProguardJarPath));
            }

            if (!ClassesOutputDirectory.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                ClassesOutputDirectory += Path.DirectorySeparatorChar;
            }
            var classesFullPath = Path.GetFullPath(ClassesOutputDirectory);

            if (File.Exists(ProguardJarInput))
            {
                File.Delete(ProguardJarInput);
            }
            using (var zip = ZipArchive.Open(ProguardJarInput, FileMode.Create)) {
                foreach (var file in Directory.GetFiles(classesFullPath, "*", SearchOption.AllDirectories))
                {
                    zip.AddFile(file, Path.Combine(Path.GetDirectoryName(file.Substring(classesFullPath.Length)), Path.GetFileName(file)));
                }
            }

            var acwLines = File.ReadAllLines(AcwMapFile);

            using (var appcfg = File.CreateText(ProguardGeneratedApplicationConfiguration))
                for (int i = 0; i + 3 < acwLines.Length; i += 4)
                {
                    try {
                        var java = acwLines [i + 3].Substring(acwLines [i + 3].IndexOf(';') + 1);
                        appcfg.WriteLine("-keep class " + java + " { *; }");
                    } catch {
                        // skip invalid lines
                    }
                }

            var injars  = new List <string> ();
            var libjars = new List <string> ();

            injars.Add(ProguardJarInput);
            if (JavaLibrariesToEmbed != null)
            {
                foreach (var jarfile in JavaLibrariesToEmbed)
                {
                    injars.Add(jarfile.ItemSpec);
                }
            }

            using (var xamcfg = File.Create(ProguardCommonXamarinConfiguration))
                GetType().Assembly.GetManifestResourceStream("proguard_xamarin.cfg").CopyTo(xamcfg);

            var configs = ProguardConfigurationFiles
                          .Replace("{sdk.dir}", AndroidSdkDirectory + Path.DirectorySeparatorChar)
                          .Replace("{intermediate.common.xamarin}", ProguardCommonXamarinConfiguration)
                          .Replace("{intermediate.references}", ProguardGeneratedReferenceConfiguration)
                          .Replace("{intermediate.application}", ProguardGeneratedApplicationConfiguration)
                          .Replace("{project}", string.Empty)        // current directory anyways.
                          .Split(';')
                          .Select(s => s.Trim())
                          .Where(s => !string.IsNullOrWhiteSpace(s));

            foreach (var file in configs)
            {
                if (File.Exists(file))
                {
                    cmd.AppendSwitchIfNotNull("-include ", file);
                }
                else
                {
                    Log.LogWarning("Proguard configuration file '{0}' was not found.", file);
                }
            }

            libjars.Add(JavaPlatformJarPath);
            if (ExternalJavaLibraries != null)
            {
                foreach (var jarfile in ExternalJavaLibraries.Select(p => p.ItemSpec))
                {
                    libjars.Add(jarfile);
                }
            }

            var enclosingChar = OS.IsWindows ? "\"" : string.Empty;

            cmd.AppendSwitchUnquotedIfNotNull("-injars ", $"{enclosingChar}'" + string.Join($"'{Path.PathSeparator}'", injars.Distinct()) + $"'{enclosingChar}");

            cmd.AppendSwitchIfNotNull("-libraryjars ", $"{enclosingChar}'" + string.Join($"'{Path.PathSeparator}'", libjars.Distinct()) + $"'{enclosingChar}");

            cmd.AppendSwitchIfNotNull("-outjars ", ProguardJarOutput);

            if (EnableLogging)
            {
                cmd.AppendSwitchIfNotNull("-dump ", DumpOutput);
                cmd.AppendSwitchIfNotNull("-printseeds ", PrintSeedsOutput);
                cmd.AppendSwitchIfNotNull("-printusage ", PrintUsageOutput);
                cmd.AppendSwitchIfNotNull("-printmapping ", PrintMappingOutput);
            }

            // http://stackoverflow.com/questions/5701126/compile-with-proguard-gives-exception-local-variable-type-mismatch#7587680
            cmd.AppendSwitch("-optimizations !code/allocation/variable");

            return(cmd.ToString());
        }
Exemplo n.º 3
0
        protected override string GenerateCommandLineCommands()
        {
            if (CustomMainDexListFiles != null && CustomMainDexListFiles.Any())
            {
                // FIXME: add error code.
                Log.LogWarning("Jack compiler does not accept custom main dex list file. You would have to either disable Jack or remove MultiDexMainDexList items.");
            }

            //   Running command: C:\Program Files (x86)\Java\jdk1.6.0_20\bin\java.exe
            //     "-jar" "C:\Program Files (x86)\Android\android-sdk-windows\platform-tools\jack.jar"
            //     "--output-dex" "bin"
            //     "-classpath" "C:\Users\Jonathan\Documents\Visual Studio 2010\Projects\AndroidMSBuildTest\AndroidMSBuildTest\obj\Debug\android\bin\mono.android.jar"
            //     "@C:\Users\Jonathan\AppData\Local\Temp\tmp79c4ac38.tmp"

            //var android_dir = MonoDroid.MonoDroidSdk.GetAndroidProfileDirectory (TargetFrameworkDirectory);

            var cmd = new CommandLineBuilder();

            cmd.AppendSwitchIfNotNull("-jar ", JackJarPath);

            //cmd.AppendSwitchIfNotNull ("-J-Dfile.encoding=", "UTF8");

            cmd.AppendSwitchIfNotNull("--output-dex ", OutputDexDirectory);

            cmd.AppendSwitchIfNotNull("-cp ", JavaPlatformJackPath);
            foreach (var jack in InputJackFiles)
            {
                cmd.AppendSwitchIfNotNull("--import ", jack);
            }
            //cmd.AppendSwitchIfNotNull ("-bootclasspath ", JavaPlatformJarPath);
            //cmd.AppendSwitchIfNotNull ("-encoding ", "UTF-8");
            cmd.AppendFileNameIfNotNull(string.Format("@{0}", TemporarySourceListFile));

            if (EnableMultiDex)
            {
                cmd.AppendSwitchIfNotNull("--multi-dex ", "NATIVE");
            }
            // Proguard settings
            if (EnableProguard)
            {
                var acwLines = File.ReadAllLines(AcwMapFile);
                using (var appcfg = File.CreateText(ProguardGeneratedApplicationConfiguration))
                    for (int i = 0; i + 3 < acwLines.Length; i += 4)
                    {
                        try {
                            var java = acwLines [i + 3].Substring(acwLines [i + 3].IndexOf(';') + 1);
                            appcfg.WriteLine("-keep class " + java + " { *; }");
                        } catch {
                            // skip invalid lines
                        }
                    }
                var configs = ProguardConfigurationFiles
                              .Replace("{sdk.dir}", Path.GetDirectoryName(Path.GetDirectoryName(ProguardJarPath)) + Path.DirectorySeparatorChar)
                              .Replace("{intermediate.common.xamarin}", ProguardCommonXamarinConfiguration)
                              .Replace("{intermediate.references}", ProguardGeneratedReferenceConfiguration)
                              .Replace("{intermediate.application}", ProguardGeneratedApplicationConfiguration)
                              .Replace("{project}", string.Empty)            // current directory anyways.
                              .Split(';')
                              .Select(s => s.Trim())
                              .Where(s => !string.IsNullOrWhiteSpace(s));

                foreach (var file in configs)
                {
                    if (File.Exists(file))
                    {
                        cmd.AppendSwitchIfNotNull("--config-proguard ", file);
                    }
                    else
                    {
                        Log.LogWarning("Proguard configuration file '{0}' was not found.", file);
                    }
                }
            }

            return(cmd.ToString());
        }
Exemplo n.º 4
0
        protected override string GenerateCommandLineCommands()
        {
            var cmd = new CommandLineBuilder();

            if (!UseProguard)
            {
                // Add the JavaOptions if they are not null
                // These could be any of the additional options
                if (!string.IsNullOrEmpty(JavaOptions))
                {
                    cmd.AppendSwitch(JavaOptions);
                }

                // Add the specific -XmxN to override the default heap size for the JVM
                // N can be in the form of Nm or NGB (e.g 100m or 1GB )
                cmd.AppendSwitchIfNotNull("-Xmx", JavaMaximumHeapSize);

                cmd.AppendSwitchIfNotNull("-jar ", Path.Combine(ProguardJarPath));
            }

            if (!ClassesOutputDirectory.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                ClassesOutputDirectory += Path.DirectorySeparatorChar;
            }
            var classesFullPath = Path.GetFullPath(ClassesOutputDirectory);

            if (File.Exists(ProguardJarInput))
            {
                File.Delete(ProguardJarInput);
            }
            var zip = new Ionic.Zip.ZipFile(ProguardJarInput, new System.Text.UTF8Encoding(false));

            foreach (var file in Directory.GetFiles(classesFullPath, "*", SearchOption.AllDirectories))
            {
                zip.AddFile(file, Path.GetDirectoryName(file.Substring(classesFullPath.Length)));
            }
            zip.Save();
            zip.Dispose();

            var acwLines = File.ReadAllLines(AcwMapFile);

            using (var appcfg = File.CreateText(ProguardGeneratedApplicationConfiguration))
                for (int i = 0; i + 3 < acwLines.Length; i += 4)
                {
                    try {
                        var java = acwLines [i + 3].Substring(acwLines [i + 3].IndexOf(';') + 1);
                        appcfg.WriteLine("-keep class " + java + " { *; }");
                    } catch {
                        // skip invalid lines
                    }
                }

            var injars  = new List <string> ();
            var libjars = new List <string> ();

            injars.Add(ProguardJarInput);
            if (JavaLibrariesToEmbed != null)
            {
                foreach (var jarfile in JavaLibrariesToEmbed)
                {
                    injars.Add(jarfile.ItemSpec);
                }
            }

            using (var xamcfg = File.Create(ProguardCommonXamarinConfiguration))
                GetType().Assembly.GetManifestResourceStream("proguard_xamarin.cfg").CopyTo(xamcfg);

            var configs = ProguardConfigurationFiles
                          .Replace("{sdk.dir}", Path.GetDirectoryName(Path.GetDirectoryName(ProguardHome)) + Path.DirectorySeparatorChar)
                          .Replace("{intermediate.common.xamarin}", ProguardCommonXamarinConfiguration)
                          .Replace("{intermediate.references}", ProguardGeneratedReferenceConfiguration)
                          .Replace("{intermediate.application}", ProguardGeneratedApplicationConfiguration)
                          .Replace("{project}", string.Empty)        // current directory anyways.
                          .Split(';')
                          .Select(s => s.Trim())
                          .Where(s => !string.IsNullOrWhiteSpace(s));

            foreach (var file in configs)
            {
                if (File.Exists(file))
                {
                    cmd.AppendSwitchIfNotNull("-include ", file);
                }
                else
                {
                    Log.LogWarning("Proguard configuration file '{0}' was not found.", file);
                }
            }

            libjars.Add(JavaPlatformJarPath);
            if (ExternalJavaLibraries != null)
            {
                foreach (var jarfile in ExternalJavaLibraries.Select(p => p.ItemSpec))
                {
                    libjars.Add(jarfile);
                }
            }

            cmd.AppendSwitch("\"-injars");
            cmd.AppendSwitch(string.Join(Path.PathSeparator.ToString(), injars.Distinct().Select(s => '\'' + s + '\'')) + "\"");

            cmd.AppendSwitch("\"-libraryjars");
            cmd.AppendSwitch(string.Join(Path.PathSeparator.ToString(), libjars.Distinct().Select(s => '\'' + s + '\'')) + "\"");

            cmd.AppendSwitch("-outjars");
            cmd.AppendSwitch('"' + ProguardJarOutput + '"');

            if (EnableLogging)
            {
                cmd.AppendSwitchIfNotNull("-dump ", DumpOutput);
                cmd.AppendSwitchIfNotNull("-printseeds ", PrintSeedsOutput);
                cmd.AppendSwitchIfNotNull("-printusage ", PrintUsageOutput);
                cmd.AppendSwitchIfNotNull("-printmapping ", PrintMappingOutput);
            }

            return(cmd.ToString());
        }