/// <summary>
        /// 得到APK的版本信息
        /// </summary>
        /// <param name="apk">程序的名称</param>
        /// <returns></returns>
        public ActionResult Version(String apk)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("<?xml version='1.0' encoding='utf-8'?>");
            sb.Append("<info>");

            ApkInfo ai = GetNewApk(apk, null);

            if (ai != null)
            {
                String sBasePath = System.Web.Configuration.WebConfigurationManager.AppSettings["DownUrl"];
                sb.Append("<versioncode>" + ai.versioncode + "</versioncode>");
                sb.Append("<version>" + ai.versionname + "</version>");
                sb.Append("<url><![CDATA[" + sBasePath + RouteData.Values["Controller"] + "/HqlsAppDn?apk=" + ai.appname.Replace(".apk", "") + "&version=" + ai.versionname + "]]></url>");
                sb.Append("<description><![CDATA[检查到新版本,请及时升级]]></description>");
                sb.Append("<debug>");
                foreach (ApkDebugInfo ad in ai.ApkDebugInfo)
                {
                    sb.Append("<item><![CDATA[" + ad.DebugItem.Trim() + "]]></item>");
                }
                sb.Append("</debug>");
                sb.Append("<permissions>");
                foreach (ApkPermission ap in ai.ApkPermission)
                {
                    sb.Append("<permission>" + ap.permission + "</permission>");
                }
                sb.Append("</permissions>");
            }
            sb.Append("</info>");
            return(Content(sb.ToString(), "text/xml"));
        }
Beispiel #2
0
        private ApkInfo GetAndroidInfo(string path)
        {
            byte[] manifestData  = null;
            byte[] resourcesData = null;
            string manifestPath  = SearchPathToFile("AndroidManifest.xml", path);

            if (manifestPath == "")
            {
                Logger.WriteLog("Cannot search AndroidManifest.xml file", LogLevel.Usual);
                return(null);
            }
            string resourcesPath = SearchPathToFile("resources.arsc", path);

            if (resourcesPath == "")
            {
                Logger.WriteLog("Cannot search resources.arsc file", LogLevel.Usual);
                return(null);
            }
            manifestData  = File.ReadAllBytes(manifestPath);
            resourcesData = File.ReadAllBytes(resourcesPath);
            if (manifestData == null || resourcesData == null)
            {
                return(null);
            }
            ApkReader apkReader = new ApkReader();
            ApkInfo   info      = apkReader.extractInfo(manifestData, resourcesData);

            Logger.WriteLog("Get android info from archive", LogLevel.Usual);
            return(info);
        }
Beispiel #3
0
 private ApkInfo GetAndroidInfo(string pathDirectoryAPK)
 {
     if (!string.IsNullOrEmpty(pathDirectoryAPK))
     {
         string manifestPath = SearchPathToFile("AndroidManifest.xml", pathDirectoryAPK);
         if (!string.IsNullOrEmpty(manifestPath))
         {
             string resourcesPath = SearchPathToFile("resources.arsc", pathDirectoryAPK);
             if (!string.IsNullOrEmpty(resourcesPath))
             {
                 byte[] manifestData  = File.ReadAllBytes(manifestPath);
                 byte[] resourcesData = File.ReadAllBytes(resourcesPath);
                 if (manifestData != null || resourcesData != null)
                 {
                     ApkReader apkReader = new ApkReader();
                     ApkInfo   info      = apkReader.extractInfo(manifestData, resourcesData);
                     Log.Info("Get android info from archive.");
                     return(info);
                 }
             }
             else
             {
                 Log.Error("Can't search resources.arsc file.");
             }
         }
         else
         {
             Log.Error("Can't search AndroidManifest.xml file.");
         }
     }
     return(null);
 }
Beispiel #4
0
        public ApkInfoForm(ApkInfo apkInfo)
        {
            InitializeComponent();

            mApkInfo = apkInfo;
            refreshUI();
        }
Beispiel #5
0
        private void btnSelect_Click(object sender, EventArgs e)
        {
            rtbInfo.Text = "";
            bool flag = openFileDialogeFunc();

            if (flag)
            {
                fileIsSelected = true;
                foreach (string file in ofdApk.FileNames)
                {
                    apkSelected         = ofdApk.FileName;
                    apkSelectedFileName = ofdApk.SafeFileName;
                    var readApk = new Apk_Reader();

                    file_info          = readApk.Get_File_Info(file);
                    panel1.Visible     = true;
                    lblAppInfo.Visible = true;
                    lblAppInfo.Text    = "APK Name: " + file_info.apkName + "\n" + "APK Version: " + file_info.versionName + "\n";
                }

                /*string[] apkSelected2 = ofdApk.FileNames;
                 * int i = 0;
                 * foreach (string str in apkSelected2)
                 * {
                 *  i++;
                 *  long lengthApk = new System.IO.FileInfo(str).Length;
                 *  string retSize = humanReadableConvert(lengthApk);
                 *  rtbInfo.Text = rtbInfo.Text + "\nSuccesful Select[" + i + "]" + ":\n" +
                 *      "\t>> Apk Path: " + str + "\n" +
                 *      "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ";
                 * }*/
            }
        }
        private ApkInfo GetNewApk(String apk, String version, String ext)
        {
            ApkInfo ai = null;

            if (apk == null)
            {
                apk = "HQLSApp" + ext;
            }
            else
            {
                apk += ext;
            }
            PhoneAppsDataClassesDataContext padc = new PhoneAppsDataClassesDataContext();

            var qry = from e in padc.ApkInfo
                      where e.appname == apk
                      select e;

            if (version != null)
            {
                qry = qry.Where(e1 => e1.versionname == version);
            }
            qry = qry.OrderByDescending(eodrd => eodrd.appname).OrderByDescending(eodrid1 => eodrid1.versioncode).Take(1);
            if (qry != null && qry.Count() > 0)
            {
                ai = qry.ToArray()[0];
            }

            return(ai);
        }
        public string GetAPKPackageName(String apk)
        {
            this.Dispatcher.Invoke(() =>
            {
                txtbox.AppendText("\n\nGetting APK package name");
            });
            Stopwatch s         = Stopwatch.StartNew();
            ApkReader apkReader = new ApkReader();
            ApkInfo   info      = new ApkInfo();

            try
            {
                ZipArchive a = ZipFile.OpenRead(apk);
                a.GetEntry("AndroidManifest.xml").ExtractToFile(exe + "Androidmanifest.xml", true);
                a.GetEntry("resources.arsc").ExtractToFile(exe + "resources.arsc", true);
                info = apkReader.extractInfo(File.ReadAllBytes(exe + "AndroidManifest.xml"), File.ReadAllBytes(exe + "resources.arsc"));
            }
            catch (Exception e)
            {
                this.Dispatcher.Invoke(() =>
                {
                    txtbox.AppendText("\n\nAn Error occured while getting the APK Version:\n" + e.ToString() + "\n\nYour APK may be corrupted.Please get a fresh copy of it and try again. If you used Auto downgrade then try again.");
                    txtbox.ScrollToEnd();
                });
            };
            this.Dispatcher.Invoke(() =>
            {
                s.Stop();
                txtbox.AppendText("\nGot APK package name (" + info.packageName + ") in " + s.ElapsedMilliseconds + " ms");
                txtbox.ScrollToEnd();
            });
            return(info.packageName);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Enter Path");
            string  APKfilePath = Console.ReadLine();
            ApkInfo info        = ReadApk.ReadApkFromPath(APKfilePath);

            Console.ReadKey();
        }
