java通过解析文件获取apk版本等信息

Posted 起个名字好难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java通过解析文件获取apk版本等信息相关的知识,希望对你有一定的参考价值。

 

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;

import cn.zsmy.constant.Constant;

public class ApkUtil {
    
    private static final Namespace NS = Namespace.getNamespace("http://schemas.android.com/apk/res/android");
    
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static ApkInfo getApkInfo(String apkPath){
        ApkInfo apkInfo = new ApkInfo();
        SAXBuilder builder = new SAXBuilder();
        Document document = null;
        try{
            document = builder.build(getXmlInputStream(apkPath));
        }catch (Exception e) {
            e.printStackTrace();
        }
        Element root = document.getRootElement();//跟节点-->manifest
        apkInfo.setVersionCode(root.getAttributeValue("versionCode",NS));
        apkInfo.setVersionName(root.getAttributeValue("versionName", NS));
        apkInfo.setApkPackage(root.getAttributeValue("package"));
        Element elemUseSdk = root.getChild("uses-sdk");//子节点-->uses-sdk
        apkInfo.setMinSdkVersion(elemUseSdk.getAttributeValue("minSdkVersion", NS));
        List listPermission = root.getChildren("uses-permission");//子节点是个集合
        List permissions = new ArrayList();
        for(Object object : listPermission){
            String permission = ((Element)object).getAttributeValue("name", NS);
            permissions.add(permission);
        }
        apkInfo.setUses_permission(permissions);
        Constant.MY_LOG.debug("\n版本号:"+apkInfo.getVersionCode()+"\n版本名:"+apkInfo.getVersionName()+"\n包名:"+apkInfo.getApkPackage());
        //String str = "\n版本号:"+versionCode+"\n版本名:"+versionName+"\n包名:"+packageName;
        Constant.MY_LOG.debug(root.getAttributes().toString());
        return apkInfo;
//        String s = root.getAttributes().toString();
//        String c[] = s.split(",");
//        String versionCode = null;
//        String versionName = null;
//        String packageName = null;
//        for(String a: c){
//            if(a.contains("versionCode")){
//                versionCode = a.substring(a.indexOf("versionCode=\"")+13, a.lastIndexOf("\""));
//            }
//            if(a.contains("versionName")){
//                versionName = a.substring(a.indexOf("versionName=\"")+13, a.lastIndexOf("\""));
//            }
//            if(a.contains("package")){
//                packageName = a.substring(a.indexOf("package=\"")+9, a.lastIndexOf("\""));
//            }
//        }        
//        
//        Constant.MY_LOG.debug("\n版本号:"+versionCode+"\n版本名:"+versionName+"\n包名:"+packageName);
//        String str = "\n版本号:"+versionCode+"\n版本名:"+versionName+"\n包名:"+packageName;
////        return root.getAttributes().toString();
//        return str;
//        return "ss";
    }

    private static InputStream getXmlInputStream(String apkPath) {
        InputStream inputStream = null;
        InputStream xmlInputStream = null;
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile(apkPath);
            ZipEntry zipEntry = new ZipEntry("AndroidManifest.xml");
            inputStream = zipFile.getInputStream(zipEntry);
            AXMLPrinter xmlPrinter = new AXMLPrinter();
            xmlPrinter.startPrinf(inputStream);
            xmlInputStream = new ByteArrayInputStream(xmlPrinter.getBuf().toString().getBytes("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
            try {
                inputStream.close();
                zipFile.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        return xmlInputStream;
    }

}

 

调用:

@ResponseBody
    @RequestMapping(value = "/getApkVersion", method = RequestMethod.POST)
    public String getApkVersion(VersionForm form, MultipartFile apkFile) throws Exception {
        Constant.MY_LOG.debug("获取上传的apk版本");
        File apkTempFile = new File(DictInit.dictMap.get(Constant.Dict.APK_UPLOAD_PATH) + "temp.apk");
        // File apkTempFile = new File("d:\\temp.apk");//测试用
        apkFile.transferTo(apkTempFile);
        // 获得apk信息
        ApkInfo apkInfo = new ApkInfo();
        apkInfo = ApkUtil.getApkInfo(apkTempFile.getPath());
        return apkInfo.getVersionName();
    }    

 

以上是关于java通过解析文件获取apk版本等信息的主要内容,如果未能解决你的问题,请参考以下文章

纯java从apk文件里获取包名版本号icon

解析apk,获取apk的详细信息

解析apk,获取apk的详细信息

解析apk,获取apk的详细信息

关于ribo的代码来解析从apk到xml的信息

C#中,上传apk时,怎样获取apk的基本信息