我们都知道字节码是java或者kotlin源码编译后的文件,后缀名是".class",如果直接用普通文本编辑器打开是会显示乱码的,如果用Android Studio 直接打开则会自动反编译成java代码;那么如何才能正确查看到源码编译后的字节码呢?
主要有以下几种方式:
1、使用javap命令
javap命令路径:%JAVA安装路径%\jdk1.8.0_131\bin\javap
用法: javap <options> <classes>
其中, 可能的选项包括:
命令 | 作用 |
---|---|
-help --help -? | 输出此用法消息 |
-version | 版本信息 |
-v -verbose | 输出附加信息 |
-l | 输出行号和本地变量表 |
-public | 仅显示公共类和成员 |
-protected | 显示受保护的/公共类和成员 |
-package | 显示程序包/受保护的/公共类和成员 (默认) |
-p -private | 显示所有类和成员 |
-c | 对代码进行反汇编 |
-s | 输出内部类型签名 |
-sysinfo | 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列) |
-constants | 显示最终常量 |
-classpath
| 指定查找用户类文件的位置 |
-cp
| 指定查找用户类文件的位置 |
-bootclasspath
| 覆盖引导类文件的位置 |
//例如
>> javap -c -verbose Test.class
2、Android Studio自定义工具:
本质上还是使用javap命令
- 打开设置路径:Android Studio > File > Settings > Tools > External Tools
- 点击左上角"+"新增一个自定义工具
- 输入相关信息:
字段 | 说明 |
---|---|
Name | 工具的名字,例如:ToByteCode |
Description | 工具的功能描述,例如: show java file byte code |
Program | 要执行的命令:$JDKPath$\bin\javap |
Arguments | 执行命令所添加的参数,例如:-c -verbose F i l e C l a s s FileClass FileClass |
Working directory | 工作目录,也就是项目编译后生成的class文件目录,例如: O u t p u t P a t h OutputPath OutputPath |
- 最后点击底部的【OK】按钮进行保存就行了
使用方法:
Android Studio中随便打开一个java类文件,在空白地方点击鼠标【右键】,在弹出的菜单选择【External Tools】> 【ToByteCode】也就是刚才自定义工具的名字;
Android Studio就会自动到编译后的目录找到该java类对应的class文件,并执行刚才配置的命令
//执行结果
"D:\Android\Android Studio 4.0\jre\bin\javap" -c -verbose com.example.myapplication.Test
Classfile /D:/MyFile/develop/android/MyApplication/app/build/intermediates/javac/debug/classes/com/example/myapplication/Test.class
Last modified 2021-3-13; size 1099 bytes
MD5 checksum 5d28e3e79dc16c5f46030cc91157226b
Compiled from "Test.java"
如果出现找不到类的错误提示,则可能该类是最近添加的还没有编译成class文件,可以到编译产物所在路径查看是否存在对应的class文件进行确认(默认路径:MyApplication\app\build\intermediates\javac\debug\classes\com\example\myapplication\Test.class);
例如:
"D:\Android\Android Studio 4.0\jre\bin\javap" -c -verbose com.example.myapplication.NewTest
错误: 找不到类: com.example.myapplication.NewTest
Process finished with exit code 1
解决的办法就是重新编译项目:Android Studio > Build > Rebuild Project
3、使用Android Studio插件
Android Studio > File > Settings > Plugins
目前没发现展示效果跟javap命令出来一样的插件,有空可以自己写一个,原理也就是利用javap命令获取结果并展示出来
4、kotlin查看字节码
- 打开要查看的kotin文件
- Android Studio > Tools > Kotlin> Show Kotlin Bytecode