热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java.lang包修改_记一次使用修改字节码的方法解决java.lang.NoSuchMethodError

接兔兔国际sdkane充值界面选择兔币充值就会闪退,观察logcat,NoSuchMethodError:com.tutu.common.a.b.get

接兔兔国际sdk ane

充值界面选择兔币充值就会闪退,

477a673095a50174eb86bf3ac58cdc8b.png

观察logcat ,NoSuchMethodError: com.tutu.common.a.b.getContext 原来是因为没有方法找不到

04-19 10:10:54.224: E/AndroidRuntime(20315): FATAL EXCEPTION: main04-19 10:10:54.224: E/AndroidRuntime(20315): Process: com.tutusdk.global.demo, PID: 20315

04-19 10:10:54.224: E/AndroidRuntime(20315): java.lang.NoSuchMethodError: com.tutu.common.a.b.getContext04-19 10:10:54.224: E/AndroidRuntime(20315): at com.tutu.common.a.b.a(TutuAlertDialog.java:78)04-19 10:10:54.224: E/AndroidRuntime(20315): at com.tutu.common.a.b.onCreateView(TutuAlertDialog.java:66)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.os.Handler.handleCallback(Handler.java:733)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.os.Handler.dispatchMessage(Handler.java:95)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.os.Looper.loop(Looper.java:136)04-19 10:10:54.224: E/AndroidRuntime(20315): at android.app.ActivityThread.main(ActivityThread.java:5113)04-19 10:10:54.224: E/AndroidRuntime(20315): at java.lang.reflect.Method.invokeNative(Native Method)04-19 10:10:54.224: E/AndroidRuntime(20315): at java.lang.reflect.Method.invoke(Method.java:515)04-19 10:10:54.224: E/AndroidRuntime(20315): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)04-19 10:10:54.224: E/AndroidRuntime(20315): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)04-19 10:10:54.224: E/AndroidRuntime(20315): at dalvik.system.NativeStart.main(Native Method)

可以用附件中的jar包练习,下载的是zip 解压之后就有jar包。用 jd-gui 反编译找到b class, 介绍一个更好用的反编译工具:apktoolbox,下载:http://www.52pojie.cn/thread-429318-1-1.html

packagecom.tutu.common.a;importandroid.graphics.drawable.ColorDrawable;importandroid.os.Bundle;importandroid.support.v4.app.DialogFragment;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.ViewGroup;importandroid.widget.Button;importandroid.widget.TextView;importcom.feng.android.i.e;importcom.feng.android.i.f;/*compiled from: TutuAlertDialog*/

public class b extendsDialogFragment {privateTextView a;privateButton b;privateButton c;privateString d;privateString e;privateString f;privateString g;privatea h;/*compiled from: TutuAlertDialog*/

public interfacea {voidc(String str);voidc_(String str);

}public voidonCreate(Bundle bundle) {super.onCreate(bundle);

}public staticb a(String str, String str2, String str3, String str4, a aVar) {

b bVar= newb();

Bundle bundle= newBundle();

bundle.putString("left_text", str);

bundle.putString("right_text", str2);

bundle.putString("dialog_tips", str3);

bundle.putString("dialog_tag", str4);

bVar.setArguments(bundle);

bVar.a(aVar);returnbVar;

}publicView onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {

getDialog().requestWindowFeature(1);

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0));

View inflate= layoutInflater.inflate(e.c(getActivity(), "tutu_alert_dialog_layout"), viewGroup, false);

getDialog().getWindow().setGravity(17);if (getArguments() != null) {this.d = getArguments().getString("left_text");this.e = getArguments().getString("right_text");this.f = getArguments().getString("dialog_tips");this.g = getArguments().getString("dialog_tag");

}

a(inflate);

setCancelable(false);returninflate;

}public voida(a aVar) {this.h =aVar;

}private voida(View view) {this.b = (Button) view.findViewById(e.a(getActivity(), "tutu_alert_dialog_ignore_btn"));this.c = (Button) view.findViewById(e.a(getActivity(), "tutu_alert_dialog_recharge_btn"));this.a = (TextView) view.findViewById(e.a(getContext(), "tutu_alert_dialog_tips"));if (!f.c(this.d)) {this.b.setText(this.d);

}if (!f.c(this.e)) {this.c.setText(this.e);

}if (!f.c(this.f)) {this.a.setText(this.f);

}this.b.setOnClickListener(new OnClickListener(this) {final /*synthetic*/b a;

{this.a =r1;

}public voidonClick(View view) {if (this.a.h != null) {this.a.h.c_(this.a.g);

}this.a.dismiss();

}

});this.c.setOnClickListener(new OnClickListener(this) {final /*synthetic*/b a;

{this.a =r1;

}public voidonClick(View view) {if (this.a.h != null) {this.a.h.c(this.a.g);

}this.a.dismiss();

}

});

}

}

