微信Android SDK反编译还原源码 进行修改重新编译

一、介绍

微信sdk,做开发的都应该用过,微信分享、支付,都要用到的。

接下来,跟着我,把他的sdk源码还原为一个module可编译的形式。

用到的工具:

二、过程

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

修改OutputStreamByteArrayOutputStream

然后在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

Delphi是一种常用的编程语言,用于开发各种类型的应用程序。要在Delphi中调用微信Android SDK,您需要遵循以下步骤: 1. 下载微信Android SDK:首先,您需要从微信官方网站下载微信Android SDK。确保您选择最新版本的SDK,并将其保存在您的计算机上的一个目录中。 2. 创建新的Delphi项目:打开Delphi IDE,然后创建一个新的Delphi项目。选择一个适合您需求的项目类型,例如VCL或FireMonkey应用程序。 3. 导入微信Android SDK:在Delphi IDE中,选择“项目”菜单,然后选择“导入”选项。导入对话框会弹出,您需要选择微信Android SDK的jar文件。 4. 添加微信SDK依赖:接下来,在您的Delphi项目中添加微信SDK的依赖项。在Delphi IDE的项目视图中,右键单击您的项目,然后选择“属性”选项。在属性窗口中,选择“Android”选项卡,然后单击“添加”按钮,浏览并选择微信SDK的jar文件。 5. 编写Delphi代码:此时,您可以开始在Delphi中编写代码来调用微信Android SDK的功能。根据您的需求,您可以调用微信的登录、分享、支付等功能。您可以参考微信提供的官方文档和示例代码来了解如何在Delphi中使用微信Android SDK。 6. 测试和调试:完成代码编写后,您可以在模拟器或真实的Android设备上进行测试和调试。确保您的代码可以正确地与微信Android SDK进行交互,并且功能能够正常工作。 以上是使用Delphi调用微信Android SDK的简要步骤。请记住,具体的实现细节可能会因微信SDK的版本和Delphi的不同而有所不同。在实际开发中,您可能需要参考相关的文档和示例代码来获得更详细的指导。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepStudya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值