打开nuget 搜索两个包
其中 SharpZipLib用来 解压读取 apk 的文件,
androidxmldotnet 用来解析加密的 apk包里的文件
示例代码如下
static string path = System.Environment.CurrentDirectory + @"\Youku_V7.6.10.0325.0001_ab235fdcb823d83f.apk";
static void Main(string[] args)
{
GetApkInfo3();
Console.WriteLine("end");
Console.Read();
}
static void GetApkInfo3()
{
byte[] manifestData = null;
using (var filestream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
ICSharpCode.SharpZipLib.Zip.ZipFile zipfile = new ICSharpCode.SharpZipLib.Zip.ZipFile(filestream);
foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry item in zipfile)
{
if (item.Name.ToLower() == "androidmanifest.xml")
{
using (Stream strm = zipfile.GetInputStream(item))
{
using (BinaryReader s = new BinaryReader(strm))
{
manifestData = s.ReadBytes((int)item.Size);
}
}
break;
}
}
}
#region 读取文件内容
using (var stream = new MemoryStream(manifestData))
{
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
#region 打印内容
StringBuilder builder = new StringBuilder();
foreach (var androidInfo in androidInfos)
{
//只打印需要的信息
if (androidInfo.Name == "manifest")
{
#region 拼接信息字符串
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");
#endregion
break;
}
}
Console.WriteLine(builder.ToString());
#endregion
}
封装下代码
using AndroidXml;
using System.Collections.Generic;
using System.IO;
using System.Xml;
namespace Library.ApkInfo
{
public static class ApkHelper
{
public static List<AndroidInfo> GetManifestInfo(Stream filestream)
{
List<AndroidInfo> androidInfos = new List<AndroidInfo>();
byte[] manifestData = null;
ICSharpCode.SharpZipLib.Zip.ZipFile zipfile = new ICSharpCode.SharpZipLib.Zip.ZipFile(filestream);
foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry item in zipfile)
{
if (item.Name.ToLower() == "androidmanifest.xml")
{
using (Stream strm = zipfile.GetInputStream(item))
{
using (BinaryReader s = new BinaryReader(strm))
{
manifestData = s.ReadBytes((int)item.Size);
}
}
break;
}
}
#region 读取文件内容
using (var stream = new MemoryStream(manifestData))
{
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
return androidInfos;
}
}
/// <summary>
/// android应用程序信息
/// </summary>
public class AndroidInfo
{
/// <summary>
/// 节点名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 节点属性集合
/// </summary>
public List<AndroidSetting> Settings { get; set; }
}
/// <summary>
/// 节点属性
/// </summary>
public class AndroidSetting
{
public string Name { get; set; }
public string Value { get; set; }
}
}