C#中,上传apk时,怎样获取apk的基本信息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中,上传apk时,怎样获取apk的基本信息相关的知识,希望对你有一定的参考价值。
安卓的APK么?
安卓的APK是个压缩包格式,我给你个思路 具体代码你去写 还是比较简单的
分为两步:①上传按钮点击时解压APK压缩包
②获取压缩包内androidManifest.xml(apk的包名,版本号,版本名称都在此XML文件内)
③解析这个XML
既然答了 我就完善一下:(在codeplex上面找到的)
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下载。追问
using AndroidXml;
在哪下载啊,我下载下来是错的
var reader = new AndroidXmlReader(stream);报错
http://www.sum16.com/desinger/c-sharp-read-package-name-by-aapt.html
如何获取 .apk 文件详细信息(如:名称、id、vercode ..etc)存储在 android 设备的外部存储中
【中文标题】如何获取 .apk 文件详细信息(如:名称、id、vercode ..etc)存储在 android 设备的外部存储中【英文标题】:How to get .apk files details (like: name, id, vercode ..etc) stored in external storage of android device 【发布时间】:2015-04-28 11:59:00 【问题描述】:我怎样才能获得 .apk 文件 详细信息(如:名称、包名、vercode ..etc)存储在目录(如:/storage/emulated/0/downloads)中,即使它们未安装在设备上。
例如,1mobile market 可以将所有 .apk 文件存储在您的设备中并要求您安装它们。
如屏幕截图所示,那些未安装在我的设备上但市场可以加载图标、名称、版本和大小的应用程序。怎么样?!
【问题讨论】:
【参考方案1】:您可以使用包管理器获取 apk 文件的详细信息:
只需查看以下文档链接:here
public PackageInfo getPackageArchiveInfo (String archiveFilePath, int flags)
【讨论】:
准确而简短的回答,非常好。【参考方案2】:实际上 apk 文件是zip archives
,你可以将文件重命名为yourAppName.apk.zip
并使用任何 zip 实用程序(例如 7zip)解压。
androidmanifest.xml
文件和资源将被提取,然后您将找到所有这些信息...
注意:源代码不在包中 - 只是编译后的 .dex 文件(“Dalvik Executable”)
【讨论】:
【参考方案3】:apk 文件实际上只是一个具有不同名称的 zip 存档。将 x.apk
重命名为 x.zip
,其中 x 是文件名,您可以使用任何 zip 工具打开它。这实际上取决于您是否可以在apk文件中找到它的信息。我可以说您可以访问AndroidManifest.xml
文件,其中以相当可读的形式存储了有关应用程序访问权限等的关键信息。
【讨论】:
AndroidManifest.xml
被压缩/加密,不像你说的那样可读【参考方案4】:
您可以使用“aapt dump badging”,它会为您提供应用程序详细信息
Process p;
try
p = Runtime.getRuntime().exec(aapt dump badging <APK_FILE NAME>);
p.waitFor();
final BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null)
output.append(line);
break;
logger.info("Output : " + output);
catch (final Exception e)
e.printStackTrace();
final String[] outputSplit = output.toString().split("'");
for (int i = 0; i < outputSplit.length; i++)
switch (i)
case 1:
packagename = outputSplit[i];
logger.info("Package : " + packagename);
break;
case 3:
mversionId = outputSplit[i];
logger.info("Version Code : " + mversionId);
break;
case 5:
versionId = outputSplit[i];
logger.info("Version Name : " + versionId);
break;
它会起作用的。
【讨论】:
【参考方案5】:他们只是在解析 google play 商店页面的详细信息。
【讨论】:
以上是关于C#中,上传apk时,怎样获取apk的基本信息的主要内容,如果未能解决你的问题,请参考以下文章