如何手动辨识APK中使用了什么SDK
优采云 发布时间: 2020-08-28 06:02如何手动辨识APK中使用了什么SDK
大家在开发过程中通常会碰到技术选型问题:我应当使用什么第三方SDK来实现我想要的功能呢?我们在开发商用的APP时肯定希望选择一些成熟的SDK,不会在网上随意找一个demo中的代码就使用,那样可能会导致好多Bug。现在就有如此一款工具使你查看主流APP使用的SDK情况,相信大厂使用的SDK都是经过严格验证的,相对比较放心。
前段时间我们正打算做剖析同行APP使用第三方SDK情况的事情,开始想着下载几个同行主流的APP之后反编译,然后一个个检测使用了什么SDK。想想一个个自动下载,反编译APK并检测SDK使用情况很麻烦的。喜欢“偷懒”的我就想能不能做一个自动化的工具,自动去完成这种工作或则大部分工作有程序自动化完成呢?如果使用自动化程序的话就不需要局限于几款同行APP了,可以手动采集应用市场TOP100,TOP500或则TOP1000的APP了,只要自动化工具写好了,后续要采集多少APP都不是个事,工作量不会降低多少,于是就按着这个看法开始折腾了…。
一、准备工作
由于前端技术我熟悉的是JAVA,所以这个程序我是使用JAVA写的。写工具之前须要先打算以下工具:
SpringMVC:Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来挺好地将数据、业务与诠释进行分离。
Hibernate:是一个基于元数据的轻量级的ORM框架。
Mysql:用来储存APP信息以及第三方SDK信息
APKTool:反编译APK的神器
HttpClient:是拿来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HTMLparser:HTML解析工具
SAX:SAX(simple API for XML)是一种XML解析的取代方式。相比于DOM,SAX是一种速率更快,更有效的方式。
二、设计思路
以下只介绍这个工具的设计思路,没有贴具体代码,思路清晰之后写代码很简单。
1. 数据库设计
我们采集数据就须要设计数据库表,这个很简单,我设计了6个表:
tools_app_category:保存APP的分类信息
tools_app_info:保存APP基本信息
tools_app_packages:保存APP包名信息及SDK信息
tools_app_packages_relat:APP和第三方SDK关联表
tools_app_perm:APP权限信息表
tools_app_perm_relat:APP与权限的关联表
2. 获取APP安装包
各大应用市场都有TOP xx应用列表,这些APP通常是用户使用比较多APP,这些APP使用的第三方SDK通常是比较成熟的SDK,值得我们是参考。
我选择从魅族应用市场下载热门APP作为数据剖析样本,选择应用排名靠前的1000尾款APK,我只选择剖析应用类APP,把游戏类的过滤掉了。
应用排行榜界面的url格式是这些:,使用HttpClient获取那些页面网页源码,再使用HTMLparser解析网页源码获取每一个APP的详情url地址,APP详情地址的格式是这些:包名,然后在APP详情页面解析出APK的下载地址并下载该APK。除了APK的下载地址以外还可以通过这个界面获取APP的其他基本信息,如有须要可以保存到数据库,我的是存在tools_app_info表中。
3. 反编译APK
下载完APK之后要做的工作就是反编译APK了,这里我们就要用到抢到的APKTool。这一步其实很简单,大家晓得JAVA上面可以直接运行脚本命令的,使用一下命令即可反编译APK。
Runtime.getRuntime().exec("java -jar apktool.jar d -f "+apkPath+" -o "+outPath)
这里可能有人会问,反编译下来的是smali文件,有哪些好处呢?反编译之后有两部份内容对我们有用smali为前缀的目录以及AndroidManifest.xml。通过AndroidManifest.xml可以获取apk的基本信息,如有须要可以使用XML解析工具解析,我这儿是使用SAX计息AndroidManifest.xml而且获取每位APP的进程数、广播*敏*感*词*的数目以及权限等信息。以smali为前缀的目录是我们主要使用的数据。大家晓得每一个SDK的包名基本上是惟一的,很少有重复,而java文件的包名和目录名是有对应关系的,通过获取smali文件所在的路径即可晓得这个APK的所有包名。就这样把APK的包名全部搜集上去储存到数据库中备用。这里你们要注意的是在搜集包名的时侯可以做一下初步筛选,把一些没有用的或则是APK本身的包名直接过滤,可提升采集效率而且防止采集一些垃圾数据。把这种信息存在tools_app_packages表中。
4.关联SDK
这一步真的是苦力活,是一不干着恶心的活,是这个SDK采集过程中惟一须要人工完成的。上一步我们早已采集了所有APP使用的包名,这一步我们须要检测这种包名,如果是非第三方SDK则删除,如果是SDK则备注SDK名称以及备注,方便后续查找。
5.前端界面
后台早已搭建好了,大家可以按照须要稍为建立,比如我们早已记录了每位app的下载地址,可以定时更新。现在我们这儿要做的就是开发一个后端界面,用于可视化操作查询,这一部分没哪些讲的,就是写插口调插口而已,直接上效果图:
搜索界面
详情界面:
6. 其他
以上那里写的不对或则有待赶快,欢迎你们提意见,谢谢!
SDK查询地址: