Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wuyr/dmifier
适用于Android项目的IDEA插件,用来自动生成DexMaker代码,类似『ASM Bytecode Viewer』
https://github.com/wuyr/dmifier
Last synced: 4 days ago
JSON representation
适用于Android项目的IDEA插件,用来自动生成DexMaker代码,类似『ASM Bytecode Viewer』
- Host: GitHub
- URL: https://github.com/wuyr/dmifier
- Owner: wuyr
- License: apache-2.0
- Created: 2022-01-26T01:28:11.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-02-21T11:36:11.000Z (over 2 years ago)
- Last Synced: 2023-03-05T00:12:40.790Z (over 1 year ago)
- Language: Kotlin
- Homepage:
- Size: 4 MB
- Stars: 25
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## 一款能将Java源码转成[dexmaker](https://github.com/linkedin/dexmaker)代码的IDEA插件,方便开发和测试
### 插件起源:
去年年底在wanandroid每日一问:[如何构造一个 hide interface 的实现类?](https://www.wanandroid.com/wenda/show/20867)问题中,***残页***同学的回答说,可以通过stub + compileOnly的方式用动态代理实现访问权限是package的接口。我当时就想:用stub+动态代理还是有点麻烦,不是有个叫dexmaker的库可以在运行时动态生成dex吗?不知道能不能直接实现一个hidden的interface?
但我此前又没用过dexmaker,不知道代码要怎么写,觉得挺复杂的。 于是网上搜了一下生成dexmaker代码的工具,发现不但没有,就连dexmaker的相关文章也寥寥无几。
看了官方文档生成Fibonacci class的例子之后,忽然想到:这些代码都是有固定的规则和逻辑,那应该能做成一个自动生成的插件啊(实在不想自己动手写dexmaker代码)!之前不是有个IDEA插件可以生成ASM代码嘛?
于是反编译了那个*ASM Bytecode Viewer*插件,发现它的核心部分是直接使用ASM提供的jar包来实现的!原来ASM就有提供生成ASM代码的api!dexmaker为什么你就不提供一下这个东西啊!哈哈哈
接着又看了一下这个ASM的jar包,发现核心生成类***ASMifier***(这也是本项目的名字来源,它叫***ASMifier***,我就叫***D***(ex)***M***(aker)***ifier***吧,哈哈)继承了Printer,Printer结合ClassReader可以把class文件的指令都读取出来……
### 实现原理:
参照了ASMifier的做法,也弄了一个继承自Printer的类,并在重写的`visitMethod`、`visitInsn`等方法里按照dexmaker的规则去输出dexmaker代码……
### 使用方式:
插件安装后,在编辑器中右键菜单下方可看到 “View DexMaker Code” 选项:![preview](https://github.com/wuyr/DMifier/raw/main/previews/1.png)
或在主菜单 *View* 底部点击:
![preview](https://github.com/wuyr/DMifier/raw/main/previews/2.png)
成功转换后会以Dialog的形式把结果弹出,直接复制到自己的代码里即可:
![preview](https://github.com/wuyr/DMifier/raw/main/previews/3.png)
### 安装:
**在线安装:**插件还在不断完善中,暂时未上传到JetBrain marketplace上。
**本地安装:**
到 [releases](https://github.com/wuyr/DMifier/releases) 里下载最新的 *DMifierPlugin.zip* 后拖把它拖进IDE中并重启。
### 开发进度:
**未实现的指令:***NOP*、
*POP2*、
*DUP_X1*、
*DUP_X2*、
*DUP2*、
*DUP2_X1*、
*DUP2_X2*、
*SWAP*、
*JSR*、
*MULTIANEWARRAY*(创建多维数组)、
*MONITORENTER*、*MONITOREXIT*(synchronized语句)、
(try catch语句,dexmaker没有提供moveException方法)
**不支持的指令:**
*INVOKEDYNAMIC*(Dalvik 字节码没有对应的指令)、
*TABLESWITCH*、*LOOKUPSWITCH*(dexmaker没有提供相关api)
**坑:**
对了,这里还有个dexmaker的坑,就是if语句 `if(a >= b)`,当a=0时,在生成dex之后,a和b的顺序会反过来,也就是变成了 `if(b >= 0)`。 提了issue一周没人回答,才发现dexmaker在去年2月份就停止了更新!坑啊!!!
**后续计划:**
- 优化转换结果显示方式;- 加入直接查看生成的dex文件的smali以及转成class后的代码;
### 更新日志:
- **0.1** 提供基本转换功能。