Android apk运行时错误java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLenient

最近在Hisi3751V500上移植一个新的项目,在运行gitv牌照方apk的时候提示java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLenient

06-03 17:44:28.966 I/dalvikvm( 3617): Could not find method com.google.gson.GsonBuilder.setLenient, referenced from method com.gitv.tv.launcher.utils.RetrofitFactory.create
06-03 17:44:28.966 W/dalvikvm( 3617): VFY: unable to resolve virtual method 39078: Lcom/google/gson/GsonBuilder;.setLenient ()Lcom/google/gson/GsonBuilder;
06-03 17:44:28.966 D/dalvikvm( 3617): VFY: replacing opcode 0x6e at 0x0007
06-03 17:44:28.970 D/AndroidRuntime( 3617): Shutting down VM
06-03 17:44:28.970 W/dalvikvm( 3617): threadid=1: thread exiting with uncaught exception (group=0x41724ba8)
06-03 17:44:28.976 E/AndroidRuntime( 3617): FATAL EXCEPTION: main
06-03 17:44:28.976 E/AndroidRuntime( 3617): Process: com.gitv.tv.launcher, PID: 3617
06-03 17:44:28.976 E/AndroidRuntime( 3617): java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLenient
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.utils.RetrofitFactory.create(RetrofitFactory.java:68)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.utils.RetrofitFactory.create(RetrofitFactory.java:36)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.data.DataManager.getIP(DataManager.java:708)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.service.task.SettingTask.getIP(SettingTask.java:105)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.service.task.SettingTask.init(SettingTask.java:69)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.application.GitvLauncherApplication.init(GitvLauncherApplication.java:91)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.gitv.tv.launcher.application.GitvLauncherApplication.onCreate(GitvLauncherApplication.java:60)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4366)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.app.ActivityThread.access$1500(ActivityThread.java:135)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.os.Looper.loop(Looper.java:136)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at android.app.ActivityThread.main(ActivityThread.java:5039)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at java.lang.reflect.Method.invokeNative(Native Method)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at java.lang.reflect.Method.invoke(Method.java:515)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:736)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:552)
06-03 17:44:28.976 E/AndroidRuntime( 3617):     at dalvik.system.NativeStart.main(Native Method)
06-03 17:44:28.978 W/ActivityManager( 2022):   Force finishing activity com.gitv.tv.launcher/.activity.GitvInterfaceActivity

考虑到这个apk在Hisi3798M,AmlogicS905,Amlogic8726MX上面能正常运行,于是把apk进行反编译,发现apk存在classes.dex及classes2.dex,并且classes.dex里面存在com.google.gson.GsonBuilder.setLenient这个方法,第一反应是Hisi3751V500上面对apk分包机制支持不够,导致方法未加载上,但是折腾了一两天也证明不了分包机制的问题。于是把着重点放到了apk安装的日志上面:

`06-06 15:24:17.467 D/dalvikvm( 5507): DexOpt: not verifying/optimizing 'Lcom/google/gson/GsonBuilder;': multiple definitions`

注意到系统提示multiple definitions,证明GsonBuilder这个classes类跟系统某个classes类版本冲突,因此在系统的ext.jar包导入一个包含GsonBuilder的setLenient方法的google gson的gson-2.6.2.jar包,方法是在$SDK根目录/frameworks/opt/ 目录下新建一个gson的目录,然后把gson-2.6.2.jar包放入到gson目录,写一个Android.mk文件,然后再gson目录下mm编译。Android.mk文件内容:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := gson
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:gson-2.6.2.jar

include $(BUILD_MULTI_PREBUILT)

然后进入到$SDK根目录/frameworks/base/目录,修改系统Android.mk目录,修改内容如下:

# ====  the library  =========================================
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(ext_src_files)

LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_JAVA_LIBRARIES := core
LOCAL_JAVA_RESOURCE_DIRS := $(ext_res_dirs)
#以下这行是新增内容
LOCAL_STATIC_JAVA_LIBRARIES := gson
#以上这行是新增内容
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := ext

LOCAL_DX_FLAGS := --core-library

