一、前言

Apk Parser是一个优秀的解码二进制文件与获取apk各种信息的开源库,具备众多实用的特性:

  • 获取apk各种元数据信息,比如应用名、图标、包名、版本号等
  • 解析二进制XML文件并将其转换为文本格式
  • 从dex文件获取类信息,比如:类名、修饰符等
  • 获取apk签名信息,包括v1、v2签名

不过, Apk Parser无论是该开源库的作者或者是网上有的教程,都只是说java se怎么使用这个开源库,并没有android使用该依赖库的教程,所以,这或许是全网独一份android调用 Apk Parser来解析apk的教程哦

二、Apk Parser需要修改的部分

1、获取apk-parser依赖库
  • 通过gradle来获取
    从开源库作者提供的maven central repo下载链接:
<dependency><groupId>net.dongliu</groupId><artifactId>apk-parser</artifactId><version>2.6.9</version>
</dependency>

可以总结出,在Android Studio使用gradle构建系统下载该依赖库的配置: implementation 'net.dongliu:apk-parser:2.6.9'

-或者 直接从github上把整个项目下载下来,集成到你的项目里去
因为apk-parser还需要依赖到以下两个库,需要加进去:

   implementation 'org.bouncycastle:bcprov-jdk15on:1.58'implementation 'org.bouncycastle:bcpkix-jdk15on:1.58'
2、把整个项目从github上download下来之后,把/src/main/resources/目录下的两个.ini文件拷贝到assets目录下

3、修改Apk-parser对这两份.ini的读取方式,全局检索,可以搜索到是在net.dongliu.apk.parser.utils.ResourceLoader这个类中,将原代码:
 private static BufferedReader toReader(String path) {return new BufferedReader(new InputStreamReader(ResourceLoader.class.getResourceAsStream(path)));}

修改为:

   private static BufferedReader toReader(String path) {InputStream inputStream = null;try {Context context = ActivityLifecycle.curActivityRef.get();if(context != null){inputStream = context.getAssets().open(path);}} catch (IOException e) {e.printStackTrace();}return new BufferedReader(new InputStreamReader(inputStream));}

经过上述步骤的配置,android项目就能正常跑了

三、使用教程

1、获取apk元数据
ApkFile apkFile = new ApkFile(apkInfo.getApkPath());
apkFile.setPreferredLocale(Locale.SIMPLIFIED_CHINESE);
ApkMeta apkMeta = apkFile.getApkMeta();
apkInfo.setLabel(apkMeta.getLabel());
apkInfo.setPackageName(apkMeta.getPackageName());
apkInfo.setVersionName(apkMeta.getVersionName());
apkInfo.setVersionCode(String.valueOf(apkMeta.getVersionCode()));
apkInfo.setTargetSdkVersion(apkMeta.getTargetSdkVersion());
apkInfo.setMinSdkVersion(apkMeta.getMinSdkVersion());
2、解析并获取AndroidManifest.xml与其他xml资源文件的内容
try (ApkFile apkFile = new ApkFile(new File(filePath))) {String manifestXml = apkFile.getManifestXml();String xml = apkFile.transBinaryXml("res/menu/main.xml");
}
3、获取dex的类信息
DexClass[] dexClasses = apkFile.getDexClasses();
if(dexClasses != null && dexClasses.length > 0) {for(DexClass dexClass : dexClasses){if(dexClass.getClassType().equals("Lcom/ss/android/common/lib/EventUtils;")){apkInfo.setHasTodayTopClass(true);}else if(dexClass.getClassType().equals("Lcom/qq/gdt/action/GDTAction;")){apkInfo.setHasGdtClass(true);}else if(dexClass.getClassType().equals("Lcom/alibaba/sdk/android/push/noonesdk/PushServiceFactory;")){apkInfo.setHasAlipushClass(true);}else if(dexClass.getClassType().equals("Lcom/tendcloud/tenddata/TCAgent;")){apkInfo.setHasTalkingDataClass(true);}}
}
4、获取apk签名信息
List<ApkSigner> apkSingers = apkFile.getApkSingers();if(apkSingers != null && apkSingers.size()>0) {for (ApkSigner apkSigner : apkSingers) {List<CertificateMeta> certificateMetas = apkSigner.getCertificateMetas();for (CertificateMeta certificateMeta : certificateMetas) {Log.i("min77", certificateMeta.getCertMd5());if (!TextUtils.isEmpty(certificateMeta.getCertMd5())) {String desc = signatures.optString(certificateMeta.getCertMd5());if(!TextUtils.isEmpty(desc)){apkInfo.setSignatureMd5(certificateMeta.getCertMd5()+"("+desc+")");}else {apkInfo.setSignatureMd5(certificateMeta.getCertMd5());}}}}}
5、设置首选的Locales

Apk可能针对不同的地区和语言具有不同的信息(标题,图标等),或者我们可以将其称为Locale。 如果未设置语言环境,则使用默认的“ en_US”语言环境(Locale.US)。 您可以通过以下方式设置一个首选语言环境

