完整版java读取apk、ipa包名、版本名、版本号等信息

有时候,我们上传apk或者是ipa文件的时候,是需要读取到里面的一些信息的,比如软件的包名,以及其版本信息等。在网上搜索了一下资料 , 找了很多版本,对于apk文件的版本号,一直读取不到,在这里,笔者自己总结了,读取apk、ipa文件的一些代码,大家可以参考下,去其糟粕,取其精华。以便适用于自己的需求。

下面会提供源码给大家,我用的开发工具是eclipse,直接导入就可以,jar包也是我已经下载好的,大家可以免积分拿去。本来里面是有2个apk、2个ipa文件提供测试的,但是由于文件太大,上传不了源码,所以就删除了一个最大的ipa包

apk jar包地址:java解析apk所需jar包下载

ipa jar包地址:java解析ipa所需jar包下载

首先看一下我的项目目录

下面请看代码

package com.zsl.cn;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

import org.apkinfo.api.util.AXmlResourceParser;
import org.apkinfo.api.util.TypedValue;
import org.apkinfo.api.util.XmlPullParser;

import com.dd.plist.NSDictionary;
import com.dd.plist.NSString;
import com.dd.plist.PropertyListParser;
/**
 *
 * @author ZSL
 *
 */
public final class ReadUtil {
    /**
     * 读取apk
     * @param apkUrl
     * @return
     */
    public static Map<String,Object> readAPK(String apkUrl){
        ZipFile zipFile;
        Map<String,Object> map = new HashMap<String, Object>();
        try {
            zipFile = new ZipFile(apkUrl);
            Enumeration<?> enumeration = zipFile.entries();
            ZipEntry zipEntry = null;
            while (enumeration.hasMoreElements()) {
                zipEntry = (ZipEntry) enumeration.nextElement();
                if (zipEntry.isDirectory()) {

                } else {
                    if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) {
                        AXmlResourceParser parser = new AXmlResourceParser();
                        parser.open(zipFile.getInputStream(zipEntry));
                        while (true) {
                            int type = parser.next();
                            if (type == XmlPullParser.END_DOCUMENT) {
                                break;
                            }
                            String name = parser.getName();
                            if(null != name && name.toLowerCase().equals("manifest")){
                                for (int i = 0; i != parser.getAttributeCount(); i++) {
                                    if ("versionName".equals(parser.getAttributeName(i))) {
                                        String versionName = getAttributeValue(parser, i);
                                        if(null == versionName){
                                            versionName = "";
                                        }
                                        map.put("versionName", versionName);
                                    } else if ("package".equals(parser.getAttributeName(i))) {
                                        String packageName = getAttributeValue(parser, i);
                                        if(null == packageName){
                                            packageName = "";
                                        }
                                        map.put("package", packageName);
                                    } else if("versionCode".equals(parser.getAttributeName(i))){
                                        String versionCode = getAttributeValue(parser, i);
                                        if(null == versionCode){
                                            versionCode = "";
                                        }
                                        map.put("versionCode", versionCode);
                                    }
                                }
                                break;
                            }
                        }
                    }

                }
            }
            zipFile.close();
        } catch (Exception e) {
            map.put("code", "fail");
            map.put("error","读取apk失败");
        }
        return map;
    }

    private static String getAttributeValue(AXmlResourceParser parser, int index) {
        int type = parser.getAttributeValueType(index);
        int data = parser.getAttributeValueData(index);
        if (type == TypedValue.TYPE_STRING) {
            return parser.getAttributeValue(index);
        }
        if (type == TypedValue.TYPE_ATTRIBUTE) {
            return String.format("?%s%08X", getPackage(data), data);
        }
        if (type == TypedValue.TYPE_REFERENCE) {
            return String.format("@%s%08X", getPackage(data), data);
        }
        if (type == TypedValue.TYPE_FLOAT) {
            return String.valueOf(Float.intBitsToFloat(data));
        }
        if (type == TypedValue.TYPE_INT_HEX) {
            return String.format("0x%08X", data);
        }
        if (type == TypedValue.TYPE_INT_BOOLEAN) {
            return data != 0 ? "true" : "false";
        }
        if (type == TypedValue.TYPE_DIMENSION) {
            return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
        }
        if (type == TypedValue.TYPE_FRACTION) {
            return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
        }
        if (type >= TypedValue.TYPE_FIRST_COLOR_INT && type <= TypedValue.TYPE_LAST_COLOR_INT) {
            return String.format("#%08X", data);
        }
        if (type >= TypedValue.TYPE_FIRST_INT && type <= TypedValue.TYPE_LAST_INT) {
            return String.valueOf(data);
        }
        return String.format("<0x%X, type 0x%02X>", data, type);
    }

    private static String getPackage(int id) {
        if (id >>> 24 == 1) {
            return "android:";
        }
        return "";
    }

    // ///////////////////////////////// ILLEGAL STUFF, DONT LOOK :)
    public static float complexToFloat(int complex) {
        return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3];
    }

    private static final float RADIX_MULTS[] =
    {
         0.00390625F, 3.051758E-005F,
         1.192093E-007F, 4.656613E-010F
     };
    private static final String DIMENSION_UNITS[] = { "px", "dip", "sp", "pt", "in", "mm", "", "" };
    private static final String FRACTION_UNITS[] = { "%", "%p", "", "", "", "", "", "" };

    /**
     * 读取ipa
     */
    public static Map<String,Object> readIPA(String ipaURL){
        Map<String,Object> map = new HashMap<String,Object>();
        try {
            File file = new File(ipaURL);
            InputStream is = new FileInputStream(file);
            ZipInputStream zipIns = new ZipInputStream(is);
            ZipEntry ze;
            InputStream infoIs = null;
            while ((ze = zipIns.getNextEntry()) != null) {
                if (!ze.isDirectory()) {
                    String name = ze.getName();
                    if (null != name &&
                     name.toLowerCase().contains("info.plist")) {
                        ByteArrayOutputStream _copy = new
                                    ByteArrayOutputStream();
                        int chunk = 0;
                        byte[] data = new byte[1024];
                        while(-1!=(chunk=zipIns.read(data))){
                            _copy.write(data, 0, chunk);
                        }
                        infoIs = new
                    ByteArrayInputStream(_copy.toByteArray());
                        break;
                    }
                }
            }

                NSDictionary rootDict = (NSDictionary)
                             PropertyListParser.parse(infoIs);
            ////////////////////////////////////////////////////////////////
            //如果想要查看有哪些key ,可以把下面注释放开
//            for (String keyName : rootDict.allKeys()) {
//              System.out.println(keyName + ":" + rootDict.get(keyName).toString());
//            }

            // 应用包名
            NSString parameters = (NSString) rootDict.get("CFBundleIdentifier");
            map.put("package", parameters.toString());
            // 应用版本名
            parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
            map.put("versionName", parameters.toString());
            //应用版本号
            parameters = (NSString) rootDict.get("CFBundleVersion");
            map.put("versionCode", parameters.toString());

            /////////////////////////////////////////////////
            infoIs.close();
            is.close();
            zipIns.close();

        } catch (Exception e) {
            map.put("code", "fail");
            map.put("error","读取ipa文件失败");
        }
        return map;
    }

    public static void main(String[] args) {
        System.out.println("======apk=========");
        String apkUrl = "src/shenmiaotaowang_966.apk";
        Map<String,Object> mapApk = ReadUtil.readAPK(apkUrl);
        for (String key : mapApk.keySet()) {
            System.out.println(key + ":" + mapApk.get(key));
        }
        System.out.println("======ipa==========");
        String ipaUrl = "src/IM.ipa";
        Map<String,Object> mapIpa = ReadUtil.readIPA(ipaUrl);
        for (String key : mapIpa.keySet()) {
            System.out.println(key + ":" + mapIpa.get(key));
        }
    }
}

