APKHelper.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using AndroidXml;
  2. using ICSharpCode.SharpZipLib.Zip;
  3. using LJLib.Tools.Helper;
  4. using System.IO;
  5. using System.Xml;
  6. namespace LJLib
  7. {
  8. public class APKHelper
  9. {
  10. public string GetVersionName(string apkPath)
  11. {
  12. using (var fs = new FileStream(apkPath, FileMode.Open, FileAccess.Read))
  13. {
  14. return GetVersionName(fs);
  15. }
  16. }
  17. public string GetVersionName(byte[] apkbytes)
  18. {
  19. using (var fs = new MemoryStream(apkbytes))
  20. {
  21. return GetVersionName(fs);
  22. }
  23. }
  24. public string GetVersionName(Stream apkStream)
  25. {
  26. byte[] xmlbytes;
  27. using (var zipfile = new ZipFile(apkStream))
  28. {
  29. var item = zipfile.GetEntry("AndroidManifest.xml");
  30. using (var ms = new MemoryStream())
  31. using (var strm = zipfile.GetInputStream(item))
  32. {
  33. StreamHelper.StreamCopy(ms, strm);
  34. xmlbytes = ms.ToArray();
  35. }
  36. }
  37. using (var ms = new MemoryStream(xmlbytes))
  38. {
  39. XmlReader reader;
  40. if (xmlbytes[0] == '<' || char.IsWhiteSpace((char) xmlbytes[0]))
  41. {
  42. // Normal XML file
  43. reader = new XmlTextReader(ms)
  44. {
  45. WhitespaceHandling = WhitespaceHandling.None
  46. };
  47. }
  48. else
  49. {
  50. // Android binary XML
  51. reader = new AndroidXmlReader(ms);
  52. }
  53. using (reader)
  54. while (reader.Read())
  55. {
  56. if (reader.NodeType == XmlNodeType.Element && reader.Name.ToLower() == "manifest")
  57. {
  58. for (int i = 0; i < reader.AttributeCount; i++)
  59. {
  60. reader.MoveToAttribute(i);
  61. if (reader.LocalName.ToLower() == "versionname")
  62. {
  63. return reader.Value;
  64. }
  65. }
  66. reader.MoveToElement();
  67. }
  68. }
  69. return string.Empty;
  70. }
  71. }
  72. }
  73. }