try (ApkFile apkFile = new ApkFile(new File(filePath))) {apkFile.setPreferredLocale(Locale.SIMPLIFIED_CHINESE);ApkMeta apkMeta = apkFile.getApkMeta();
}

Android中使用apk-parser解析apk相关推荐

  1. Android中应用分包的方法(Apk Splits)

    通常情况下,应用会根据不同的设备尺寸,准备不同的资源文件,以不同的资源修饰符进行区分. 例如,不同尺寸的图片将分别放入到drawable-mdpi.drawable-hdpi等文件夹. 然而,对于一个 ...

  2. 【Android】提取Android中已安装app的apk

    提取Android中已安装的apk,这个需求很多时候都会遇到.比如从google play上安装过apk后,如何提取出来给别人用? 本文1. 先介绍转载的apk提取方法并 2. 验证提取出来的apk和 ...

  3. android中AndroidManifest.xml 的解析 (转)

    虽然,也做了android开发一年多,可一直有的东西一直了解的不透彻,有时间会把好的东西,分享出来,大家一起学习进步,今天就从mainfest开始. 转自(http://my.eoe.cn/10876 ...

  4. Android中使用SAX方式解析XML文件

    转载http://blog.csdn.net/cjjky/article/details/6666834 在Android中解析XML文主要有三种方式,分别为Simple API for XML(SA ...

  5. android的xml解析方式,Android中对xml文件解析的3种方式总结

    前言 xml 是数据传输的一种格式,Android 中的布局文件.设置文件等都采用它来表示.Android 中对 xml 文件的解析也有多种方式,下面介绍常用的 3 种方式: Dom . SAX 和 ...

  6. Android中的三级缓存解析与实战

    凡永恒伟大的爱,都要绝望一次,消失一次,一度死,才会重获爱,重新知道生命的价值.--<文学回忆录> 1.概述 由于Bitmap的特殊性以及Android对单个进程应用只分配16M的内存,这 ...

  7. Android中代码运行指定的Apk

    有时候,当我们编写自己的应用的时候,需要通过代码实现指定的apk,安装指定的主题,或者安装新的apk.可以通过以下方法实现: private void installAPK(String apkUrl ...

  8. Android中的羊角符,apk瘦身工具

    1 百度百科日元羊角符描述: 日圆(円),又称作日元,其纸币称为日本银行券,是日本的官方货币,于1871年制定.日圆也经常在美元和欧元之后被当作储备货币.货币符号"¥",国际标准化 ...

  9. android中的动画全解析

    Android为我们提供了2中动画 一: Tween Animation 渐变动画 通过对特定对象做图像的变换,例如: 平移, 缩放,旋转, 淡入淡出 等. 二: Frame Animation 帧动 ...

  10. android中Volley的使用解析

    Volley是android平台网络通信库:更快,更简单,更健壮,适合数据量不大,但非常频繁的网络通信操作. Volley提供的功能: 1. JSON,图片(异步) 2. 网络请求的排序 3. 网络请 ...

最新文章

  1. Maven 传递性依赖
  2. 什么是奇异值?奇异值分解是什么?SVD分解详解及实战
  3. 批量mergeinto
  4. 浏览器中可以运行Window2000,WebAssembly 是 JavaScript 的末日?
  5. Python图片爬取方法总结
  6. 用开关控制蜂鸣器_室内照明控制系统的调试与检修
  7. ubuntu 安装phpstorm
  8. 打开vsd_低温修正下的CDFA与VSD
  9. 如何用python最快的获取大文件的最后几行
  10. Leetcode#206Reverse Linked List
  11. 一次打卡软件的实战渗透测试
  12. 往map里的vector添加_面试官问我同步容器(如Vector)的所有操作一定是线程安全的吗?我懵了!...
  13. 【连载】【FPGA黑金开发板】NIOS II那些事儿--LED实验(四)
  14. #39;git merge#39;和#39;git rebase#39;有什么区别?
  15. AI速查表:神经网络、机器学习、深度学习与数据科学一览
  16. cab补丁包离线安装命令
  17. Python培训包食宿
  18. Opencv surf算法
  19. 计算机转换外界信息原理,高级文秘及办公自动化教程-计算机基础
  20. web常见漏洞修复方法

热门文章

  1. 每天一道大厂SQL题【Day01】
  2. Android开发—简单的图片浏览器
  3. win10 pycharm小写变大写,键盘输入错乱
  4. BOSE在上海发布6款音频新品;轩尼诗全球首家概念酒吧在上海开幕 | 美通企业日报...
  5. 进程、线程等操作系统基础知识
  6. React使用Swiper实现3D coverflow 效果
  7. 重庆大学计算机在职研究生,重庆大学在职研究生招生学院_重庆大学在职研究生_学校查找_在职研究生教育信息网...
  8. 号外:Axure导入有了!思维导图也正式上线了!
  9. Java---设计【运动会成绩管理系统】
  10. qq动态名片代码_利用Python动态爬取QQ说说并生成词云,分析朋友状况!