Android Studio Analyze APK 一直显示 Parsing Manifest探因及解决

/ grep -rnl “Parsing Manifest” *

输出信息中有一些警告信息之类的,最终在输出信息中找到了个相关的:

Applications/Android Studio.app/Contents/plugins/android/lib/android.jar

看目录名,大概是AS插件中对应的Android相关的lib工具包。找到对应位置,用JD-GUI打开对应的jar文件,具体看下一下。

通过全局搜索关键字Parsing Manifest,的确可以定位到具体的ApkViewPanel类,且包名与上面AS日志中都能对的上,但字节码反解成java过程中有内部错误。尝试着用用jadx打开,因为android.jar包还挺大,时间比较长,、最终虽然ApkViewPanel部分内容可以显示,但内部依然有部分内部错误无法显示,且Parsing Manifest不能直接显示。

2.3 GitHub定位与源码分析

不过没关系,我们试着去找找源码看看。搜索对应包名:com.android.tools.idea.apk.viewer,选择java类别,很快,我们找到了对应的源码位置。

github.com/JetBrains/a…

正好,AS就是JetBrains主导的产品,Perfect!

很快,我们找到了对应Parsing Manifest的位置:

setAppInfo()方法中,将对应的控件内容从原来的Parsing Manifest改成了对应的包名和版本号等信息。

显然,在代码myNameComponent.append("Parsing Manifest");setAppInfo(result);之间,程序出了问题。

这之间关键的类,主要有apkParser对象对应的ApkParser类,还有Archives类。继续跟踪ApkParser类,发现其主要也是一个外壳性质的类,apkParser.constructTreeStructure()方法主要流程来到如下所示位置:

现在,我们发现,无论是此处的ArchiveTreeStructure类,还是之前的Archives类,这两个关键线索上的类都不是在这个项目中。根据代码文件中的import导入,很快,我们发现,线索被定向到了com.android.tools.apk.analyzer包中。

从包名上来看,com.android.tools.apk.analyzer应该是Android Tools中带的一个工具。来到项目iml文件,我们发现与之相关的构件。其中,组名是:com.android.tools.apkparser,构件名是:apkanalyzer

2.4 工具本体-apkanalyzer

至此,我们先总结下问题的原因。

AS中自带的Analyze APK,实际上是通过集成了插件实现,而插件内部,又通过调用了 Android Tools中的名叫apkanalyzer的工具实现的分析。因此,想要追溯出现问题的原因,我们需要再去对应追踪下apkanalyzer

如果熟悉Android Tools,我们对应去tools目录下找找,很快便能找到apkanalyzer。及时不熟悉,不知道目录位置也没关系,打不了全局搜索下。

终于,对应的工具本体出现在我们面前。

实际上,如果对Google Developer比较熟悉,或者直接在上面搜索下,也能直接在Analyze APK页面上找到核心信息,直接指向工具本体—apkanalyzer

developer.android.com/studio/buil…

啊哈,饶了半天,原来官方文档上直接有啊,哭了,有木有?

同样的,通过反编译工具查看apkanalyzer.jar代码终究不太方便,且内部也有不少INNER ERROR。于是,我们继续去GitHub上找找。

GitHub上搜索到的apkanalyzer相关的零零散散,好像都是个人的,不太官方,也不符合我们的预期。怎么办呢?

源码不够,Google Source来凑!

直接Google Source搜索可能的关键字,马上得到了结果。

显然,这正是我们需要的。

但此时,如果直接源码跟踪下去,还是有难度的。

2.5 apkanalyzer查因

apkanalyzer作为一个工具,是独立的。在实际使用时可以直接脱离AS环境,Google Developer官网上也有专门的篇幅进行了介绍。

developer.android.com/studio/comm…

实际使用时,我们通过不同的命令行命令及参数,可以得到我们期望的结果,如用来分析APK基本属性,Manifest,dex或资源等。

由此,我们可以多试几个,反正AS中Analyze APK最终用的也是它。在一定的命令上,结果肯定是一样的。也就是说,通过命令行直接执行apkanalyzer,肯定也会有问题,但有个好处时,命令行执行往往都能抛出对应的错误日志。

有了进一步的错误日志提示,就有了异常栈和关键性的真正的错误原因信息。

那我们就试一试吧。

➜ bin apkanalyzer -h apk file-size Corn-dev-debug.apk

46.9MB

➜ bin apkanalyzer apk summary Corn-dev-debug.apk

com.corn 10300 10.3.0.0

➜ bin apkanalyzer manifest print Corn-dev-debug.apk

<?xml version="1.0" encoding="utf-8"?>

<manifest

xmlns:android=“http://schemas.android.com/apk/res/android”

android:versionCode=“10300”

android:versionName=“10.3.0.0”

package=“com.mymoney”

platformBuildVersionCode=“27”

platformBuildVersionName=“8.1.0”>

<uses-sdk

android:minSdkVersion=“19”

android:targetSdkVersion=“26” />

<uses-permission

android:name=“android.permission.GET_ACCOUNTS”

android:maxSdkVersion=“22” />

说明直接分析Manifest文件都是没有问题的。

➜ bin apkanalyzer dex list Corn-dev-debug.apk