下面附上源码一份:java读取apk、ipa源码完整版

时间: 2024-10-05 03:37:08

完整版java读取apk、ipa包名、版本名、版本号等信息的相关文章

PHP读取APK的包信息,包括包名,应用名,权限,LOGO等

[转]PHP读取APK的包信息,包括包名,应用名,权限,LOGO等 声明本文转自: 原文链接:https://www.jb51.net/article/53780.htm: 感谢分享! <?php //------------------------------- //Apkparser类包开始 //------------------------------- class ApkParser{ //---------------------- // 公共函数,供外部调用 //---------

monkeyrunner_获取apk的包名和activity名

一.使用adb获取单个apk的包名和Activity名称: 1.配置adb环境 a. 我的电脑点击右键-属性-高级-环境变量; b.  环境变量中新建PATH,变量值输入adb.exe工具所在目录; c.  检查是否成功,启动命令行,输入adb; 2.  手机连接电脑,开启USB调试,打开app,输入命令:adb devices,查看手机是否连接到电脑: 3.  doc窗口输入命令行:adb shell dumpsys activity | find "mFocusedActivity"

如何查看Android apk的包名?

有以下四种方法可以查看apk的包名,之后有别的方法,会接着更新文档的. 1. 安装APK包名查看器; 2. 源码AndroidManifest.xml中查看package包名; 3. 利用aapt查看包名: tools或者platform tools或者sdk/build-tools/aapt.exe(进入cmd) aapt dump hadging *.apk 4. adb logcat抓取当前运行的apk的包名:ActivityManager(数字):Displayed 包名/类名:+ ms

