如何在apk中列出所有第三方罐子?

时间:2014-06-17 14:29:37

标签: java android apk

鉴于有一个apk文件,有没有办法列出其中的所有jar引用?我无法通过aapt找到一种方法。我想这可能是一个复杂的路线,涉及到转换jar的dex,但我想知道是否有更简单的东西。

1 个答案:

答案 0 :(得分:4)

由于所有第一方和第三方代码都优化为一个dex文件,因此您无法轻松找到第三方jar的列表。

但是,您可以使用dexdump中存在的工具$SDK_DIR/build-tools/{VERSION}/来查看有关APK内部组合的dex文件的信息。

这将打印出文件中所有类的列表:

./dexdump {PATH_TO_APK} | grep "Class descriptor" | cut -d':' -f

输出结果如下:

  

'LCOM / stackexchange /马文/ UI /收件箱/ AchievementsListFragment;'   'LCOM / stackexchange /马文/ UI /问题/ AnswerFragment;'   'LCOM / stackexchange /马文/ UI /站点/ AllSitesFragment;'   'LCOM / stackexchange /马文/ UI /站点/ SingleSiteQuestionsFragment;'   'LCOM / stackexchange /马文/ UI /站点/ SingleSiteTagsFragment;'   'LCOM / stackexchange /马文/ UI /站点/ SingleSiteUsersFragment;'

     

...

由于您似乎关心而不是类,您还可以通过查看包标识符的唯一粗略猜测来优化这一点。如果我们假设每个具有不同前两个标签的类是不同的包,那么您可以将类减少到只包含这样的包:

  

./ dexdump~ / Downloads / StackExchangeMobile-release.apk | grep“类描述符”| cut -d':' - f2 |切-c4- |切-d'/' - f1-2 | uniq -u |排序

上面将从前一个结果中的每一行的开头删除'L,只获取前两个文件夹名称(名称空间标识符),然后打印出它找到的所有唯一文件名。

在Stack Exchange上使用它安卓应用程序吐出:

  

机器人/支撑

     

COM / actionbarsherlock

     

COM /谷歌

     

COM / koushikdutta

     

...

显示它正在使用的内容。您可以使用要保留的文件夹名称数量,因为某些程序包需要向下钻取2个以上的标识符以确定它们使用的内容,方法是将最后-f1-2命令的cut部分修改为{{ 1}}。在这种情况下,我没有把它改成三个,而是发出一个很多的junit包。