月度归档:2020年04月

一个dexfile解析库

最近同事在研究自定义解释器加壳的的能力,简单的说就是,自己实现解释器来执行加密的字节码,从而让破解的人无法从内存中dump到完整的dex文件或者永远是错误的dex,加大了破解难度。

由于在Github上没找到合适的c/c++实现的 dex解析库,只好徒手从art虚拟机中扒出来。

这个dexfile只是从art 从抽出的代码,可以使用jni调用,没有封装好的jni接口。需要自己参考dumpdex里的代码或者了解dexfile里的实现才能用。

通过这个库可以获得dex file里的method field 以及各个method的opcode和oprand,如果想自己实现dex虚拟机玩玩可以试试

使用的ndk版本的是r21 cmak3.14 查看更多

Android 硬件和软件绘制的一些差异分析

1.从简单的现象出发

当布局关系如下图所示时,其中Child1和Child2有重叠

Applictaion关闭硬件绘制

使用软件绘制时,调用invalidate时候可以发现兄弟 Child2也进行了绘制,ParentLayout1的兄弟节点ParentLayout2 虽然执行了dispatchDraw,但是子控件并没有重绘

Applictation打开硬件绘制时

使用硬件绘制时,调用invalidate可以发现仅仅是Child1进行绘制但是Child2没有进行绘制

从上面的现象可以发现,硬件绘制时,即使view有重叠,在刷新ui的时候也可以保持只绘制一个,而且不管是软件还是硬件,父亲的兄弟节点之后的view也不需要重绘,这表明一个问题,使用硬件绘制和软件绘制的时候,方法的调用流程似乎是不一样的。 查看更多

VM之从字节码看vm的实现差异

1.基于栈实现,以JVM为例

java源文件

执行命令:得到字节码信息

从上面可以看到main方法由8条指令组成,一般称他为opcode,注意这个opcode并不是汇编语言,而是jvm可以识别的语言,可以说汇编之于Native等于opcode之于jvm

执行分析:

iconst_1 :将1放入操作数栈顶部(此时操作数栈深度为1)

istore_1: 从栈顶取出值,赋值给变量1 (此时操作数栈深度为0)

iconst_2 :将2放入操作数栈顶部(此时操作数栈深度为1)

istore_2:从栈顶取出值,赋值给变量2 (此时操作数栈深度为0)

iload_1,iload_2: 从变量1和变量2加载值,放到操作数栈( 此时操作数栈深度为2)

iadd:把栈顶的两个int值取出并且相加,结果放在栈顶 (此时操作数栈深度为1) 查看更多