获取apk的包名

142
143
144
145
146
147
148
package com.ztj.common;
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();
      }
      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" , "" , "" , "" , "" , "" , ""
    };
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值