JAVA语言解析apk包具体,获得对应的包名和版本信息(代码)
小标 2018-08-30 来源 : 阅读 3162 评论 0

摘要:本文主要向大家介绍了JAVA语言解析apk包具体,获得对应的包名和版本信息,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言解析apk包具体,获得对应的包名和版本信息,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

package test.com.core.apk2;

 

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

 

import org.apache.commons.lang.StringUtils;

import org.xmlpull.v1.XmlPullParser;

 

import android.content.res.AXmlResourceParser;

import android.util.TypedValue;

/**

 *

 * @author laijunfeng816

 *

 */

public final class ReadUtil {

    /**

     * 读取apk

     * @param apkUrl

     * @return

     */

    public static Map readAPK(String apkUrl){

        ZipFile zipFile;

        Map map = new HashMap();

        try {

            zipFile = new ZipFile(apkUrl);

            Enumeration enumeration = zipFile.entries();

            ZipEntry zipEntry = null;

            while (enumeration.hasMoreElements()) {

                zipEntry = (ZipEntry) enumeration.nextElement();

                if (zipEntry.isDirectory()) {

 

                } else {

                    if (StringUtils.isNotBlank(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 && StringUtils.isNotBlank(name)){

                                for (int i = 0; i != parser.getAttributeCount(); i++) {

                                    String sss = getAttributeValue(parser, i);

                                    System.out.println("sss==="+sss);

                                    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("packageName", packageName);

                                    } else if("versionCode".equals(parser.getAttributeName(i))){

                                        String versionCode = getAttributeValue(parser, i);

                                        if(null == versionCode){

                                            versionCode = "";

                                        }

                                        map.put("versionCode", versionCode);

                                    }

                                }

                                break;

                            }

                        }

                    }

                    if(map != null){

                        return map;

                    }

                }

            }

            zipFile.close();

        } catch (Exception e) {

            map.put("code","000000" );

            map.put("msg","错误了啊");

        }

        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 "";

    }

 

 

    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","","","","","",""

    };

 

    public static void main(String[] args) {

        System.out.println();

        String apkUrl = "D:\\app.apk";

        Map mapApk = ReadUtil.readAPK(apkUrl);

        System.out.println("mapApk======="+mapApk);

    }

}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 2
看完这篇文章有何感觉?已经有4人表态,50%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程