如何自动识别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格式是这种:http://app.mi.com/topList?page=xx,使用HttpClient获取这些页面网页源码,再使用HTMLparser解析网页源码获取每一个APP的详情url地址,APP详情地址的格式是这种:http://app.mi.com/details?id=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查询地址:http://tool.bchun.com
数据下载地址:https://hx.bchun.com/210.html
转载请注明出处:http://www.luoxudong.com/?p=210

发表评论

您的电子邮箱地址不会被公开。

评论(110)

  • Carrie 2018-02-02 01:01

    不能用了吗?

    • 东哥 @ Carrie 2018-02-05 16:03

      你再试一下,已经恢复了

    • 匿名 @ 东哥 2020-07-30 17:54

      博主,github了么?

    • 东哥 @ 匿名 2020-08-02 19:15

      还没有,事情比较多,暂时没空整理

    • vic @ Carrie 2018-07-16 14:39

      博主,源码开源不,你网站上的app版本比较旧了

    • vic @ vic 2018-07-16 14:44

      样本数据的app版本有点老了呢

    • 东哥 @ vic 2018-08-21 18:02

      我到时整理以下放到github上吧

    • oscar @ 东哥 2019-06-21 11:05

      博主整理到github了没

    • 东哥 @ oscar 2019-06-29 19:01

      还没有呢

  • H3arts 2018-08-03 17:37

    能否获取到这些sdk的版本号?

  • aaron 2018-08-14 19:30

    我也有同样的需求,但是APP都已经更新了很多了,程序又不会写,博主能不能添加个功能点,允许我们自己上传apk?

    • 东哥 @ aaron 2018-08-21 18:03

      可以,我抽空把这个功能加上去,感谢关注!

    • 匿名 @ 东哥 2018-09-11 13:51

      多谢 同样有这个需求哈

  • 凝固 2018-11-08 10:53

    不能用了?

  • 匿名 2019-01-02 16:14

    请问什么时候能用,另外源码能开源么?

    • 东哥 @ 匿名 2019-01-23 08:33

      年后差不多就可以使用了

    • 匿名 @ 东哥 2019-02-20 09:42

      貌似还是不行

    • 东哥 @ 匿名 2019-02-26 14:01

      现在可以使用了。地址变了:http://tool.bchun.com

    • 匿名 @ 东哥 2019-06-29 15:45

      大哥,你这个网站里面只有SDK的名称和简介,能否给一份SDK包名和名称的对应关系?

    • 东哥 @ 匿名 2019-06-29 19:02

      留一个邮箱吧

    • jinfei @ 东哥 2019-07-12 14:05

      大哥,能否给一份SDK包名和名称 , 谢谢 …. 🙏🙏

    • jinfei @ jinfei 2019-07-12 14:08
    • 东哥 @ jinfei 2019-07-27 21:35

      已发送

    • 教科书般的男人 @ 匿名 2019-03-08 16:11

      请问一下关联SDK这一步是怎么分析的,求指教,谢谢!

    • 东哥 @ 教科书般的男人 2019-03-11 08:37

      其实也很简单,通过解析apk根据包名去识别使用了哪些SDK

  • 匿名 2019-07-29 14:08

    您好,请问您方便分享一下收集的第三方sdk信息和包名么,现在在做类似的项目,需要一些相关的资料。如果可以的话,非常感谢。邮箱是1053052516@qq.com

  • windflowere 2019-07-30 16:21

    东哥,跪求源码。

  • 匿名 2019-08-16 16:54

    东哥,您好,最近也在做类似的项目,需要一些相关的资料,您方便的时候也帮忙分享一下收集的第三方sdk信息和包名吧。邮箱是731147387@qq.com,非常感谢。

  • 匿名 2019-08-16 16:55

    东哥,您好,最近也在学习类似的工作,您方便的时候也帮忙分享一下收集的资料吧。邮箱是731147387@qq.com,非常感谢。

  • 2019-08-19 14:56

    您好,方便给我分享一份您收集的第三方sdk信息和包名吗,谢谢,我的邮箱是630068264@qq.com。

  • 木子 2019-08-21 14:55

    老大,求一份第三方sdk信息和包名。邮箱1318666078@qq.com

  • 陈一 2019-09-03 15:34

    东哥东哥,求给一份SDK包名和对应名称 , 十分感谢,1172848710@qq.com

    • 东哥 @ 陈一 2019-09-06 13:43

      已发送

    • 匿名 @ 东哥 2019-11-26 15:46

      东哥,同求一份,十分感谢,邮箱是1530410153@qq.com

  • 匿名 2019-09-10 15:07

    求一份第三方sdk信息和包名。邮箱32590335@qq.com

  • windflowere 2019-09-19 10:03

    同求一份第三方sdk信息和包名;邮箱30679784@qq.com

  • 匿名 2019-09-19 17:06

    东哥,求一份SDK包名和名称,谢谢!
    邮箱:295140741@qq.com

  • 匿名 2019-09-25 17:21

    求给一份SDK包名和对应名称 , 十分感谢,103764004@qq.com

  • jin 2019-10-17 11:36

    罗老师,求一份第三方sdk信息和包名,最近在搞类似 的实验,辛苦您了!

  • 匿名 2019-10-21 11:57

    东哥,求一份SDK包名和名称,谢谢!
    邮箱:425120988@qq.com

  • 匿名 2019-11-15 11:55

    东哥您好,同求一份三方sdk信息和包名,万分感谢 779113379@qq.com