在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 读取apk文件信息

读取apk文件信息

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.03M
  • 下载次数:11
  • 浏览次数:231
  • 发布时间:2015-10-20
  • 实例类别:Android平台开发
  • 发 布 人:xujinghui2007
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 读取apk文件

实例介绍

【实例简介】用于直接从apk文件中读取版本信息、图片等内容
【实例截图】

【核心代码】

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.xmlpull.v1.XmlPullParser;
import android.content.res.AXmlResourceParser;
import android.util.TypedValue; 

/**
 * 分析APK文件,取得APK文件中的 包名、版本号及图标
 */
public class analysisApk {
	/**
     * 解压 zip 文件(apk可以当成一个zip文件),注意不能解压 rar 文件哦,只能解压 zip 文件 解压 rar 文件 会出现 
     * java.io.IOException: Negative seek offset 异常 create date:2009- 6- 9 author:Administrator
     * @param apkUrl
     *             zip 文件,注意要是正宗的 zip 文件哦,不能是把 rar 的直接改为 zip 这样会出现 java.io.IOException:
     *             Negative seek offset 异常
     * @param logoUrl
     * 			   图标生成的地址
     * @throws IOException
     */
   public static String[] unZip(String apkUrl, String logoUrl) 
   {   
	  //[0]:版本号;[1]包名
      String[] st = new String[2];
      byte b[] = new byte [1024];
      int length; 
      ZipFile zipFile;
      try {
          zipFile = new ZipFile( new File(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()))
                 {
             		try {
             			AXmlResourceParser parser=new AXmlResourceParser();
             			parser.open(zipFile.getInputStream(zipEntry));
             			while (true) {
             				int type=parser.next();
             				if (type==XmlPullParser.END_DOCUMENT) {
             					break;
             				}
             				switch (type) {
             					case XmlPullParser.START_TAG:
             					{
             						for (int i=0;i!=parser.getAttributeCount();  i) {
             							if("versionName".equals(parser.getAttributeName(i))){
             								st[0] = getAttributeValue(parser,i);
             							}else if("package".equals(parser.getAttributeName(i))){
             								st[1] = getAttributeValue(parser,i);
             							}
             						}
             					}
             				}
             			}
             		}
             		catch (Exception e) {
             			e.printStackTrace();
             		}
                 }
                 
                 if("res/drawable-ldpi/icon.png".equals(zipEntry.getName())){
               	  OutputStream outputStream = new FileOutputStream(logoUrl);
                     InputStream inputStream = zipFile.getInputStream(zipEntry); 
                     while ((length = inputStream.read(b)) > 0)
                        outputStream.write(b, 0, length);
                 }
             }
          }
      } catch (IOException e) {
          // TODO Auto-generated catch block
          //e.printStackTrace();
      }
      System.out.println(st[0]);
      return st;
   }
   
   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","","","","","",""
	};
}

标签: 读取apk文件

实例下载地址

读取apk文件信息

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警