using AndroidXml; using ICSharpCode.SharpZipLib.Zip; using LJLib.Tools.Helper; using System.IO; using System.Xml; namespace LJLib { public class APKHelper { public string GetVersionName(string apkPath) { using (var fs = new FileStream(apkPath, FileMode.Open, FileAccess.Read)) { return GetVersionName(fs); } } public string GetVersionName(byte[] apkbytes) { using (var fs = new MemoryStream(apkbytes)) { return GetVersionName(fs); } } public string GetVersionName(Stream apkStream) { byte[] xmlbytes; using (var zipfile = new ZipFile(apkStream)) { var item = zipfile.GetEntry("AndroidManifest.xml"); using (var ms = new MemoryStream()) using (var strm = zipfile.GetInputStream(item)) { StreamHelper.StreamCopy(ms, strm); xmlbytes = ms.ToArray(); } } using (var ms = new MemoryStream(xmlbytes)) { XmlReader reader; if (xmlbytes[0] == '<' || char.IsWhiteSpace((char) xmlbytes[0])) { // Normal XML file reader = new XmlTextReader(ms) { WhitespaceHandling = WhitespaceHandling.None }; } else { // Android binary XML reader = new AndroidXmlReader(ms); } using (reader) while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name.ToLower() == "manifest") { for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); if (reader.LocalName.ToLower() == "versionname") { return reader.Value; } } reader.MoveToElement(); } } return string.Empty; } } } }