摘要:本文主要向大家介绍了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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号