修改完成后,在$SDK根目录/frameworks/base/目录进行mm编译,编译OK后,替换ext.jar包,已经修正了这个gson的错误。
但是此时apk又报其他错误,正是由于这个错误,让我对于之前gson的版本冲突的判断产生了怀疑:

06-06 18:20:29.795 E/AndroidRuntime( 3060): FATAL EXCEPTION: pool-3-thread-1
06-06 18:20:29.795 E/AndroidRuntime( 3060): Process: com.gitv.tv.launcher, PID: 3060
06-06 18:20:29.795 E/AndroidRuntime( 3060): java.lang.NoSuchMethodError: no static or non-static method "Lcom/facebook/imagepipeline/nativecode/WebpTranscoder;.nativeTranscodeWebpToJpeg(Ljava/io/InputStream;Ljava/io/OutputStream;I)V"
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.lang.Runtime.nativeLoad(Native Method)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.lang.Runtime.doLoad(Runtime.java:421)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.lang.Runtime.loadLibrary(Runtime.java:362)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.lang.System.loadLibrary(System.java:526)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.common.soloader.SoLoaderShim$DefaultHandler.loadLibrary(SoLoaderShim.java:32)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.common.soloader.SoLoaderShim.loadLibrary(SoLoaderShim.java:56)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.nativecode.ImagePipelineNativeLoader.load(ImagePipelineNativeLoader.java:48)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.NativeMemoryChunk.<clinit>(NativeMemoryChunk.java:36)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:60)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:22)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:260)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.NativePooledByteBufferOutputStream.<init>(NativePooledByteBufferOutputStream.java:53)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.NativePooledByteBufferFactory.newByteBuffer(NativePooledByteBufferFactory.java:100)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.memory.NativePooledByteBufferFactory.newByteBuffer(NativePooledByteBufferFactory.java:28)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.cache.BufferedDiskCache.readFromDiskCache(BufferedDiskCache.java:341)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.cache.BufferedDiskCache.access$400(BufferedDiskCache.java:38)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.cache.BufferedDiskCache$2.call(BufferedDiskCache.java:185)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at com.facebook.imagepipeline.cache.BufferedDiskCache$2.call(BufferedDiskCache.java:168)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at bolts.Task$4.run(Task.java:357)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-06 18:20:29.795 E/AndroidRuntime( 3060):     at java.lang.Thread.run(Thread.java:841)
06-06 18:20:29.801 W/ActivityManager( 2042):   Force finishing activity com.gitv.tv.launcher/.activity.PlayActivity

以为是跟gson同样的错误,然后按照gson导入facebook的imagepipeline包发现又报facebook的common类未找到错误,继续导入,发现又有新的错误,此时又回到了起点,以为是Multidex分包的问题,折腾了好久,然后发现系统里面某一个so库跟facebook的libimagepipeline.so重名,编译的时候gitv的牌照方apk的so库被覆盖掉了,替换回gitv的libimagepipeline.so库,一切正常,OK终于搞定了这个问题。

在调试的时候其实也仔细看了上面报错的log,提示com.facebook.imagepipeline.nativecode.ImagePipelineNativeLoader.load错误,当时第一反应是so库被覆盖了,然后一股脑把gitv的so全部导入到系统/system/lib/目录,结果悲剧的是系统死机了(⊙﹏⊙)!,估计是某一个so库覆盖了系统的一个很重要的so导致系统死机了。胜利的曙光又被这次死机拖延了好久,直到后来发现pm安装这个apk系统不会报错,然后再参考上面的log,这次只替换了gitv的一个so库,libimagepipeline.so,终于结束了这几天蛋疼的调试之旅。。。

最终结论,这几天折腾的根源是两个问题导致的:
1. gson版本跟系统某一个apk的gson版本不一致,并且系统这个gson库不包含GsonBuilder的setLenient方法
2. gitv apk的libimagepipeline.so库跟系统某一个apk的so库冲突,在loadlibrary的时候报错,导致gitv闪退