Beispiel #9
0
        private static void AnalyzeReport(ApkInfo info, string apkLocation)
        {
            string apkName = apkLocation.Split(new[] { "/" }, StringSplitOptions.None).Last();

            var builder = new StringBuilder();

            builder.AppendLine("{color:#fc035e}*" + $"Release V{PlayerSettings.bundleVersion}" + "*{color} " + $"[^{apkName}]");
            //builder.AppendLine("{color:#fc035e}*" + $"Release V{PlayerSettings.bundleVersion}" + "*{color} " + $"[^{buildData.GetApkName}]");
            builder.AppendLine($"");

            builder.AppendLine("{panel:title=Manifest Info|borderStyle=dashed|borderColor=#ccc|titleBGColor=#F7D6C1|bgColor=#FFFFCE}");
            builder.AppendLine($"* Name = *{info.label}*");
            builder.AppendLine($"* packageID = {SetColorForBool(info.packageName,info.packageName.Equals("app.lustigovich.testadjusti"), false)}");
            builder.AppendLine($"* appVersion = *{info.versionCode}*");
            builder.AppendLine($"* minSdkVersion = {info.minSdkVersion}");
            builder.AppendLine($"* targetSdkVersion = {SetColorForBool(info.targetSdkVersion,Int32.Parse(info.targetSdkVersion) >= 30)}");
            builder.AppendLine($"* debuggable = {SetColorForBool(info.IsDebuggable, false)}");
            builder.AppendLine($"* AdjustAvailable = {SetColorForBool(info.adjustAvailable)}");
            builder.AppendLine($"* hasIcon = {SetColorForBool(info.hasIcon)}");
            builder.AppendLine($"* screenOrientation = {Enum.Parse(typeof(AndroidScreenOrientation),info.screenOrientation)}");
            builder.AppendLine($"* Permissions");
            foreach (string permission in info.permissions)
            {
                builder.AppendLine($"** {permission}");
            }
            builder.AppendLine($"* keysHash");
            builder.AppendLine($"** {info.keysHash[0]}");
            builder.Append($"** {info.keysHash[1]}");
            builder.AppendLine("{panel}");

            builder.AppendLine("{panel:title=Unity Settings|borderStyle=dashed|borderColor=#ccc|titleBGColor=#ACAEEB|bgColor=#D9E0FD}");
            builder.AppendLine($"* productName = *{PlayerSettings.productName}*");
            builder.AppendLine($"* companyName = {PlayerSettings.companyName}");
            builder.AppendLine($"* appVersion = *{PlayerSettings.bundleVersion}*");
            builder.AppendLine($"* packageID=*{SetColorForString(PlayerSettings.applicationIdentifier, "app.lustigovich.testadjusti", false)}*");
            builder.AppendLine($"* minSdkVersion = {PlayerSettings.Android.minSdkVersion}");
            builder.AppendLine($"* targetSdkVersion = {PlayerSettings.Android.targetSdkVersion}");
            builder.AppendLine($"* scriptingBackend = {PlayerSettings.GetScriptingBackend(BuildTargetGroup.Android)}");
            builder.AppendLine($"* targetArchitectures = {SetColorForEnum(PlayerSettings.Android.targetArchitectures, AndroidArchitecture.ARM64)}");
            builder.AppendLine($"* debug = {SetColorForBool(EditorUserBuildSettings.development, false)}");
            builder.AppendLine($"* useCustomKeystore = {SetColorForBool(PlayerSettings.Android.useCustomKeystore)}");
            builder.AppendLine($"* keystoreName = {PlayerSettings.Android.keystoreName}");
            builder.AppendLine($"* keystorePass = {PlayerSettings.Android.keystorePass}");
            builder.AppendLine($"* keyaliasName = {PlayerSettings.Android.keyaliasName}");
            builder.AppendLine($"* keyaliasPass = {PlayerSettings.Android.keyaliasPass}");
            builder.Append($"* screenOrientation = {PlayerSettings.defaultInterfaceOrientation}");
            builder.AppendLine("{panel}");

            //string fileName = $"{GetFullApkPath(buildData, saveFolder)}.txt";
            string fileName = $"{apkLocation}.txt";

            WriteReport(fileName, builder);
            EditorUtility.RevealInFinder(fileName);
        }
Beispiel #10
0
 public void GetAPKBuildWithInfo(string pathDirectoryAPK, ref Build apk)
 {
     if (!string.IsNullOrEmpty(pathDirectoryAPK) && apk != null)
     {
         ApkInfo info = GetAndroidInfo(pathDirectoryAPK);
         apk.buildName        = info.packageName;
         apk.urlIcon          = apk.buildHash + info.iconFileName[0];
         apk.version          = info.versionName;
         apk.numberBuild      = info.targetSdkVersion;
         apk.bundleIdentifier = info.label;
     }
 }
