Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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}");
                }
            }
        }
Esempio n. 4
0
        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);
            }
        }