private DexLookup LoadDex()
        {
            var apk = new ApkFile(_apkPath);
            var dex = apk.Load("classes.dex");

            return(new DexLookup(Dex.Read(new MemoryStream(dex))));
        }
예제 #2
0
        /// <summary>
        /// Load a resources table from the given apk.
        /// </summary>
        private static Table CreateResourcesArsc(ApkFile apkFile)
        {
            var data = (apkFile != null) ? apkFile.Load("resources.arsc") : null;

            if (data == null)
            {
                return(null);
            }
            return(new Table(new MemoryStream(data)));
        }
예제 #3
0
        /// <summary>
        /// Create an layout.xml parser for the data in the given framework folder.
        /// </summary>
        private static LayoutXmlParser CreateLayoutXmlParser(ApkFile apkFile)
        {
            var data = (apkFile != null) ? apkFile.Load("layout.xml") : null;

            if (data == null)
            {
                return(new LayoutXmlParser(null));
            }
            return(new LayoutXmlParser(new MemoryStream(data)));
        }
예제 #4
0
        /// <summary>
        /// Create an attrs.xml parser for the data in the given framework folder.
        /// </summary>
        private static AttrsXmlParser CreateAttrXmlParser(ApkFile apkFile)
        {
            var data = (apkFile != null) ? apkFile.Load("attrs.xml") : null;

            if (data == null)
            {
                return(new AttrsXmlParser(null));
            }
            return(new AttrsXmlParser(new MemoryStream(data)));
        }
예제 #5
0
        /// <summary>
        /// Try to load a bitmap from file.
        /// Returns null when that was not possible.
        /// </summary>
        private static Image LoadBitmap(ApkFile apk, string fileName)
        {
            var data = apk.Load(fileName);

            if (data == null)
            {
                return(null);
            }
            return(Image.FromStream(new MemoryStream(data)));
        }
예제 #6
0
        /// <summary>
        /// Compile the given resources into a suitable output folder.
        /// </summary>
        internal bool Compile(List <Tuple <string, ResourceType> > resources, List <string> appWidgetProviderCodeFiles, List <string> references, List <string> referenceFolders, string baseApkPath)
        {
            // Remove temp folder
            if (Directory.Exists(tempFolder))
            {
                Directory.Delete(tempFolder, true);
            }

            // Ensure temp\res folder exists
            var resFolder = Path.Combine(tempFolder, "res");

            Directory.CreateDirectory(resFolder);
            var tempApkPath = Path.Combine(tempFolder, "temp.apk");

            // Compile each resource
            foreach (var resource in resources.Where(x => x.Item2 != ResourceType.Manifest))
            {
                CopyResourceToFolder(tempFolder, resource.Item1, resource.Item2);
            }

            // Extract resources out of library project references
            var resolver = new AssemblyResolver(referenceFolders, null, null);

            foreach (var path in references)
            {
                ExtractLibraryProjectResources(resFolder, path, resolver);
            }

            // Select manifest path
            var manifestPath = resources.Where(x => x.Item2 == ResourceType.Manifest).Select(x => x.Item1).FirstOrDefault();

            // Ensure files exists for the appwidgetproviders
            CreateAppWidgetProviderFiles(tempFolder, manifestPath, appWidgetProviderCodeFiles);

            // Create system ID's resource
            CreateSystemIdsResource(tempFolder);

            // Run aapt
            var args = new[] {
                "p",
                "-f",
                "-S",
                resFolder,
                "-M",
                GetManifestPath(tempFolder, manifestPath, packageName),
                "-I",
                baseApkPath,
                "-F",
                tempApkPath
            };
            var runner   = new ProcessRunner(Locations.Aapt, args);
            var exitCode = runner.Run();

            if (exitCode != 0)
            {
                ProcessAaptErrors(runner.Output, tempFolder, resources);
                return(false);
            }

            // Unpack compiled resources to base folder.
            Table resourceTable = null;

            using (var apk = new ApkFile(tempApkPath))
            {
                foreach (var name in apk.FileNames)
                {
                    // Extract
                    var data = apk.Load(name);

                    // Save
                    var path = Path.Combine(baseFolder, name);
                    Directory.CreateDirectory(Path.GetDirectoryName(path));
                    File.WriteAllBytes(path, data);

                    // Is resource table? yes -> load it
                    if (name == "resources.arsc")
                    {
                        resourceTable = new Table(new MemoryStream(data));
                    }
                }
            }

            // Create R.cs
            if (!string.IsNullOrEmpty(generatedCodeFolder))
            {
                var codeBuilder = new CreateResourceIdsCode(resourceTable, resources, valuesResourceProcessor.StyleableDeclarations);
                codeBuilder.Generate(generatedCodeFolder, packageName, generatedCodeNamespace, generatedCodeLanguage, lastModified);
            }

            // Create resource type usage info file
            if (!string.IsNullOrEmpty(resourceTypeUsageInformationPath))
            {
                // Ensure folder exists
                var folder = Path.GetDirectoryName(resourceTypeUsageInformationPath);
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }

                // Create file
                File.WriteAllLines(resourceTypeUsageInformationPath, layoutProcessor.CustomClassNames);
            }

            return(true);
        }