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; }
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()); }
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()); }
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()); }