微信sdk,做开发的都应该用过,微信分享、支付,都要用到的。
接下来,跟着我,把他的sdk源码还原为一个module可编译的形式。
用到的工具:
jadx: 这是一款反编译apk和jar包的工具,下载地址点我
jeb: 这也是一款查看apk源码的工具,下载地址点我
Android Studio
2.1 下载微信Android sdk的jar包
我用的方法是,gradle依赖,然后把jar拿出来,我用的是没有统计功能的包。
2.2 jadx另存
打开jadx,打开微信的Android sdk jar包,File -> Save as gradle project
保存出来到一个文件夹,看到src目录和builde.gradle文件。 我保存为wx文件夹。
2.3 Android Stuido导入
修改build.gradle文件为如下:
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"
}
}
打开Android Studio,新建一个Project,然后File -> import Module,选择刚刚保存出来的文件夹。
然后会出现一些问题,我们来慢慢解决
build tool版本问题
点击第一个update即可。
Cannot read packageName问题
切换到Project视图,在main文件夹下新建AndroidManifest.xml文件,内容为以下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tencent.mm.opensdk">
<application android:allowBackup="true" android:supportsRtl="true"/>
</manifest>
然后,Build -> Make Module ‘xx’
然后你会看到一堆报错
2.4 解决代码错误
到了上一步骤的Make Module之后会看到下面的一堆错误,我们一步步解决
双击第一个错误,定位到了com.tencent.mm.opensdk.channel.a这个文件。原因是因为外部类和内部类名字相同冲突了。
那把一个类改名呗,好咧。 按住ctrl+鼠标左键 点击内部类a,可以看到有什么方法引用了这个类,这个内部类改了,也要把这些引用给改了。
我们把内部类改为ABean,添加无参数构造器,然后把那些引用给改了。继续编译
接着提示:Error:(15, 14) 错误: d不是抽象的, 并且未覆盖AsyncTask中的抽象方法doInBackground(Void…),双击进去看到是com.tencent.mm.opensdk.diffdev.a.b 这个类报错。好,接下来祭出另外的杀器:jeb。
2.5 使用jeb
新建一个项目,依赖微信的sdk,编译成一个apk
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
然后打开jeb,打开这个apk,打开Bytecode,查看微信sdk的源码(com.tencent.mm.opensdk)
,打开上面报错的类:
com.tencent.mm.opensdk.diffdev.a.d
对比jeb的源码,进行代码修改:删除泛型,修改doInBackground方法,修改a方法
f类也是一样修改,然后f方法会发现里面的内部类a没有反编译出来,ok,我们看jeb
把这段代码还原为java代码:
public static com.tencent.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: {
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;
}
接下来到com.tencent.mm.opensdk.diffdev.a.b这个类。a类里面的变量改为public即可
接下来到com.tencent.mm.opensdk.diffdev.a.e这个类,提示Error:(4, 23) 错误: 程序包org.apache.http不存在
这个问题是因为没有导入http包导致的,在build.grdle里面的android标签添加下面的代码即可解决。继续编译
useLibrary 'org.apache.http.legacy'
然后在com.tencent.mm.opensdk.diffdev.a.a这个文件中报错:
Error:(42, 68) 警告: 最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用;
对于 varargs 调用, 应使用 Object
对于非 varargs 调用, 应使用 Object[], 这样也可以抑制此警告
这个把参数new Void[0]删除即可。
然后在com.tencent.mm.opensdk.diffdev.a.e这个文件中报错:
Error:(31, 61) 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出
添加异常捕捉即可
HttpResponse execute = null;
try {
execute = defaultHttpClient.execute(httpGet);
if (execute.getStatusLine().getStatusCode() != 200) {
Log.e("MicroMsg.SDK.NetUtil", "httpGet fail, status code = " + execute.getStatusLine().getStatusCode());
} else {
bArr = EntityUtils.toByteArray(execute.getEntity());
}
} catch (IOException e) {
e.printStackTrace();
}
然后在com.tencent.mm.opensdk.modelmsg.WXMediaMessage这个类中报错:
Error:(183, 51) 错误: 找不到符号
符号: 方法 toByteArray()
位置: 类型为OutputStream的变量 byteArrayOutputStream
修改OutputStream为ByteArrayOutputStream
然后在com.tencent.mm.opensdk.openapi.MMSharedPreferences报错:
Error:(140, 47) 错误: 找不到符号
符号: 方法 a(int,String)
位置: 类型为Object的变量 a
在jeb查看,可以看到a类是util包下面的c文件里面的a内部类,我们把a.a改为c.a.a,导入util目录下c的包 即可。
然后在com.tencent.mm.opensdk.openapi.WXApiImplV10报错:
Error:(92, 33) 错误: 无法将类 Resp中的构造器 Resp应用到给定类型;
需要: Bundle
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
把BaseResp改为Resp,然后Resp类,添加一个无参数的构造方法。
Error:(143, 308) 错误: 不兼容的类型: int无法转换为String
添加String.valueOf()方法即可
Error:(277, 45) 错误: 找不到符号
符号: 变量 message
位置: 类型为BaseReq的变量 req
req改为: ShowMessageFromWX.Req req = new ShowMessageFromWX.Req(intent.getExtras());
Error:(445, 52) 错误: 无法将类 WXWebpageObject中的构造器 WXWebpageObject应用到给定类型;
需要: String
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
IMediaObject修改为WXWebpageObject,WXWebpageObject类里面添加无参数的构造方法
ok。基本修改完毕,再把build.gradle里面minSdkVersion修改为12,重新Make Module即可。
三、生成新的jar包在源码module的build.gradle底部添加代码:
task makeJar(type: Copy) {
delete 'build/libs/test.jar'
from('build/intermediates/bundles/debug/')
into('build/libs/')
include('classes.jar')
rename('classes.jar', 'weixinsdk.jar')
}
makeJar.dependsOn(build)
然后在右边Gradle,:xx Module名称 -> other -> makeJar 右键run。 即可在build/libs看到weixinsdk.jar这个就是根据你的源码编译出来的新的微信jar包。
完整的github地址: https://github.com/tpnet/WeiXinSDKSource-Android
本文出自tpnet的博客,http://blog.csdn.net/niubitianping/article/details/78177023
共同学习,写下你的评论
评论加载中...
作者其他优质文章