问题就出在标红的位置,通过这个

http://stackoverflow.com/questions/36116606/nosuchmethoderrorcom-android-app-fragment-getcontext-in-android

知道, 新版的sdk才支持getContext方法,但是adobe air sdk 要跟进比较慢,没有该方法,要改成 getActivity

因为这是第三方sdk , 没有源代码, 只能修改 class文件。

google 一番 如何修改字节码, 找到几篇文章。 放在最后。

下载 jclasslib ,安装。打开jclasslib bytecode viewer 用于查看 b.class 文件的字节码

解压jar包, 将 com/tutu/common/a文件夹内的b.class 文件 拖拽进bytecode viewer

6e6801917878a4763cdc39fe8d3cf2ef.png

根据上面反编译出来的源码,我们要修改的地方在  private void a(View view)  这个方法中,展开左边的Methods, 一个个看图中名称为a的方法, 观察右边的Access flags, 如果不是private的迅速跳过,是的话观察右边Descriptor ,这里面是参数列表。 觉得像的就展开它, 选中 [0]Code, 观察右边的byte code

26105dd0a7e230261fda4990c47c19e4.png

图中 22行 就是要找的 getContext。 鼠标点击前面的 #56 , 跳的下面这张图

9b11d864578a05337c96d229c0f1d9be.png

看到使用的 划红线的部分是 #80  再回到 bytecode中 , 看13行 getActivity的地方时 #54, 鼠标点击它, 跳到下面这张图

2ed8dc92371313a32c4d1a0726ed6399.png

看到 划红线的部分是 #78 , 滑动左边的列表, 发现这个东西是在Constant Pool 分类下。 好下面编代码修改字节码, 将指向#80 改成指向 #78

在eclipse中新建一个java project。

进入jclasslib 安装目录, 进入 modules/data/src/main/java ,拷贝 org 及其内容到 java project src 目录下

新建一个 App 类,放main方法

importjava.io.DataInput;importjava.io.DataInputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importorg.gjt.jclasslib.io.ClassFileWriter;importorg.gjt.jclasslib.structures.CPInfo;importorg.gjt.jclasslib.structures.ClassFile;importorg.gjt.jclasslib.structures.InvalidByteCodeException;importorg.gjt.jclasslib.structures.MethodInfo;importorg.gjt.jclasslib.structures.constants.ConstantMethodrefInfo;importorg.gjt.jclasslib.structures.constants.ConstantNameAndTypeInfo;public classApp {public static void main(String[] args) throwsInvalidByteCodeException, IOException {

String filePath= "C:/Users/fp/Documents/goalPlatformClientV1/ANE/tutu/package/Android-ARM/b.class";

FileInputStream fis= newFileInputStream(filePath);

DataInput di= newDataInputStream(fis);

ClassFile cf= newClassFile();

cf.read(di);

CPInfo[] infos=cf.getConstantPool();

MethodInfo[] ms=cf.getMethods();

MethodInfo m= ms[5];//System.out.println(m.getAccessFlags());//System.out.println(m.getAccessFlagsVerbose());//System.out.println(m.getName());//System.out.println(m.getNameIndex());//System.out.println(m.getDescriptor());//System.out.println(m.getDescriptorIndex());//AttributeInfo[] getAttributes = m.getAttributes();//System.out.println(m.getAttributes());

ConstantMethodrefInfo uInfo= (ConstantMethodrefInfo) infos[56]; //刚刚那里是CONSTANT_Methodref_info所以这里要用这个

ConstantNameAndTypeInfo nt =uInfo.getNameAndTypeInfo();

String s= String.format("%s\n%s\n%s\n%s", nt.getName(), nt.getTag(), nt.getTagVerbose() , nt.getVerbose());

System.out.println(s);

uInfo.setNameAndTypeIndex(78);

infos[56] =uInfo;//int count = infos.length;//for (int i = 0; i

/*if(infos[count] != null) {

ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //刚刚那里是CONSTANT_Utf-8_info所以这里要用这个

uInfo.setBytes("baidu".getBytes());

infos[count] = uInfo;

}*/cf.setConstantPool(infos);

fis.close();

File f= newFile(filePath);

ClassFileWriter.writeToFile(f, cf);

}

}

用于练手的附件:

解压之后有个jar包。 博客园不让直接上传jar包

参考资料:

直接修改别人jar包里面的class文件 工具:jclasslib - hexin373的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/hexin373/article/details/6669813

如何利用JClassLib修改.class文件 - “羊习习”的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/betterandroid/article/details/14520667



推荐阅读
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 16.04 系统上配置 Qt 5.5 的交叉编译环境,特别针对 i.MX6 平台进行了优化设置。内容涵盖从基本的软件安装到高级配置的全过程。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
author-avatar
jack_liujh_598
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有