昨天遇到一個問題,需要通過c#讀取apk包的資訊。baidu,google了一大堆東西,也沒有找到相關的資料,有的也只是通過kvm把jar轉換為.net程式集來調用,試了一下,各種不穩定,各種錯誤。
在大概11點半的時候,終於在codeplex上面找到一個http://androidxmldotnet.codeplex.com/ 項目,可以解析AndroidManifest.xml。
具體代碼如下
using AndroidXml;using Ionic.Zip;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;namespace APKRead{ class NamespaceInfo { public string Prefix { get; set; } public string Uri { get; set; } } class Program { static List<AndroidInfo> androidInfos = new List<AndroidInfo>(); static void Main(string[] args) { //要分析的檔案名稱 var manifest = "AndroidManifest.xml"; //讀取apk,通過解壓的方式讀取 using (var zip = ZipFile.Read("News.apk")) { using (Stream zipstream = zip[manifest].OpenReader()) { //將解壓出來的檔案儲存到一個路徑(必須這樣) using (var fileStream = File.Create(manifest, (int)zipstream.Length)) { // Initialize the bytes array with the stream length and then fill it with data byte[] bytesInStream = new byte[zipstream.Length]; zipstream.Read(bytesInStream, 0, bytesInStream.Length); // Use write method to write to the file specified above fileStream.Write(bytesInStream, 0, bytesInStream.Length); } } } //讀取解壓檔案的位元組數 byte[] data = File.ReadAllBytes(manifest); if (data.Length == 0) { throw new IOException("Empty file"); } #region 讀取檔案內容 using (var stream = new MemoryStream(data)) { var reader = new AndroidXmlReader(stream); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: { AndroidInfo info = new AndroidInfo(); androidInfos.Add(info); info.Name = reader.Name; info.Settings = new List<AndroidSetting>(); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); AndroidSetting setting = new AndroidSetting() { Name = reader.Name, Value = reader.Value }; info.Settings.Add(setting); } reader.MoveToElement(); break; } } } } #endregion File.Delete(manifest); StringBuilder builder = new StringBuilder(); foreach (var androidInfo in androidInfos) { builder.Append(string.Format("{0}:",androidInfo.Name)); foreach (var setting in androidInfo.Settings) { builder.Append("{"); builder.Append(string.Format("'{0}':'{1}'",setting.Name,setting.Value)); builder.Append("},"); } builder.Append("\n\n"); } Console.WriteLine(builder.ToString()); } } /// <summary> /// android應用程式資訊 /// </summary> public class AndroidInfo { public string Name { get; set; } public List<AndroidSetting> Settings { get; set; } } /// <summary> /// 設定 /// </summary> public class AndroidSetting { public string Name { get; set; } public string Value { get; set; } }}
引用的Ionic.Zip庫可以直接通過 nuget下載。
快12點的時候,終於好了,然後睡覺去了。