AndroidSDK反编译还原源码进⾏修改重新编译⼀、介绍
sdk,做开发的都应该⽤过,分享、⽀付,都要⽤到的。
接下来,跟着我,把他的sdk源码还原为⼀个module可编译的形式。
⽤到的⼯具:
jadx: 这是⼀款反编译apk和jar包的⼯具,
jeb: 这也是⼀款查看apk源码的⼯具,
Android Studio
⼆、过程
2.1 下载Android sdk的jar包
我⽤的⽅法是,gradle依赖,然后把jar拿出来,我⽤的是没有统计功能的包。
2.2 jadx另存
androidsdk安装步骤
打开jadx,打开的Android sdk jar包,File -> Save as gradle project
保存出来到⼀个⽂件夹,看到src⽬录和adle⽂件。 我保存为wx⽂件夹。
2.3 Android Stuido导⼊
修改adle⽂件为如下:
打开Android Studio,新建⼀个Project,然后File -> import Module,选择刚刚保存出来的⽂件夹。
然后会出现⼀些问题,我们来慢慢解决
build tool
版本问题
点击第⼀个update即可。
Cannot read packageName
问题
切换到Project视图,在main⽂件夹下新建l⽂件,内容为以下:
然后,Build -> Make Module ‘xx’
然后你会看到⼀堆报错
2.4 解决代码错误
apply plugin: 'com.android.library'
android {
//这连个版本看你安装的sdk
compileSdkVersion 23
buildToolsVersion '25.0.0'
lintOptions{
abortOnError  false
}
defaultConfig {
minSdkVersion 12
targetSdkVersion 21
versionCode 1
versionName "1.0"
}}
<manifest  xmlns:android ="schemas.android/apk/res/android" package ="pensdk">
<application  android:allowBackup ="true" android:supportsRtl ="true"/>
</manifest >
到了上⼀步骤的Make Module之后会看到下⾯的⼀堆错误,我们⼀步步解决
双击第⼀个错误,定位到了pensdk.channel.a这个⽂件。原因是因为外部类和内部类名字相同冲突了。
那把⼀个类改名呗,好咧。 按住ctrl+⿏标左键 点击内部类a,可以看到有什么⽅法引⽤了这个类,这个内部类改了,也要把这些引⽤给改了。
我们把内部类改为ABean,添加⽆参数构造器,然后把那些引⽤给改了。继续编译
接着提⽰:Error:(15, 14) 错误: d不是抽象的, 并且未覆盖AsyncTask中的抽象⽅法doInBackground(Void…),双击进去看到是pensdk.diffdev.a.b 这个类报错。好,接下来祭出另外的杀器:jeb。
2.5 使⽤jeb
新建⼀个项⽬,依赖的sdk,编译成⼀个apk
dependencies {
compile 'pensdk:wechat-sdk-android-with-mta:+'
}
然后打开jeb,打开这个apk,打开Bytecode,查看sdk的源码(pensdk),打开上⾯报错的类:
对⽐jeb的源码,进⾏代码修改:删除泛型,修改doInBackground⽅法,修改a⽅法
f类也是⼀样修改,然后f⽅法会发现⾥⾯的内部类a没有反编译出来,ok,我们看jeb
把这段代码还原为java代码:
public t.mm.opensdk.diffdev.a.f.a b(byte[] arg12) {
String v1_1;
long v8 = 6979321856L;
int v7 = 52;
a v0 = new a();
if(arg12 != null && arg12.length != 0) {
try {
v1_1 = new String(arg12, "utf-8");
}
catch(Exception v1) {
Log.e("MicroMsg.SDK.NoopingResult", String.format("parse fail, build String fail, ex = %s", v1.getMessage()));
v0.o = OAuthErrCode.WechatAuth_Err_NormalErr;
return v0;
}
try {
JSONObject v2 = new JSONObject(v1_1);
v0.x = v2.getInt("wx_errcode");
Log.d("MicroMsg.SDK.NoopingResult", String.format("nooping uuidStatusCode = %d", Integer.valueOf(v0.x)));
switch(v0.x) {
case 402: {
v0.o = OAuthErrCode.WechatAuth_Err_Timeout;
}
case 403: {
v0.o = OAuthErrCode.WechatAuth_Err_Cancel;
v0.o = OAuthErrCode.WechatAuth_Err_NormalErr;
return v0;
}
case 404: {
v0.o = OAuthErrCode.WechatAuth_Err_OK;
}
case 405: {
接下来到pensdk.diffdev.a.b 这个类。a类⾥⾯的变量改为public即可接下来到pensdk.diffdev.a.e 这个类,提⽰Error:(4, 23) 错误: 程序包org.apache.http
不存在
这个问题是因为没有导⼊http包导致的,在dle⾥⾯的android标签添加下⾯的代码即可解决。继续编译然后在pensdk.diffdev.a.a 这个⽂件中报错:这个把参数new Void[0]删除即可。                            v0.o  = OAuthErrCode .WechatAuth _Err_OK ;
v0.w  = v2.getString ("wx_code");
}
case 408: {
v0.o  = OAuthErrCode .WechatAuth _Err_OK ;
}
case 500: {
v0.o  = OAuthErrCode .WechatAuth _Err_NormalErr ;
}
default: {
v0.o  = OAuthErrCode .WechatAuth _Err_NormalErr ;
}
}
}
catch(Exception v1) {
v1.printStackTrace ();
}
}
else {
Log .e ("MicroMsg.SDK.NoopingResult", "parse fail, buf is null");
v0.o  = OAuthErrCode .WechatAuth _Err_NetworkErr ;
}
return v0;        }
useLibrary 'org.apache.http.legacy'
Error:(42, 68) 警告: 最后⼀个参数使⽤了不准确的变量类型的 varargs ⽅法的⾮ varargs 调⽤;
对于 varargs 调⽤, 应使⽤ Object
对于⾮ varargs 调⽤, 应使⽤ Object[], 这样也可以抑制此警告

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。