jadx可以很方便的进行反编译、但是有时候会增加了一些破坏代码后 、jadx就不能正常的解码出java代码。比如这段代码就是出错后的代码:
/*
r0 = isMediaUri(r9);
r1 = 0;
if (r0 != 0) goto L_0x0008;
L_0x0007:
return r1;
L_0x0008:
if (r9 == 0) goto L_0x0057;
L_0x000a:
r8 = r8.getContentResolver();
r4 = 0;
r5 = 0;
r6 = 0;
r7 = 0;
r2 = r8;
r3 = r9;
r9 = r2.query(r3, r4, r5, r6, r7); Catch:{ Exception -> 0x0053, all -> 0x004b }
r0 = r9.moveToFirst(); Catch:{ Exception -> 0x0049, all -> 0x0047 }
if (r0 == 0) goto L_0x0041;
L_0x001e:
r0 = 0;
r0 = r9.getInt(r0); Catch:{ Exception -> 0x0049, all -> 0x0047 }
r2 = "video";
r2 = r10.contains(r2); Catch:{ Exception -> 0x0049, all -> 0x0047 }
r3 = 1;
if (r2 == 0) goto L_0x0033;
L_0x002c:
r4 = (long) r0; Catch:{ Exception -> 0x0049, all -> 0x0047 }
r8 = android.provider.MediaStore.Video.Thumbnails.getThumbnail(r8, r4, r3, r1); Catch:{ Exception -> 0x0049, all -> 0x0047 }
L_0x0031:
r1 = r8;
goto L_0x0041;
L_0x0033:
r2 = "image/*";
r10 = r10.contains(r2); Catch:{ Exception -> 0x0049, all -> 0x0047 }
if (r10 == 0) goto L_0x0041;
L_0x003b:
r4 = (long) r0; Catch:{ Exception -> 0x0049, all -> 0x0047 }
r8 = android.provider.MediaStore.Images.Thumbnails.getThumbnail(r8, r4, r3, r1); Catch:{ Exception -> 0x0049, all -> 0x0047 }
goto L_0x0031;
L_0x0041:
if (r9 == 0) goto L_0x0057;
L_0x0043:
r9.close();
goto L_0x0057;
L_0x0047:
r8 = move-exception;
goto L_0x004d;
goto L_0x0054;
L_0x004b:
r8 = move-exception;
r9 = r1;
L_0x004d:
if (r9 == 0) goto L_0x0052;
L_0x004f:
r9.close();
L_0x0052:
throw r8;
L_0x0053:
r9 = r1;
L_0x0054:
if (r9 == 0) goto L_0x0057;
L_0x0056:
goto L_0x0043;
L_0x0057:
return r1;
*/
那怎么读懂这个代码呢?借助AndroidKiller来看smali代码,还原这个成java代码。
先看一段java 代码
int shhh=3;
boolean r0 = isMediaUri(r9);
if (r0) {
shhh=5;
}
if (!r0) {
shhh=8;
}
System.err.println("shhh "+shhh);
对应的smali代码是这样
const/4 v0, 0x3
.line 326
.local v0, "shhh":I
invoke-static {p1}, Lcom/bbbbb/ccccc/FileUtils;->isMediaUri(Landroid/net/Uri;)Z
move-result v1
.line 328
.local v1, "r0":Z
if-eqz v1, :cond_0
.line 329
const/4 v0, 0x5
.line 333
:cond_0
if-nez v1, :cond_1
.line 334
const/16 v0, 0x8
.line 337
:cond_1
sget-object v2, Ljava/lang/System;->err:Ljava/io/PrintStream;
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string v4, "shhh "
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-virtual {v2, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
很显然,根据这个转换我们很方便就可以解读出如下代码
/*
r0 = isMediaUri(r9);
r1 = 0;
if (r0 != 0) goto L_0x0008;
这段转成java就是这样子
boolean r0 = isMediaUri(r9);
if (!r0) {
//goto L_0x0008;
//去执行 L_0x0008对应的代码
}
其他的依次类推,你学会了吗。
版权声明:本文为codehxy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。