### 回答1: 这个错误信息是在Eclipse保存时出现的,它的原因是在使用com.gever.rmis.economy这个类时找不到对应的方法。NoSuchMethodErrorJava编程语言中的一个异常,它表示尝试调用一个不存在的方法。 造成这个错误的可能原因有以下几点: 1. 方法名错误:可能是你在调用这个com.gever.rmis.economy类的方法时,方法名拼写错误或者大小写错误。 2. 方法参数不匹配:可能是你在调用这个方法时,传入的参数类型、个数或顺序与方法定义的参数不匹配。 3. 版本兼容性问题:可能是你使用的Eclipse版本和com.gever.rmis.economy类的版本不兼容,导致找不到对应的方法。 解决这个问题的方法有以下几个步骤: 1. 检查方法调用:确认你在调用这个com.gever.rmis.economy类的方法时,方法名拼写正确、大小写正确,传入的参数类型、个数或顺序与方法定义的参数匹配。 2. 更新依赖:尝试更新你项目中使用的com.gever.rmis.economy类的依赖,可以尝试使用新的版本,或者找到兼容的版本。 3. 检查版本兼容性:确保你使用的Eclipse版本和com.gever.rmis.economy类的版本兼容,如果不兼容,可以尝试升级或降级Eclipse版本,或者使用兼容的com.gever.rmis.economy类的版本。 总结起来,解决这个错误需要仔细检查方法调用的正确性,更新依赖并确保版本兼容性。如果还不能解决问题,可能需要进一步调试或查找更详细的错误信息来定位问题。 ### 回答2: 当在Eclipse中保存项目时,如果出现"Caused by: java.lang.NoSuchMethodError: com.gever.rmis.economy"的错误,可能有以下几个原因。 1. 缺少依赖库:此错误通常表示项目中的某个方法无法在运行时找到。可能是因为需要的依赖库未正确添加到项目中。在Eclipse的项目构建路径中,确保所有所需的依赖库都已正确添加,并且版本匹配。 2. 依赖库版本不兼容:有时,项目使用的依赖库的版本不兼容。如果项目使用了某个方法,而该方法在当前使用的依赖库版本中被删除或更改,就会出现此错误。尝试升级或降级依赖库的版本,以解决兼容性问题。 3. 代码编译错误:检查项目中的代码是否存在语法错误或逻辑错误。这些错误可能导致在运行时出现NoSuchMethodError。请确保代码正确编写并且没有任何错误。 4. Classpath配置错误:在Eclipse中,项目的classpath配置非常重要。确保项目的classpath正确设置,以确保所有必需的类和资源都能正确加载。 5. 项目缓存问题:有时,Eclipse的项目缓存可能会导致此错误。尝试清除项目缓存并重新构建项目。 如果以上方法都无法解决问题,您可以尝试在Eclipse之外的环境中运行项目,例如使用命令行工具或另一个IDE进行调试。这可能有助于确定问题的根本原因。还可以查看项目的日志文件,以获得更多具体的错误信息。 ### 回答3: 根据提供的错误信息,"caused by: java.lang.nosuchmethoderror: com.gever.rmis.economy",根据错误提示"java.lang.nosuchmethoderror",通常是由于方法不存在或者版本不匹配等原因导致的错误。 这个错误表明在应用程序中调用了一个在类com.gever.rmis.economy中不存在的方法。这可能是因为版本冲突或者库文件中的类文件缺失或无法加载导致的。 要解决这个问题,我们可以尝试以下几个步骤: 1. 检查所使用的库文件或依赖项的版本是否与代码中的类和方法匹配。确保使用的库文件是最新版本,并且与代码兼容。 2. 检查程序中是否正确导入了com.gever.rmis.economy类的代码。确保该类的代码文件存在并正确加载。 3. 如果使用的库文件库应该提供了所需的方法,但是仍然无法找到该方法,可能需要进行重建项目或重新编译代码。同时,也要检查项目构建工具(如Maven或Gradle)的配置,确保正确地引入了对应的库文件。 4. 如果以上步骤都没有解决问题,可能需要查看更详细的错误日志和堆栈跟踪信息,以确定导致该错误的具体原因。这可能需要进一步调试和排查代码。 总之,"caused by: java.lang.nosuchmethoderror: com.gever.rmis.economy"错误通常是由于方法不存在或版本冲突导致的。通过检查库文件版本、正确导入类的代码、重新构建项目以及查看更详细的错误信息等步骤,有助于解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值