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);报错

参考技术A C#通过调用aapt获取apk文件的包名等信息
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的基本信息的主要内容,如果未能解决你的问题,请参考以下文章

PHP获取APK的包信息

APK两个包文件对比

在 Android 中获取拆分 APK 信息

如何获取 .apk 文件详细信息(如:名称、id、vercode ..etc)存储在 android 设备的外部存储中

如何获取apk的签名信息?

java怎样获取apk文件icon图标