一、介绍

微信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文件,内容为以下:

然后,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包。

打开App,阅读手记

反编译apk修改v7包_微信Android SDK反编译还原源码 进行修改重新编译相关推荐

  1. 绿豆pro前端APP源码v5.1.7编译教程,后端配置全开源安装搭建全图文操作萝卜白菜app通用说明带视频教程_多啦咪

    绿豆pro前端APP源码v5.1.7编译教程全图文操作萝卜白菜app通用: 图文一: 打开前端加载项目后,选择图下文件名为app.java文件打开操作修改位置如下: public static Str ...

  2. 银联支付java代码实现_[VIP源码]【S008】Java实现支付宝、微信、银联支付项目实例项目源码 百度云 网盘...

    java源码项目名称:Java实现支付宝.微信.银联支付项目实例项目源码  支付项目源码& X3 U' W# h0 z# K 百度网盘下载链接: ( y! x% n" V9 F9 s ...

  3. apk源码查看工具_如何查看Linux命令工具的源码?

    点击上方「嵌入式大杂烩」,「星标公众号」第一时间查看精彩文章! 上一篇分享了两个使用的小工具:<如何同时输出调试信息到终端及文件?>.有位小伙伴留言问道tee工具的代码在哪: 这篇文章我们 ...

  4. python 操作键盘,鼠标 。我这个是自动企业微信加好友的,源码可以修改成别的。挺好使!

    python 操作键盘,鼠标 .我这个是自动企业微信加好友的,源码可以修改成别的.挺好使! 键盘的按键码可以去百度搜,大体就是这么操作的 import win32con import win32api ...

  5. 【Android 安全】Android 应用 APK 加固总结 ( 加固原理 | 应用加固完整的实现方案 | 源码资源 )

    文章目录 一. APK 加固原理 1. Android 应用反编译 2. ProGuard 混淆 3. 多 dex 加载原理 4. 代理 Application 开发 5.Java 工具开发 6.Ap ...

  6. vim7.4官方源码在vs2013的编译方法及问题总结

    vim7.4发布也有一段时候了,也该是把之前编译的7.3重新编译一下了,于是考虑着到最新的visual studio 2013编译一下,也顺便看看有没有其它问题. 1.安装vs2013,这个应该不用说 ...

  7. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  8. 【投屏】Scrcpy源码分析一(编译篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  9. CM10.1源码的下载和编译(支持CyanogenMod官方列出的机型和三星S5660、三星S5830、LG-P509等低配机型)...

    不得不说,Android升级的速度非常之快,手机厂商也在不停的追赶Android的步伐,力求更快更多的抢占市场!每次Android升级之后,用不了多久,三星.HTC等一些大厂商就会发布搭载最新andr ...

最新文章

  1. 笔记 VRRP基本原理 主备备份 负载均衡
  2. 麦芒8能安装鸿蒙系统吗,首颗5G基带芯片麦芒8发布鸿蒙最新进展
  3. 网站优化也逃不过“细节决定成败”定律
  4. java定义静态set集合_java集合之set
  5. 火狐浏览器插件HTTPFOX抓传输数据
  6. 中科院自动化所研究员课题组PPT《如何撰写毕业论文?》
  7. SONY的CMOS 图像传感器技术发展路线
  8. 使用方法_防爆配电箱使用方法及使用条件
  9. 在树莓派3B+ 上使用YOLO v3 Tiny进行实时对象检测
  10. HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)
  11. 变量案例弹出用户名(JS)
  12. AGC020C Median Sum
  13. SQL5.5安装教程
  14. 移动应用开发学习通测试题答案
  15. 面试秘籍 | 接口测试常见面试题
  16. matlab中二阶偏导数,matlab中二元函数的一阶和二阶偏导数
  17. 一分钟轻松掌握 !Java 高级数据结构 -- 原生 BitSet 源码刨析
  18. ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
  19. The Battle of Chibi---赤壁之战(DP+数据结构(树状数组))
  20. 小米CC9系列发布会,要用文科设计打动女生的雷军真的懂女生么

热门文章

  1. 计算机的桌面窗户是什么,怎么设置电脑桌面便签小窗口,电脑桌面归纳事情的小窗口...
  2. 面试常被问到排序算法总结(插入+选择+交换+归并排序)
  3. 谈谈工作中常用的设计模式
  4. 只能输入中文或者韩文
  5. Float.parseFloat()的作用
  6. 我的世界服务器rpg装备制作,我的世界RPG远程爆炸武器制作教程_快吧单机游戏...
  7. MMKG: Multi-Modal Knowledge Graphs
  8. 如何浅显易懂地解说 Paxos 的算法?
  9. metrics类型 普罗米修斯_使用普罗米修斯和Grafana监控Flink运行状态
  10. 用matlab模拟凸透镜,凸透镜成像的计算机模拟.pdf