一,用jd-gui.exe等工具查看源代码。如何你不会,可以参看此文章:
可以到以下连接下载可视化反编译工具:
二,反编译后的源代码,是乱的,看不太懂。这是因为开发者在发布APK时,一般都会用代码混淆器将原始的源代码打乱,这也是防盗的一种方法。但是再怎样防,道高一尺,魔高一丈,用反编译工具很轻松的就可反编译成源码。要想做到反编译成一点也看不懂的代码,这很难,在Android Java开源的世界里就更难做到了。当然你可以把核心的放到中间层,用C/C++封装成库,通过JNI调用,这样要想反编译库就有难度了。
用混淆器打乱的代码,反编译后,要想看懂也不是一件容易的事。因为大部人都会用免费的混淆器来混淆源代码,大部份反编译过来的代码就有一定的规则可寻:
(本人水平有限,如有什么不对的地方,还请指教,非常非感)
反编译后的代码一般会产生以下结构的代码,(代码结构是个人总结的,如有雷同,纯属巧合)比较难看懂,本文章根据实现情况对这几种结构做个简单说明。
1,反编译后的代码:if while结构 if (BTActivity.access$2300(this.this$0)) { int i = BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt); BTActivity.access$2500(this.this$0).notifyDataSetChanged(); } while (true) { return; Bluetooth localBt = BTActivity.access$700(this.this$0); int k = BTActivity.access$600(this.this$0); int l = localBt.sendCommand(1026, paramInt, k); }
(1)只分析逻辑 很显然上面的代码也不是原始的源代码,但是很接近了,如果要想完成还原,还得自己改。 分析上面的代码:这里应该有一个if else的逻辑。从上面的代码分析,return下的代码 应该是永远不会被执行,但这是不可能的。所以上面的代码逻辑(我们先不看语句)应该是这样的, 去掉while和return,加上else,修改后如下: if (BTActivity.access$2300(this.this$0)) { int i = BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt); BTActivity.access$2500(this.this$0).notifyDataSetChanged(); } else { Bluetooth localBt = BTActivity.access$700(this.this$0); int k = BTActivity.access$600(this.this$0); int l = localBt.sendCommand(1026, paramInt, k); } 这样的逻辑才是作者的本意。
(2)逻辑分析完了,应该分析语句. A,这个真的很难看懂。像这句:int i = BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt); 很显然,这个是引用外部的一个类中的一个方法。然后返回整类,从下面的语句可以得知,这个返回值是用不到的。所以这句可去掉int i 还原上面的语句应该是这样的: BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt); B,access$700是什么意思呢。这个应该是BTActivity类中的一个对像,然后这个对象有sendCommand方法。这样你就可以去查这个BTActivity类定义的哪个对象 有这样一个方法了,这好理解。 不好理解的是这句:int k = BTActivity.access$600(this.this$0); 这句初步还原就是去掉int