善领官方网站发布的DSA软件(安卓版)及网络上流传的其他版本,均发现手势操作会导致进程崩溃的问题。查询相关网页信息都提出是官方软件本身的问题无法解决。
尝试使用逆向工程跟踪调试了一下,发现善领的DSA整个project较简单且手势相关function并没有封装到内部so。稍微修改后问题解决。 简单记录步骤如下: 1.确定DSA在Android中进程名称,方便后面跟踪。 -- PC端运行DDMS在手机正常连接后操作手机打开DSA软件,可发现多出了 com.dsa 的活动进程 -- PC端开启Logcat,过滤方式为只追踪com.dsa,操DSA软件故意触发手势异常退出 。 在打印信息中可发现手势操作时com.dsa进程会引发系统错误,位置在package的com.dsa.q类的run()方法 (***非官方版DSA的logcat信息中类名略有不同,在 com.dsa.t 类的 run() 方法 *** );
-- 被强制退出的 Activity UI是MainPage类,也就是DSA软件主界面。
-- 用7z或rar直接打开DSA apk,使用dex2jar工具将虚拟机执行档classes.dex转换成jar包。 使用JDK最终反编译jar成java源代码。 在com.dsa package中找到MainPage.class和q.class(或t.class) -- q.class(t.class)只是一个简单的定时器工具类,它的run()方法会按排程执行MainPage.i()对象的dismiss() 是这个地方引起进程崩溃的。 通过坐标轨迹判断是否为←↑↓→四个手势,如果是则通过service做相应的音量减小,音量增大,上一首歌, 下一首歌等动作。 -- 截图是MainPage.class音量增大相关代码块,流程为调用W()方法初始化PopWindow X对象-->X对象显示 上箭头图标--> 创建 q.class(t.class)对象-->使用Timer延迟long 800后执行q.run()方法关闭PopWindow X -->+系统音量-->判断当前音量是否最大,非最大则调用serivce播放后台提示音音量增大,如最大则调用 serivce播放后台提示音音量已最大。 -- 再查看W()方法代码发现只是对Popwindow X的初始化动作为主,而且在代码最开始有if(X!=null) X.dismiss() 关闭Popwindow ![]() -- 从MainPage类中可以知道调用q.class(t.class)主要作用是延迟执行dismiss来关闭手势操作后的 显示的箭头窗口(popwindow X); 尝试去掉调用q.class和定时器相关代码重新编译观察还是否程序手势操作异常 在上图红框区代码中去掉如下: t localt4 =new t(this); new Timer(false).schedule(localt4,800L); 去掉以上代码后关闭PopWindow X的动作自己要添加 在上图红框区代码中最后一行添加: W(); -- 其余三种手势操作代码的修正方法类似 5 . Fix方法确立以后,后面是真正unpack apk 和 fix smali 机器码
-- 使用apktool解包DSA apk在解包目录smali/com/dsa中编辑MainPage.smali
-- 调用q.class和定时器相关java代码对应的smali机器码代码如下灰色部分,删除掉。 至于为什么是这两行可以在MainPage.class里先找到原来调用W();的位置,拷贝过来。 6 . smali 机器码修改完就可以再编译打包成apk了
-- 善领DSA官方版: 1.添加720,1080高清分辨率;2.修复手势操作崩溃问题
-- 善领DSA修改版: 1.添加720分辨率;2.修复手势操作崩溃问题 |