[uiautomator篇] 如何获取apk的包名 博客模板

Android自动化学习笔记:获取APK包名的几种方法 ---------------------------------------------------------------------------------------------------------------------------- 小记:自学过程中,经常需要用得到一个APK的包名,总结一下得到包名的几种方式. ********************** 2017-16-23:初版 ********************

获取APK的包名,和启动窗口类

第一个,下载APK文件. 第二步:下载     AXMLPrinter2.jar   文件.用于解析 AndroidManifest.xml 第三步: 解压缩APK文件得到 AndroidManifest.xml. 第四步: 运行 java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt 查看 AndroidManifest  得到包名 原文地址:https://www.cnblogs.com/hui41302707

如何查看apk的包名和启动Activity

在做app自动化的时候,经常需要对apk进行分析其包名及启动Activity,在没安装的情况下,如何通过工具去查看apk的信息呢? 使用Android SDK自带的aapt工具,aapt(Android Asset Packaging Tool)在SDK的build-tools目录下.该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk).也可将资源文件编译成二进制文件,app在build和打包时需要用到它. 打开cmd窗口,切换到sdk的build-tools目录,输入

Java读取其他jar包里的配置文件

最近要做个东西,需要自己控制数据库的事物,项目封装的框架,实在是提不起去阅读的兴趣, 就想直接去读框架的底层实现里面的数据连接的配置文件(如:Url,port,username,password等), 使用JDBC创建数据连接,拿到Connection后,事物就好办了. 找到在一个A.jar包里面的根目录,有配置文件B.properties,里面有需要的配置. 难点就来了,Properties可以加载src下面的properties文件,直接prop.load(this.getClass().g

Java 读取Excel2007 jar包冲突的问题(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)

1.jar包冲突报错问题 2.使用的jar包,以及重复jar包 3.删除重复jar包

利用adb命令查看apk文件包名的一些方法

前提是已经下载android SDK并配好环境变量! 在控制台输入命令$adb shell pm 可以看到adb shell pm的相关用法,详细信息请自己看输出 要看一个apk文件的相关信息最简单实用的方法是: aapt dump badging [yourapp.apk] 如果只是想查看手机上应用的packageName,则输入命令: adb shell pm list packages 列出如下信息: package:android package:cn.ninegame.gamemana