classes7.dex

classes6.dex

classes5.dex

classes4.dex

classes3.dex

classes2.dex

classes.dex

复制代码

➜ bin apkanalyzer resources configs --type drawable Corn-dev-debug.apk

anydpi-v21

anydpi-v26

default

watch-v20

v21

v23

ldpi-v4

mdpi-v4

ldrtl-mdpi-v17

hdpi-v4

ldrtl-hdpi-v17

xhdpi-v4

ldrtl-xhdpi-v17

xxhdpi-v4

ldrtl-xxhdpi-v17

xxxhdpi-v4

ldrtl-xxxhdpi-v17

➜ bin apkanalyzer files list Corn-dev-debug.apk

Exception in thread “main” java.util.zip.ZipError: invalid END header (bad central directory offset)

at com.sun.nio.zipfs.ZipFileSystem.zerror(ZipFileSystem.java:1605)

at com.sun.nio.zipfs.ZipFileSystem.initCEN(ZipFileSystem.java:1045)

at com.sun.nio.zipfs.ZipFileSystem.(ZipFileSystem.java:130)

at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)

at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)

at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)

at com.android.utils.FileUtils.createZipFilesystem(FileUtils.java:538)

at com.android.tools.apk.analyzer.Archives.openInnerZip(Archives.java:48)

at com.android.tools.apk.analyzer.ArchiveTreeStructure.create(ArchiveTreeStructure.java:100)

at com.android.tools.apk.analyzer.ArchiveTreeStructure.create(ArchiveTreeStructure.java:65)

at com.android.tools.apk.analyzer.ApkAnalyzerImpl.filesList(ApkAnalyzerImpl.java:803)

at com.android.tools.apk.analyzer.ApkAnalyzerCli$Action$6.execute(ApkAnalyzerCli.java:430)

at com.android.tools.apk.analyzer.ApkAnalyzerCli.run(ApkAnalyzerCli.java:163)

at com.android.tools.apk.analyzer.ApkAnalyzerCli.main(ApkAnalyzerCli.java:130)

终于,在用命令显示Apk内所有文件列表的时候出现了问题。并且有对应的调用栈信息抛出。

从调用栈中我们发现,命令行的调用方式,是通过ApkAnalyzerCli中的main方法去接收命令参数的。在ApkAnalyzer.jar同级的目录中,我们发现了有对应的ApkAnalyzerCli.jar,其作用,就是基于ApkAnalyzer.jar基础上封装的一个Client,以方便程序被外部调用执行,如通过命令行的方式等。

并且,突然间发现,此处的栈信息与之前GitHub上JetBrains/android项目中分析到的源码位置相同~!!

at com.android.tools.apk.analyzer.ArchiveTreeStructure.create(ArchiveTreeStructure.java:100)

看来,这就是真实的原因所在了。

2.6 项目查因

ArchiveTreeStructure主要作用是分析apk文件中的档案文件树形结构,且从最终抛出的错误信息可以看出:Apk包中zip文件出现的问题,zip文件头部信息无效。

java.util.zip.ZipError: invalid END header (bad central directory offset)

抓住这一关键点,那就好办了。直接搜索整个项目中的.zip文件,发现还真有不少。并且存在于assets目录下。主要存放的是一些资源。

直接解压缩.zip文件,发现有问题,果然,此处有问题的.zip文件导致apkanalyzer在分析Apk过程中,分析到这些.zip文件出现了问题。

.zip格式显然是不符合.zip规范的,那么,具体是什么问题呢?

查找到项目使用到这些文件的代码位置。

泪奔了,有木有?!

2.7 核验

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

可以看出,笔者的工作学习模式便是由以下 「六个要点」 组成:

❝ 多层次的工作/学习计划 + 番茄工作法 + 定额工作法 + 批处理 + 多任务并行 + 图层工作法❞

希望大家能将这些要点融入自己的工作学习当中,我相信一定会工作与学习地更富有成效。

下面是我学习用到的一些书籍学习导图,以及系统的学习资料。每一个知识点,都有对应的导图,学习的资料,视频,面试题目。

**如:我需要学习 **Flutter的知识。(大家可以参考我的学习方法)

  • Flutter 的思维导图(无论学习什么,有学习路线都会事半功倍)

  • Flutter进阶学习全套手册

  • Flutter进阶学习全套视频

大概就上面这几个步骤,这样学习不仅高效,而且能系统的学习新的知识。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

当中,我相信一定会工作与学习地更富有成效。

下面是我学习用到的一些书籍学习导图,以及系统的学习资料。每一个知识点,都有对应的导图,学习的资料,视频,面试题目。

**如:我需要学习 **Flutter的知识。(大家可以参考我的学习方法)

  • Flutter 的思维导图(无论学习什么,有学习路线都会事半功倍)

[外链图片转存中…(img-UIwNMMZB-1712146604989)]

  • Flutter进阶学习全套手册

[外链图片转存中…(img-7WIAFiJg-1712146604990)]

  • Flutter进阶学习全套视频

[外链图片转存中…(img-Tz1ZDpN2-1712146604990)]

大概就上面这几个步骤,这样学习不仅高效,而且能系统的学习新的知识。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值