Beispiel #11
0
        private void SelectAPK(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            packageNameLBL.Text    = "Package Name: LENDO ARQUIVO";
            openFileDialog1.Filter = "APK Files|*.APK";
            openFileDialog1.Title  = "Selecione um arquivo .APK";
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NomeAPK = openFileDialog1.FileName;
                using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(File.OpenRead(openFileDialog1.FileName)))
                {
                    using (var filestream = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read))
                    {
                        ICSharpCode.SharpZipLib.Zip.ZipFile  zipfile = new ICSharpCode.SharpZipLib.Zip.ZipFile(filestream);
                        ICSharpCode.SharpZipLib.Zip.ZipEntry item;
                        try
                        {
                            while ((item = zip.GetNextEntry()) != null)
                            {
                                if (item.Name.ToLower() == "androidmanifest.xml")
                                {
                                    manifestData = new byte[50 * 1024];
                                    using (Stream strm = zipfile.GetInputStream(item))
                                    {
                                        strm.Read(manifestData, 0, manifestData.Length);
                                    }
                                }
                                if (item.Name.ToLower() == "resources.arsc")
                                {
                                    using (Stream strm = zipfile.GetInputStream(item))
                                    {
                                        using (BinaryReader s = new BinaryReader(strm))
                                        {
                                            resourcesData = s.ReadBytes((int)s.BaseStream.Length);
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }
                ApkReader apkReader = new ApkReader();
                ApkInfo   info      = apkReader.extractInfo(manifestData, resourcesData);
                packageNameLBL.Text   = "Package Name: " + info.packageName;
                versionLBL.Text       = "Version: " + info.versionName;
                installAPKBTN.Enabled = true;
            }
        }
Beispiel #12
0
        static void Main(string[] args)
        {
            string APKfilePath        = @"SampleAPK\ApkReaderSample.apk";
            string iconOutputlocation = @"SampleAPK\icons\";

            ApkInfo info = ReadApk.ReadApkFromPath(APKfilePath);

            Directory.CreateDirectory(iconOutputlocation);
            for (var i = 0; i < info.iconFileName.Count; i++)
            {
                ExtractApkFile.ExtractFileAndSave(APKfilePath, info.iconFileName[i], @"SampleAPK\icons\", i);
            }

            Console.ReadKey();
        }
Beispiel #13
0
        public App GetAPKSet(string pathAPK, App apk)
        {
            ApkInfo info = GetAndroidInfo(pathAPK);

            if (info == null)
            {
                return(apk);
            }
            apk.app_name         = info.packageName;
            apk.url_icon         = "http://" + Domen + "/YobiApp" + (pathAPK + info.iconFileName[0]).Substring(CurrentDirectory.Length);
            apk.version          = info.versionName;
            apk.build            = info.targetSdkVersion;
            apk.bundleIdentifier = info.label;
            return(apk);
        }
Beispiel #14
0
 private void LoadedAPKFile(object sender, CancelEventArgs e)
 {
     ApkPath.Text = openApkFile.FileName;
     try
     {
         Info = APKParser.ApkParser.Parse(openApkFile.FileName);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "Can't read apk data");
     }
     AppDetails.Content = $"Title: {Info.Label + Environment.NewLine}" +
                          $"Package Name: {Info.PackageName + Environment.NewLine}" +
                          $"Version: {Info.VersionName + Environment.NewLine}";
 }
Beispiel #15
0
        /// <summary>
        /// 解压并读取icon图片
        /// </summary>
        /// <param name="apkInfo"></param>
        private static void ParseIcon(ref ApkInfo apkInfo)
        {
            if (apkInfo == null ||
                string.IsNullOrEmpty(apkInfo.ApkFilePath) ||
                apkInfo.IconDic == null ||
                apkInfo.IconDic.Count <= 0)
            {
                return;
            }

            string icon = null;
            int    i    = 0;

            // 在多张尺寸的ICON里选择尺寸为240
            foreach (KeyValuePair <string, string> kv in apkInfo.IconDic)
            {
                if (kv.Key.Contains("240"))
                {
                    icon             = kv.Value;
                    apkInfo.IconName = Path.GetFileName(icon);
                    break;
                }
                if (i == apkInfo.IconDic.Count - 1)
                {
                    icon             = kv.Value;
                    apkInfo.IconName = Path.GetFileName(icon);
                    break;
                }
                i++;
            }

            // 指定解压目录
            string unZipPath = PathUtils.GetPath(Constants.DIR_TEMP_ICON);

            // 清空解压目录
            FileUtils.ClearDir(unZipPath);

            // 解压指定的icon图片文件
            ZipUtils.UnZip(apkInfo.ApkFilePath, unZipPath, icon);

            // 读取解压出来的图片文件
            string iconPath = PathUtils.JoinPath(unZipPath, icon);

            apkInfo.Icon = new Bitmap(iconPath);
        }
Beispiel #16
0
        /// <summary>
        /// 读取APK信息
        /// </summary>
        /// <param name="apkFilePath"></param>
        /// <returns></returns>
        public static ApkInfo ReadApkInfo(string apkFilePath)
        {
            if (String.IsNullOrEmpty(apkFilePath))
            {
                return(null);
            }

            string aaptPath  = PathUtils.GetPath(Constants.PATH_AAPT);
            var    startInfo = new ProcessStartInfo(aaptPath);
            string args      = string.Format("dump badging \"{0}\"", apkFilePath);

            startInfo.Arguments              = args;
            startInfo.UseShellExecute        = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.CreateNoWindow         = true;
            startInfo.StandardOutputEncoding = Encoding.UTF8;

            // 读取命令行返回的所有txt文本和字符编码
            List <string> lineLst = new List <string>();

            using (var process = Process.Start(startInfo))
            {
                var sr = process.StandardOutput;
                while (!sr.EndOfStream)
                {
                    lineLst.Add(sr.ReadLine());
                }
                process.WaitForExit();
            }


            ApkInfo apkInfo = new ApkInfo();

            apkInfo.ApkFilePath     = apkFilePath;
            apkInfo.CurrentFileName = Path.GetFileName(apkFilePath);
            apkInfo.AllInfoList     = lineLst;

            // 解析相关的配置参数
            ParseTxtFile(ref apkInfo);
            ParseIcon(ref apkInfo);
            ParseAssetsConfig(ref apkInfo);

            return(apkInfo);
        }
        public JsonResult GetApkInfos()
        {
            var scheme      = Request.Url.Scheme;
            var root        = Request.Url.Authority;
            var currentSUrl = $"{scheme}://{root}";
            var path        = Server.MapPath("~/Apks");

            if (!Directory.Exists(path))
            {
                return(null);
            }

            var           url   = Request.Url;
            DirectoryInfo dinfo = new DirectoryInfo(path);

            FileInfo[] finfos = dinfo.GetFiles();
            var        lstRes = new List <ApkInfo>();

            foreach (var fileInfo in finfos)
            {
                var temp = $"{currentSUrl}/Apks/{fileInfo.Name}";
//                var encry = Des3Util.encrypt("chainway", temp);
                var oModel = new ApkInfo {
                    Id           = Guid.NewGuid().ToString(), Name = fileInfo.Name, Size = $"{fileInfo.Length/1024/1024}mb"
                    , UploadDate = fileInfo.CreationTime.ToShortDateString(), Uri = $"{currentSUrl}/Apks/{fileInfo.Name}"
                };

                lstRes.Add(oModel);
            }


//            for (var i = 0; i < 50; i++)
//            {
//                var oModel = new ApkInfo {Id = Guid.NewGuid().ToString(), Name = "Apk" + i,Size=$"{(i+1)*1024}kb",UploadDate=DateTime.Now.AddHours(5).ToShortDateString(),Uri= Request.Url.ToString() };
//
//                lstRes.Add(oModel);
//            }

//            var total = lstRes.Count;
//            var rows = lstRes.Skip(offset).Take(limit).ToList();
//            return Json(new { total = total, rows = rows }, JsonRequestBehavior.AllowGet);
            return(Json(lstRes, JsonRequestBehavior.AllowGet));
        }
        public static ApkInfo ReadApkFromPath(string path)
        {
            NativeMethods.Log("ReadApkFromPath: " + path);
            byte[] manifestData  = null;
            byte[] resourcesData = null;
            using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(File.OpenRead(path)))
            {
                using (var filestream = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    ICSharpCode.SharpZipLib.Zip.ZipFile  zipfile = new ICSharpCode.SharpZipLib.Zip.ZipFile(filestream);
                    ICSharpCode.SharpZipLib.Zip.ZipEntry item;
                    while ((item = zip.GetNextEntry()) != null)
                    {
                        if (item.Name.ToLower() == "androidmanifest.xml")
                        {
                            manifestData = new byte[50 * 1024];
                            using (Stream strm = zipfile.GetInputStream(item))
                            {
                                strm.Read(manifestData, 0, manifestData.Length);
                            }
                        }
                        if (item.Name.ToLower() == "resources.arsc")
                        {
                            using (Stream strm = zipfile.GetInputStream(item))
                            {
                                using (BinaryReader s = new BinaryReader(strm))
                                {
                                    resourcesData = s.ReadBytes((int)s.BaseStream.Length);
                                }
                            }
                        }
                    }
                }
            }

            ApkReader apkReader = new ApkReader();
            ApkInfo   info      = apkReader.extractInfo(manifestData, resourcesData);

            return(info);
        }
Beispiel #19
0
        private static void RenameApk(string apkPath, string pattern, string directory)
        {
            ApkInfo apkInfo = null;

            try
            {
                apkInfo = ReadApk.ReadApkFromPath(apkPath);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                PrintHelp();
                Environment.Exit(-1);
            }

            pattern = pattern.Replace("|label|", apkInfo.label);
            pattern = pattern.Replace("|application-name|", apkInfo.label);
            pattern = pattern.Replace("|name|", apkInfo.label);
            pattern = pattern.Replace("|version-name|", apkInfo.versionName);
            pattern = pattern.Replace("|version-code|", apkInfo.versionCode);
            pattern = pattern.Replace("|package-name|", apkInfo.packageName);
            foreach (string invalidChar in InvalidChars)
            {
                pattern = pattern.Replace(invalidChar, " ");
            }

            string newApkPath = Path.Combine(directory, pattern);

            try
            {
                File.Move(apkPath, newApkPath);
                Console.Write("{0} => {1}\n", apkPath, newApkPath);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                PrintHelp();
                Environment.Exit(-1);
            }
        }
        /// <summary>
        /// 程序升级地址
        /// </summary>
        /// <param name="apk">程序的名称</param>
        /// <param name="version">程序版本</param>
        public void HqlsAppDn(String apk, String version, String ext)
        {
            ext = ext == null ? "apk" : ext;
            if (Request.ServerVariables["HTTP_USER_AGENT"].IndexOf("MicroMessenger") >= 0)
            {
                Response.ContentType = "text/html";
                String strPath = Server.MapPath("../syapksx.htm");
                Response.WriteFile(strPath);
                Response.End();
            }
            else
            {
                ApkInfo ai = GetNewApk(apk, version, "." + ext);

                if (ai != null)
                {
                    Response.ContentType = "application/octet-stream";
                    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + ai.appname + "\"");
                    Response.BinaryWrite(ai.apk.ToArray());
                }
            }
        }
        public override void getPackage()
        {
            ApkInfo apkInfo = ReadApkFromPath(FileName);

            UsesPermissions = new ArrayList();
            UsesFeatures    = new ArrayList();

            PackageName = apkInfo.packageName;
            VersionCode = apkInfo.versionCode;
            VersionName = apkInfo.versionName;

            Label   = apkInfo.label;
            hasIcon = apkInfo.hasIcon;
            if (apkInfo.iconFileName.Count > 0)
            {
                IconPath = apkInfo.iconFileName[0];
            }
            foreach (string s in apkInfo.Permissions)
            {
                UsesPermissions.Add(s);
            }
        }
Beispiel #22
0
        public override ApkInfo getAPK()
        {
            var apk = new ApkInfo();

            if (msg.Contains(SmallScreen))
            {
                apk.SupportScreens.Add(SmallScreen);
            }
            if (msg.Contains(NormalScreen))
            {
                apk.SupportScreens.Add(NormalScreen);
            }
            if (msg.Contains(LargeScreen))
            {
                apk.SupportScreens.Add(LargeScreen);
            }
            if (msg.Contains(xLargeScreen))
            {
                apk.SupportScreens.Add(xLargeScreen);
            }

            return(apk);
        }
Beispiel #23
0
        static void Main(string[] args)
        {
            Console.WriteLine("Starting Apk Reader ...");

            string RunningPath = AppDomain.CurrentDomain.BaseDirectory;
            string FileName    = string.Format("{0}Resources\\cpu-z-1-26.apk", Path.GetFullPath(Path.Combine(RunningPath, @"..\..\")));

            Console.WriteLine("Test Apk File Path: " + FileName);

            var read = new Apk_Reader();

            Console.WriteLine("File Size: " + read.showFileSize(FileName));
            ApkInfo file_info = read.Get_File_Info(FileName);

            Console.WriteLine("apkName: " + file_info.apkName);
            Console.WriteLine("versionName: " + file_info.versionName);
            Console.WriteLine("packageName: " + file_info.packageName);
            Console.WriteLine("sdkVersion: " + file_info.sdkVersion);
            Console.WriteLine("targetSdkVersion: " + file_info.targetSdkVersion);
            Console.WriteLine("versionCode: " + file_info.versionCode);
            Console.WriteLine("nativeCode: " + file_info.nativeCode);

            Console.ReadKey();
        }
Beispiel #24
0
        //拖放完成时
        private void ApkInfoForm_DragDrop(object sender, DragEventArgs e)
        {
            string apkPath = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();

            if (apkPath.IndexOf(".apk") == -1 && apkPath.IndexOf(".zip") == -1)
            {
                MessageBox.Show("请拖入apk");
                return;
            }

            ApkInfo apk = ReadApk.ReadApkFromPath(apkPath);

            //获取权限
            List <string> Permissions = new List <string>();

            Permissions = apk.Permissions;
            //Permissions = getPermissions(manifestData);



            //读取APK大小等信息
            List <string> listInfo = new List <string>();

            listInfo = getInfo(apkPath);

            if (listInfo.Count != 3)
            {
                return;
            }

            string iconPath = null;

            ////显示应用的LOGO
            Directory.CreateDirectory(strPath);
            for (var i = 0; i < apk.iconFileName.Count; i++)
            {
                iconPath = ExtractApkFile.ExtractFileAndSave(apkPath, apk.iconFileName[i], strPath, i);
            }
            if (iconPath.Length > 0)
            {
                pictureBox.ImageLocation = iconPath;
                pictureBox.SizeMode      = PictureBoxSizeMode.Zoom;
            }


            //名称
            apkName.Text = apk.label;
            //包名
            packageName.Text = apk.packageName;
            //versionCode
            versionCode.Text = apk.versionCode;
            //versionName
            versionCode1.Text = apk.versionName;

            #region MyRegion
            Permission.Items.Clear();

            //Permissions
            for (int i = 0; i < Permissions.Count; i++)
            {
                if (Permissions[i] == "android.permission.ACCESS_CHECKIN_PROPERTIES")
                {
                    Permission.Items.Add("允许读写访问数据库");
                }
                if (Permissions[i] == "android.permission.ACCESS_COARSE_LOCATION")
                {
                    Permission.Items.Add("允许访问CellID或WiFi获取粗略的位置");
                }
                if (Permissions[i] == "android.permission.ACCESS_FINE_LOCATION")
                {
                    Permission.Items.Add("允许访问精良位置(如GPS)");
                }
                if (Permissions[i] == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS")
                {
                    Permission.Items.Add("允许访问额外的位置提供命令");
                }
                if (Permissions[i] == "android.permission.ACCESS_MOCK_LOCATION")
                {
                    Permission.Items.Add("允许创建模拟位置提供用于测试");
                }
                if (Permissions[i] == "android.permission.ACCESS_NETWORK_STATE")
                {
                    Permission.Items.Add("允许访问有关GSM网络信息");
                }
                if (Permissions[i] == "android.permission.ACCESS_SURFACE_FLINGER")
                {
                    Permission.Items.Add("允许使用SurfaceFlinger底层特性");
                }
                if (Permissions[i] == "android.permission.ACCESS_WIFI_STATE")
                {
                    Permission.Items.Add("允许访问Wi-Fi网络状态信息");
                }
                if (Permissions[i] == "android.permission.ADD_SYSTEM_SERVICE")
                {
                    Permission.Items.Add("允许发布系统级服务");
                }
                if (Permissions[i] == "android.permission.BATTERY_STATS")
                {
                    Permission.Items.Add("允许更新手机电池统计信息");
                }
                if (Permissions[i] == "android.permission.BLUETOOTH")
                {
                    Permission.Items.Add("允许连接到已配对的蓝牙设备");
                }
                if (Permissions[i] == "android.permission.BLUETOOTH_ADMIN")
                {
                    Permission.Items.Add("允许发现和配对蓝牙设备");
                }
                if (Permissions[i] == "android.permission.BRICK")
                {
                    Permission.Items.Add("请求能够禁用设备(非常危险)");
                }
                if (Permissions[i] == "android.permission.BROADCAST_PACKAGE_REMOVED")
                {
                    Permission.Items.Add("允许广播消息在程序包移除后");
                }
                if (Permissions[i] == "android.permission.BROADCAST_STICKY")
                {
                    Permission.Items.Add("允许广播常用intents");
                }
                if (Permissions[i] == "android.permission.CALL_PHONE")
                {
                    Permission.Items.Add("允许初始化拨号无需确认");
                }
                if (Permissions[i] == "android.permission.CALL_PRIVILEGED")
                {
                    Permission.Items.Add("允许拨打任何号码");
                }
                if (Permissions[i] == "android.permission.CAMERA")
                {
                    Permission.Items.Add("请求访问使用照相设备");
                }
                if (Permissions[i] == "android.permission.CHANGE_COMPONENT_ENABLED_STATE")
                {
                    Permission.Items.Add("允许是否改变一个组件或其他的启用或禁用");
                }
                if (Permissions[i] == "android.permission.CHANGE_CONFIGURATION")
                {
                    Permission.Items.Add("允许修改当前设置");
                }
                if (Permissions[i] == "android.permission.CHANGE_NETWORK_STATE")
                {
                    Permission.Items.Add("允许改变网络连接状态");
                }
                if (Permissions[i] == "android.permission.CHANGE_WIFI_STATE")
                {
                    Permission.Items.Add("允许改变Wi-Fi连接状态");
                }
                if (Permissions[i] == "android.permission.CLEAR_APP_CACHE")
                {
                    Permission.Items.Add("允许清楚缓存从所有安装的程序在设备中");
                }
                if (Permissions[i] == "android.permission.CLEAR_APP_USER_DATA")
                {
                    Permission.Items.Add("允许清除用户设置");
                }
                if (Permissions[i] == "android.permission.CONTROL_LOCATION_UPDATES")
                {
                    Permission.Items.Add("允许启用禁止位置更新提示从无线模块");
                }
                if (Permissions[i] == "android.permission.DELETE_CACHE_FILES")
                {
                    Permission.Items.Add("允许删除缓存文件");
                }
                if (Permissions[i] == "android.permission.DELETE_PACKAGES")
                {
                    Permission.Items.Add("允许程序删除包");
                }
                if (Permissions[i] == "android.permission.DEVICE_POWER")
                {
                    Permission.Items.Add("允许访问底层电源管理");
                }
                if (Permissions[i] == "android.permission.DIAGNOSTIC")
                {
                    Permission.Items.Add("允许程序RW诊断资源");
                }
                if (Permissions[i] == "android.permission.DISABLE_KEYGUARD")
                {
                    Permission.Items.Add("允许程序禁用键盘锁");
                }
                if (Permissions[i] == "android.permission.DUMP")
                {
                    Permission.Items.Add("允许程序返回状态抓取信息从系统服务");
                }
                if (Permissions[i] == "android.permission.EXPAND_STATUS_BAR")
                {
                    Permission.Items.Add("允许扩展收缩在状态栏");
                }
                if (Permissions[i] == "android.permission.FACTORY_TEST")
                {
                    Permission.Items.Add("作为一个测试程序,运行在root用户");
                }
                if (Permissions[i] == "android.permission.FLASHLIGHT")
                {
                    Permission.Items.Add("访问闪光灯");
                }
                if (Permissions[i] == "android.permission.FORCE_BACK")
                {
                    Permission.Items.Add("允许程序强行一个后退操作");
                }
                if (Permissions[i] == "android.permission.FOTA_UPDATE")
                {
                    Permission.Items.Add("预留权限");
                }
                if (Permissions[i] == "android.permission.GET_ACCOUNTS")
                {
                    Permission.Items.Add("访问帐户列表在Accounts Service中");
                }
                if (Permissions[i] == "android.permission.GET_PACKAGE_SIZE")
                {
                    Permission.Items.Add("允许获取任何package占用空间容量");
                }
                if (Permissions[i] == "android.permission.GET_TASKS")
                {
                    Permission.Items.Add("允许程序获取信息");
                }
                if (Permissions[i] == "android.permission.HARDWARE_TEST")
                {
                    Permission.Items.Add("允许访问硬件");
                }
                if (Permissions[i] == "android.permission.INJECT_EVENTS")
                {
                    Permission.Items.Add("允许截获用户事件");
                }
                if (Permissions[i] == "android.permission.INSTALL_PACKAGES")
                {
                    Permission.Items.Add("允许安装packages");
                }
                if (Permissions[i] == "android.permission.INTERNAL_SYSTEM_WINDOW")
                {
                    Permission.Items.Add("允许打开窗口使用系统用户界面");
                }
                if (Permissions[i] == "android.permission.INTERNET")
                {
                    Permission.Items.Add("允许打开网络套接字");
                }
                if (Permissions[i] == "android.permission.MANAGE_APP_TOKENS")
                {
                    Permission.Items.Add("允许程序管理");
                }
                if (Permissions[i] == "android.permission.MODIFY_AUDIO_SETTINGS")
                {
                    Permission.Items.Add("允许修改全局音频设置");
                }
                if (Permissions[i] == "android.permission.MODIFY_PHONE_STATE")
                {
                    Permission.Items.Add("允许修改话机状态");
                }
                if (Permissions[i] == "android.permission.MOUNT_UNMOUNT_FILESYSTEMS")
                {
                    Permission.Items.Add("允许挂载和反挂载系统可移动存储");
                }
                if (Permissions[i] == "android.permission.READ_CALENDAR")
                {
                    Permission.Items.Add("允许读取用户日历数据");
                }
                if (Permissions[i] == "android.permission.READ_CONTACTS")
                {
                    Permission.Items.Add("允许读取用户联系人数据");
                }
                if (Permissions[i] == "android.permission.READ_INPUT_STATE")
                {
                    Permission.Items.Add("允许返回当前按键状态");
                }
                if (Permissions[i] == "android.permission.READ_LOGS")
                {
                    Permission.Items.Add("允许读取底层系统日志文件");
                }
                if (Permissions[i] == "android.permission.READ_OWNER_DATA")
                {
                    Permission.Items.Add("允许程序读取所有者数据");
                }
                if (Permissions[i] == "android.permission.READ_SMS")
                {
                    Permission.Items.Add("允许读取短信息");
                }
                if (Permissions[i] == "android.permission.READ_SYNC_SETTINGS")
                {
                    Permission.Items.Add("允许读取同步设置");
                }
                if (Permissions[i] == "android.permission.READ_SYNC_STATS")
                {
                    Permission.Items.Add("允许读取同步状态");
                }
                if (Permissions[i] == "android.permission.REBOOT")
                {
                    Permission.Items.Add("请求能够重新启动设备");
                }
                if (Permissions[i] == "android.permission.RECEIVE_MMS")
                {
                    Permission.Items.Add("允许监控将收到MMS彩信");
                }
                if (Permissions[i] == "android.permission.RECEIVE_SMS")
                {
                    Permission.Items.Add("允许监控短信息");
                }
                if (Permissions[i] == "android.permission.RECORD_AUDIO")
                {
                    Permission.Items.Add("允许录制音频");
                }
                if (Permissions[i] == "android.permission.RESTART_PACKAGES")
                {
                    Permission.Items.Add("允许重新启动其他程序");
                }
                if (Permissions[i] == "android.permission.SEND_SMS")
                {
                    Permission.Items.Add("允许发送SMS短信");
                }
                if (Permissions[i] == "android.permission.SET_DEBUG_APP")
                {
                    Permission.Items.Add("配置用于调试");
                }
                if (Permissions[i] == "android.permission.SET_PROCESS_FOREGROUND")
                {
                    Permission.Items.Add("允许当前运行程序强行到前台");
                }
                if (Permissions[i] == "android.permission.SET_TIME_ZONE")
                {
                    Permission.Items.Add("允许设置时间区域");
                }
                if (Permissions[i] == "android.permission.SET_WALLPAPER")
                {
                    Permission.Items.Add("允许设置壁纸");
                }
                if (Permissions[i] == "android.permission.STATUS_BAR")
                {
                    Permission.Items.Add("允许打开、关闭或禁用状态栏及图标");
                }
                if (Permissions[i] == "android.permission.SYSTEM_ALERT_WINDOW")
                {
                    Permission.Items.Add("允许显示在顶层");
                }
                if (Permissions[i] == "android.permission.VIBRATE")
                {
                    Permission.Items.Add("允许访问振动设备");
                }
                if (Permissions[i] == "android.permission.WAKE_LOCK")
                {
                    Permission.Items.Add("保持进程在休眠时从屏幕消失");
                }
                if (Permissions[i] == "android.permission.WRITE_APN_SETTINGS")
                {
                    Permission.Items.Add("允许写入API设置");
                }
                if (Permissions[i] == "android.permission.WRITE_CALENDAR")
                {
                    Permission.Items.Add("允许写入但不读取用户日历数据");
                }
                if (Permissions[i] == "android.permission.WRITE_CONTACTS")
                {
                    Permission.Items.Add("允许写入但不读取用户联系人数据");
                }
                if (Permissions[i] == "android.permission.WRITE_GSERVICES")
                {
                    Permission.Items.Add("允许修改Google服务地图");
                }
                if (Permissions[i] == "android.permission.WRITE_SETTINGS")
                {
                    Permission.Items.Add("允许程序读取或写入系统设置");
                }
                if (Permissions[i] == "android.permission.INTERNET")
                {
                    Permission.Items.Add("允许程序访问网络连接");
                }
                else
                {
                    Permission.Items.Add(Permissions[i]);
                }
            }
            #endregion
            //文件名
            fileName.Text = apkPath;

            //md5
            textMd5.Text = listInfo[2];

            //文件大小
            textSize.Text = listInfo[0] + "字节" + "(" + listInfo[1] + "MB)";


            this.Refresh();

            SetForegroundWindow(this.Handle);
        }
Beispiel #25
0
        public async Task CopyAPKToLocalStorage(StorageFile sf)
        {
            apkName = sf.Name.Replace(".apk", "");

            appsRoot = await localFolder.CreateFolderAsync("Apps", CreationCollisionOption.OpenIfExists);

            localAppRoot = await appsRoot.CreateFolderAsync(apkName, CreationCollisionOption.GenerateUniqueName);

            apkName = localAppRoot.Name;
            StorageFile copiedFile = await sf.CopyAsync(appsRoot, apkName + ".apk");

            apkFile = copiedFile;

            try
            {
                ZipFile.ExtractToDirectory(copiedFile.Path, localAppRoot.Path);

                try
                {
                    StorageFile manifestFile = await localAppRoot.GetFileAsync("AndroidManifest.xml");

                    StorageFile resFile = await localAppRoot.GetFileAsync("resources.arsc");

                    byte[] manifestBytes = await Disassembly.Util.ReadFile(manifestFile);

                    byte[] resBytes = await Disassembly.Util.ReadFile(resFile);

                    ApkReader apkReader = new ApkReader();
                    ApkInfo   appinfo   = apkReader.extractInfo(manifestBytes, resBytes);
                    metadata = appinfo;

                    appIcon = GetAppIcon();

                    InvokeLoadEvent();

                    resFolder = await localAppRoot.GetFolderAsync("res");

                    //manifest = new Manifest(manifestFile);

                    /*if (localAppRoot.GetFileAsync("apktool.yml") != null)
                     * {
                     *  manifest = new Manifest(manifestFile, true);
                     * }
                     * else
                     * {
                     *  manifest = new Manifest(manifestFile);
                     * }*/
                    //manifest = new Manifest(manifestFile);

                    //StorageFile resFile = await localAppRoot.GetFileAsync("resources.arsc");
                    //resources = new Resources(resFile);
                }
                catch (System.IO.FileNotFoundException fnfEx)
                {
                    var dialog = new MessageDialog($"Not a valid APK file. Please try a different APK file. \n\n{fnfEx.Message}");
                    await dialog.ShowAsync();

                    //Provided APK is not valid, purge from app data
                    await localAppRoot.DeleteAsync();

                    await copiedFile.DeleteAsync();

                    //Go home


                    return;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.InnerException);
            }

            //Debug.WriteLine(localAppRoot.Path);

            //StorageFile manifestFile = await localAppRoot.GetFileAsync("AndroidManifest.xml");

            //manifest = new Manifest(manifestFile);
        }
Beispiel #26
0
        public async Task GetAPKInfoFromLocalAppFolder()
        {
            StorageFile manifestFile = await localAppRoot.GetFileAsync("AndroidManifest.old");

            StorageFile resFile = await localAppRoot.GetFileAsync("resources.arsc");

            resFolder = await localAppRoot.GetFolderAsync("res");

            byte[] manifestBytes = await Disassembly.Util.ReadFile(manifestFile);

            byte[] resBytes = await Disassembly.Util.ReadFile(resFile);

            ApkReader apkReader = new ApkReader();
            ApkInfo   appinfo   = apkReader.extractInfo(manifestBytes, resBytes);

            metadata = appinfo;

            appIcon = GetAppIcon();

            //dexNet
            dexWriter = new EnhancedDexWriter();
            //dexWriter = new PlainDexWriter();
            StorageFile dexFile = await localAppRoot.GetFileAsync("classes.dex");

            byte[] dexBytes = await Disassembly.Util.ReadFile(dexFile);

            MemoryStream dexStream = new MemoryStream(dexBytes);

            dex           = new Dex(dexStream);
            dexWriter.dex = dex;

            //dexWriter.dex.GetMethod().
            var methods = dexWriter.dex.GetClasses();

            foreach (Class m in methods)
            {
                Debug.WriteLine(m.ToString());
                if (m.Name.Equals("com.example.ticom.myapp.MainActivity") || m.Name.Equals("com.example.ticom.myapp.MainActivity$1") || m.Name.StartsWith("com.example.ticom.myapp.R"))
                {
                    TextWriter tw = new StringWriter();
                    dexWriter.WriteOutClass(m, ClassDisplayOptions.Fields, tw);
                    Debug.WriteLine(tw.ToString());

                    foreach (Field f in m.GetFields())
                    {
                        Debug.WriteLine(f.ToString());
                    }

                    var meths = m.GetMethods();
                    foreach (Method x in meths)
                    {
                        //Debug.WriteLine(x.ToString());
                        Debug.WriteLine(dexWriter.WriteOutMethod(m, x, new Indentation()));
                        if (x.Name.Equals("onCreate") || x.Name.Equals("<init>"))
                        {
                            var opcodes = x.GetInstructions();
                            foreach (OpCode o in opcodes)
                            {
                                string opCodeString = o.ToString();
                                Debug.WriteLine(opCodeString);
                                if (opCodeString.Contains("meth@"))
                                {
                                    int    pos    = opCodeString.IndexOf("meth@");
                                    string methId = opCodeString.Substring(pos + 5);
                                    uint   id     = uint.Parse(methId);
                                    Method mx     = dexWriter.dex.GetMethod(id);
                                    Debug.WriteLine("meth name: " + mx.Name + "\n");
                                }
                                else if (opCodeString.Contains("type@"))
                                {
                                    int    pos    = opCodeString.IndexOf("type@");
                                    string methId = opCodeString.Substring(pos + 5);
                                    uint   id     = uint.Parse(methId);
                                    string mx     = dexWriter.dex.GetTypeName(id);
                                    Debug.WriteLine("type name: " + mx + "\n");
                                }
                                else if (opCodeString.Contains("field@"))
                                {
                                    int    pos    = opCodeString.IndexOf("field@");
                                    string methId = opCodeString.Substring(pos + 6);
                                    uint   id     = uint.Parse(methId);
                                    Field  mx     = dexWriter.dex.GetField(id);
                                    Debug.WriteLine("field info: " + mx.ToString() + "\n");
                                }
                                //Debug.WriteLine("instruction: " + o.ToString() + "\n");
                            }
                        }
                    }
                }
            }

            //context = new AstoriaContext();
        }
Beispiel #27
0
        public static ApkInfo ReadApkFromPath(string path)
        {
            byte[] manifestData  = null;
            byte[] resourcesData = null;

            var manifest  = "AndroidManifest.xml";
            var resources = "resources.arsc";

            //读取apk,通过解压的方式读取
            using (var zip = ZipFile.Read(path))
            {
                using (Stream zipstream = zip[manifest].OpenReader())
                {
                    //将解压出来的文件保存到一个路径(必须这样)
                    using (var fileStream = File.Create(manifest, (int)zipstream.Length))
                    {
                        manifestData = new byte[zipstream.Length];
                        zipstream.Read(manifestData, 0, manifestData.Length);
                        fileStream.Write(manifestData, 0, manifestData.Length);
                    }
                }
                using (Stream zipstream = zip[resources].OpenReader())
                {
                    //将解压出来的文件保存到一个路径(必须这样)
                    using (var fileStream = File.Create(resources, (int)zipstream.Length))
                    {
                        resourcesData = new byte[zipstream.Length];
                        zipstream.Read(resourcesData, 0, resourcesData.Length);
                        fileStream.Write(resourcesData, 0, resourcesData.Length);
                    }
                }
            }


            ApkReader apkReader = new ApkReader();
            ApkInfo   info      = apkReader.extractInfo(manifestData, resourcesData);

            Console.WriteLine(string.Format("Package Name: {0}", info.packageName));
            Console.WriteLine(string.Format("Version Name: {0}", info.versionName));
            Console.WriteLine(string.Format("Version Code: {0}", info.versionCode));

            Console.WriteLine(string.Format("App Has Icon: {0}", info.hasIcon));
            if (info.iconFileName.Count > 0)
            {
                Console.WriteLine(string.Format("App Icon: {0}", info.iconFileName[0]));
            }
            Console.WriteLine(string.Format("Min SDK Version: {0}", info.minSdkVersion));
            Console.WriteLine(string.Format("Target SDK Version: {0}", info.targetSdkVersion));

            if (info.Permissions != null && info.Permissions.Count > 0)
            {
                Console.WriteLine("Permissions:");
                info.Permissions.ForEach(f =>
                {
                    Console.WriteLine(string.Format("   {0}", f));
                });
            }
            else
            {
                Console.WriteLine("No Permissions Found");
            }

            Console.WriteLine(string.Format("Supports Any Density: {0}", info.supportAnyDensity));
            Console.WriteLine(string.Format("Supports Large Screens: {0}", info.supportLargeScreens));
            Console.WriteLine(string.Format("Supports Normal Screens: {0}", info.supportNormalScreens));
            Console.WriteLine(string.Format("Supports Small Screens: {0}", info.supportSmallScreens));
            return(info);
        }
Beispiel #28
0
        /// <summary>
        /// 解析TXT文件
        /// </summary>
        /// <param name="apkInfo"></param>
        private static void ParseTxtFile(ref ApkInfo apkInfo)
        {
            if (apkInfo == null)
            {
                return;
            }

            string s;

            // 遍历解析各行
            foreach (string line in apkInfo.AllInfoList)
            {
                if (string.IsNullOrEmpty(line))
                {
                    continue;
                }

                // 游戏名称
                if (line.StartsWith("application-label:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    apkInfo.AppName = ss[1].Trim(new char[] { '\'' });
                    continue;
                }

                //package: name='com.test.sdk' versionCode='1' versionName='1.0.0' platformBuildVersionName='6.0-2438415'
                if (line.Contains("package: name=") && line.Contains("versionCode=") && line.Contains("versionName="))
                {
                    //string[] ss = info.Split(new char[]{' '});
                    string[] ss = Regex.Split(line, "\\s+", RegexOptions.IgnoreCase);
                    if (ss == null || ss.Length < 4)
                    {
                        continue;
                    }

                    // 包名
                    string[] pp = ss[1].Split(new char[] { '=' });
                    if (pp == null || pp.Length < 2)
                    {
                        continue;
                    }
                    apkInfo.PackageName = pp[1].Trim(new char[] { '\'' });

                    // 版本号
                    pp = ss[2].Split(new char[] { '=' });
                    if (pp == null || pp.Length < 2)
                    {
                        continue;
                    }
                    apkInfo.VersionCode = pp[1].Trim(new char[] { '\'' });

                    // 版本名称
                    pp = ss[3].Split(new char[] { '=' });
                    if (pp == null || pp.Length < 2)
                    {
                        continue;
                    }
                    apkInfo.VersionName = pp[1].Trim(new char[] { '\'' });

                    continue;
                }

                // 最小SDK版本号
                if (line.StartsWith("sdkVersion:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    apkInfo.MinSdkVersion = ss[1].Trim(new char[] { '\'' });
                    continue;
                }

                // 最大SDK版本号
                if (line.StartsWith("maxSdkVersion:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    apkInfo.MaxSdkVersion = ss[1].Trim(new char[] { '\'' });
                    continue;
                }

                // 目标版本号
                if (line.StartsWith("targetSdkVersion:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    apkInfo.TargetSdkVersion = ss[1].Trim(new char[] { '\'' });
                    continue;
                }


                if (line.StartsWith("densities:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    apkInfo.Densities = ss[1].Replace('\'', ' ').Trim();
                    continue;
                }

                if (line.StartsWith("supports-screens:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    apkInfo.SupportsScreens = ss[1].Replace('\'', ' ').Trim();
                    continue;
                }

                if (line.StartsWith("uses-permission:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    if (!string.IsNullOrEmpty(apkInfo.UsesPermission))
                    {
                        apkInfo.UsesPermission += "\r\n";
                    }
                    apkInfo.UsesPermission += ss[1].Replace('\'', ' ');
                    continue;
                }


                if (line.StartsWith("uses-feature:"))
                {
                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    if (!string.IsNullOrEmpty(apkInfo.UsesFeature))
                    {
                        apkInfo.UsesFeature += "\r\n";
                    }
                    apkInfo.UsesFeature += ss[1].Replace('\'', ' ');
                    continue;
                }

                // icon文件集合
                //application-icon-120:'res/drawable-ldpi-v4/ic_launcher.png'
                //application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png'
                //application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png'
                //application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png'
                //application-icon-480:'res/drawable-xxhdpi/ic_launcher.png'
                //application-icon-640:'res/drawable-xxxhdpi/ic_launcher.png'
                if (line.StartsWith("application-icon"))
                {
                    if (apkInfo.IconDic == null)
                    {
                        apkInfo.IconDic = new Dictionary <string, string>();
                    }

                    string[] ss = line.Split(new char[] { ':' });
                    if (ss == null || ss.Length <= 1)
                    {
                        continue;
                    }
                    if (!apkInfo.IconDic.ContainsKey(ss[0]))
                    {
                        apkInfo.IconDic.Add(ss[0], ss[1].Trim(new char[] { '\'' }));
                    }
                    continue;
                }
            }
        }
Beispiel #29
0
        /// <summary>
        /// 根据用户配置读取assets目录下的文件参数
        /// </summary>
        /// <param name="apkInfo"></param>
        private static void ParseAssetsConfig(ref ApkInfo apkInfo)
        {
            if (apkInfo == null || string.IsNullOrEmpty(apkInfo.ApkFilePath))
            {
                return;
            }

            List <AssetsConfig> configList = ConfigUtils.ReadUserConfig();

            if (configList == null || configList.Count <= 0)
            {
                return;
            }

            StringBuilder sb = new StringBuilder();

            // 根据用户配置,遍历解压指定文件,并根据配置读取指定参数
            foreach (AssetsConfig config in configList)
            {
                if (string.IsNullOrEmpty(config.FileName))
                {
                    continue;
                }

                // 指定解压目录
                string unZipPath = PathUtils.GetPath(Constants.DIR_TEMP_ASSETS);
                // 清空解压目录
                FileUtils.ClearDir(unZipPath);

                // 解压指定的文件
                ZipUtils.UnZip(apkInfo.ApkFilePath, unZipPath, "assets/" + config.FileName);
                // 读取解压出来的文件
                string configFilePath = PathUtils.JoinPath(unZipPath, "assets/" + config.FileName);

                if (!File.Exists(configFilePath) || !FileUtils.HasContent(configFilePath))
                {
                    sb.AppendLine(config.FileName + "文件读取失败");
                    continue;
                }


                // 以下是读取配置文件中指定的参数

                // 用户没有配置读取指定参数时,表示读取整个配置文件
                List <string> keyList = CommonUtils.ToList(config.Keys);
                if (keyList == null)
                {
                    sb.AppendLine(File.ReadAllText(configFilePath));
                    continue;
                }

                // 用户配置读取指定参数
                Dictionary <string, bool> keyDic = new Dictionary <string, bool>();
                foreach (string key in keyList)
                {
                    if (keyDic.ContainsKey(key))
                    {
                        continue;
                    }
                    keyDic.Add(key, true);// 将参数放置到字典里,true表示未找到参数,false表示未找到参数
                }

                string[] lines = File.ReadAllLines(configFilePath);
                foreach (string line in lines)
                {
                    if (string.IsNullOrEmpty(line))
                    {
                        continue;
                    }

                    string[] ss = line.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                    if (ss != null && ss.Length > 0 && keyDic.ContainsKey(ss[0]))
                    {
                        sb.AppendLine(line);
                        keyDic[ss[0]] = false;// 已找到参数
                    }
                }

                // 如果参数未找到则提示
                foreach (KeyValuePair <string, bool> kv in keyDic)
                {
                    if (kv.Value)
                    {
                        sb.AppendLine(kv.Key + "参数未找到");
                    }
                }
            }

            apkInfo.AssetsConfig = sb.ToString();
        }
Beispiel #30
0
        public static ApkInfo ReadApkFromPath(string path)
        {
            byte[] manifestData  = null;
            byte[] resourcesData = null;
            using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(File.OpenRead(path)))
            {
                using (var filestream = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    ICSharpCode.SharpZipLib.Zip.ZipFile  zipfile = new ICSharpCode.SharpZipLib.Zip.ZipFile(filestream);
                    ICSharpCode.SharpZipLib.Zip.ZipEntry item;
                    while ((item = zip.GetNextEntry()) != null)
                    {
                        if (item.Name.ToLower() == "androidmanifest.xml")
                        {
                            manifestData = new byte[50 * 1024];
                            using (Stream strm = zipfile.GetInputStream(item))
                            {
                                strm.Read(manifestData, 0, manifestData.Length);
                            }
                        }
                        if (item.Name.ToLower() == "resources.arsc")
                        {
                            using (Stream strm = zipfile.GetInputStream(item))
                            {
                                using (BinaryReader s = new BinaryReader(strm))
                                {
                                    resourcesData = s.ReadBytes((int)s.BaseStream.Length);
                                }
                            }
                        }
                    }
                }
            }

            ApkReader apkReader = new ApkReader();
            ApkInfo   info      = apkReader.extractInfo(manifestData, resourcesData);

            //Console.WriteLine(string.Format("Package Name: {0}", info.packageName));
            //Console.WriteLine(string.Format("Version Name: {0}", info.versionName));
            //Console.WriteLine(string.Format("Version Code: {0}", info.versionCode));

            //Console.WriteLine(string.Format("App Has Icon: {0}", info.hasIcon));
            //if (info.iconFileName.Count > 0)
            //    Console.WriteLine(string.Format("App Icon: {0}", info.iconFileName[0]));
            //Console.WriteLine(string.Format("Min SDK Version: {0}", info.minSdkVersion));
            //Console.WriteLine(string.Format("Target SDK Version: {0}", info.targetSdkVersion));

            //if (info.Permissions != null && info.Permissions.Count > 0)
            //{
            //    Console.WriteLine("Permissions:");
            //    info.Permissions.ForEach(f =>
            //    {
            //        Console.WriteLine(string.Format("   {0}", f));
            //    });
            //}
            //else
            //    Console.WriteLine("No Permissions Found");

            //Console.WriteLine(string.Format("Supports Any Density: {0}", info.supportAnyDensity));
            //Console.WriteLine(string.Format("Supports Large Screens: {0}", info.supportLargeScreens));
            //Console.WriteLine(string.Format("Supports Normal Screens: {0}", info.supportNormalScreens));
            //Console.WriteLine(string.Format("Supports Small Screens: {0}", info.supportSmallScreens));
            return(info);
        }