public override bool Execute() { var sdk = new AndroidSdkInfo(this.CreateTaskLogger(), AndroidSdkPath, AndroidNdkPath, JavaSdkPath); AndroidSdkPath = sdk.AndroidSdkPath; AndroidNdkPath = sdk.AndroidNdkPath; JavaSdkPath = sdk.JavaSdkPath; foreach (var dir in sdk.GetBuildToolsPaths()) { var zipAlign = Path.Combine(dir, ZipAlign); if (File.Exists(zipAlign)) { ZipAlignPath = dir; } var apkSigner = Path.Combine(dir, "lib", ApkSigner); if (File.Exists(apkSigner)) { ApkSignerJar = apkSigner; } AndroidSdkBuildToolsPath = dir; break; } return(!Log.HasLoggedErrors); }
/// <summary> /// Runs the dexdump command to see if a class exists in a dex file /// dexdump returns data of the form: /// Class descriptor : 'Landroid/app/ActivityTracker;' /// </summary> /// <param name="className">A Java class name of the form 'Landroid/app/ActivityTracker;'</param> public static bool ContainsClass(string className, string dexFile, string androidSdkDirectory) { bool containsClass = false; DataReceivedEventHandler handler = (s, e) => { if (e.Data != null && e.Data.Contains("Class descriptor") && e.Data.Contains(className)) { containsClass = true; } }; var androidSdk = new AndroidSdkInfo((l, m) => { Console.WriteLine($"{l}: {m}"); if (l == TraceLevel.Error) { throw new Exception(m); } }, androidSdkDirectory); var buildToolsPath = androidSdk.GetBuildToolsPaths().FirstOrDefault(); if (string.IsNullOrEmpty(buildToolsPath)) { throw new Exception($"Unable to find build-tools in `{androidSdkDirectory}`!"); } var psi = new ProcessStartInfo { FileName = Path.Combine(buildToolsPath, "dexdump"), Arguments = $"\"{dexFile}\"", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, }; var builder = new StringBuilder(); using (var p = new Process { StartInfo = psi }) { p.ErrorDataReceived += handler; p.OutputDataReceived += handler; p.Start(); p.BeginErrorReadLine(); p.BeginOutputReadLine(); p.WaitForExit(); } return(containsClass); }
static void DexDump(DataReceivedEventHandler handler, string dexFile, string androidSdkDirectory) { var androidSdk = new AndroidSdkInfo((l, m) => { Console.WriteLine($"{l}: {m}"); if (l == TraceLevel.Error) { throw new Exception(m); } }, androidSdkDirectory); var buildToolsPath = androidSdk.GetBuildToolsPaths().FirstOrDefault(); if (string.IsNullOrEmpty(buildToolsPath)) { throw new Exception($"Unable to find build-tools in `{androidSdkDirectory}`!"); } var psi = new ProcessStartInfo { FileName = Path.Combine(buildToolsPath, "dexdump"), Arguments = Path.GetFileName(dexFile), CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, WorkingDirectory = Path.GetDirectoryName(dexFile), }; using (var p = new Process { StartInfo = psi }) { p.ErrorDataReceived += handler; p.OutputDataReceived += handler; p.Start(); p.BeginErrorReadLine(); p.BeginOutputReadLine(); p.WaitForExit(); if (p.ExitCode != 0) { throw new Exception($"'{psi.FileName} {psi.Arguments}' exited with code: {p.ExitCode}"); } } }
public void GetBuildToolsPaths_StableVersionsFirst() { CreateSdks(out string root, out string jdk, out string ndk, out string sdk); CreateFauxAndroidSdkDirectory(sdk, "27.0.0-rc4"); var logs = new StringWriter(); Action <TraceLevel, string> logger = (level, message) => { logs.WriteLine($"[{level}] {message}"); }; try { var info = new AndroidSdkInfo(logger, androidSdkPath: sdk, androidNdkPath: ndk, javaSdkPath: jdk); var buildToolsPaths = info.GetBuildToolsPaths().ToList(); Assert.AreEqual(3, buildToolsPaths.Count); Assert.AreEqual(Path.Combine(sdk, "build-tools", "26.0.0"), buildToolsPaths [0]); Assert.AreEqual(Path.Combine(sdk, "build-tools", "27.0.0-rc4"), buildToolsPaths [1]); Assert.AreEqual(Path.Combine(sdk, "platform-tools"), buildToolsPaths [2]); } finally { Directory.Delete(root, recursive: true); } }