给定一个apk文件,有什么办法列出其中的所有jar引用?我想不出办法用aapt做到这一点。我猜可能会有涉及dex到jar转换的复杂路线,但我想知道是否有更简单的东西。

最佳答案

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

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

这将打印出文件中所有类的列表:
./dexdump {PATH_TO_APK} | grep "Class descriptor" | cut -d':' -f
输出将类似于:

'Lcom / stackexchange / marvin / ui / inbox / AchievementsListFragment;'
'Lcom / stackexchange / marvin / ui / question / AnswerFragment;'
'Lcom / stackexchange / marvin / ui / site / AllSitesFragment;'
'Lcom / stackexchange / marvin / ui / site / SingleSiteQuestionsFragment;'
'Lcom / stackexchange / marvin / ui / site / SingleSiteTagsFragment;'
'Lcom / stackexchange / marvin / ui / site / SingleSiteUsersFragment;'

...

由于您似乎关心的是软件包,而不是类,因此您还可以通过仅查看软件包标识符的唯一粗略猜测来对其进行优化。如果我们假设每个具有不同的前两个标签的类都是一个不同的包,那么您可以将类缩小为仅这些包,如下所示:

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

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

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

android / support

com / actionbarsherlock

com / google

com / koushikdutta

...

显示它正在使用什么。通过将最后一个-f1-2命令的cut部分修改为-f1-{NUM},可以保留文件夹名称的数量,因为某些软件包需要挖掘2个以上的标识符以弄清它们的用途。在这种情况下,我没有将其更改为三个,因此不会吐出很多junit软件包。

08-06 10:19