如何在 apk 中列出所有 3rd 方 jars?

Joh*_*nny 3 java android apk

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

Kas*_*rdi 5

由于所有第一方和第三方代码都优化为一个 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 "类描述符" | cut -d':' -f2 | 切-c4- | cut -d'/' -f1-2 | uniq -u | 种类

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

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

安卓/支持

com/actionbarsherlock

com/谷歌

com/koushikdutta

...

这显示了它正在使用的内容。您可以使用要保留的文件夹名称的数量,因为通过-f1-2将最后一个cut命令的部分修改为-f1-{NUM}. 我没有因为在这种情况下将其更改为 3 会吐出很多junit 包。