最近POS机项目有个需求,电子签名,就是一个画板上签名。看了一些文章,把贝塞尔曲线算法用上了效果也
不怎么样,然后在Github上也找了些demo,有个brushes还不错,但没有毛笔笔锋那种效果,找啊找,终于找到
ZenBrush(中文名:禅宗画笔,好像是日本人开发的),的确做的非常好,但没有sdk,也没有开源。
想着能否通过反编译的方式,复用里面的核心代码!通过几天尝试可行,但是,如果二次开发的apk挂在了复用里
面的代码时,就没办法通过java代码修复了,只能通过smail修复了,这个需要反编译相关知识了。
来张毛笔带笔锋的效果图,没有书法功底别见笑。
现在分析下二次开发思路:
1. 写一个打log的文件ApktoolLog.java,方便在反编译的smail文件中注入代码(通常一行,根据需要在
ApktoolLog加函数,争取注入时只要一行代码),下面贴下ApktoolLog.java的简易代码(但很实用哦)
package com.example.helloworld;
import android.util.Log;
public class ApktoolLog {
private static final String TAG = "ApktoolLog";
public static void printStackTrace() {
for (StackTraceElement i : Thread.currentThread().getStackTrace()) {
Log.e(TAG, "" + i);
}
}
public static void e(String info) {
Log.e(TAG, "String:" + info);
}
public static void e(int info) {
Log.e(TAG, "int:" + info);
}
public static void e(long info) {
Log.e(TAG, "long:" + info);
}
public static void e(float info) {
Log.e(TAG, "float:" + info);
}
public static void e(double info) {
Log.e(TAG, "double:" + info);
}
public static void e(float paramFloat1, float paramFloat2,
float paramFloat3, float paramFloat4, float paramFloat5,
float paramFloat6, float paramFloat7, float paramFloat8) {
Log.e(TAG, "paramFloat1:" + paramFloat1 + ", paramFloat2:"
+ paramFloat2 + ", paramFloat3:" + paramFloat3
+ ", paramFloat4:" + paramFloat4 + ", paramFloat5:"
+ paramFloat5 + ", paramFloat6:" + paramFloat6
+ ", paramFloat7:" + paramFloat7 + ", paramFloat8:"
+ paramFloat8);
}
}
将它反编译成smail文件ApktoolLog.smali拷贝到对应目录。
2.反编译原始的ZenBrush.apk在smail中注入log代码,得到关键参数值,下面详解设置画笔样式的关键参数
$ grep -rn "setBrushType" ZenBrush
匹配到二进制文件 ZenBrush/build/apk/lib/armeabi-v7a/libZenBrushRenderer.so
匹配到二进制文件 ZenBrush/build/apk/lib/armeabi/libZenBrushRenderer.so
ZenBrush/smali/jp/co/psoft/zenbrushfree/library/a.smali:209: invoke-virtual {v0, v1}, Ljp/co/psoft/ZenBrushLib/ZenBrushRenderer;->setBrushType(I)V
Ze