Android10上”org.apache.commons.codec.binary.Hex ClassNotFoundException“解决及原因探究

简介: Android10上”org.apache.commons.codec.binary.Hex ClassNotFoundException“解决及原因探究

在一次版本迭代后,突然在部分机型上爆出了一些崩溃,查看崩溃原因,原因内容是java.lang.NoClassDefFoundError:Failed resolution of: Lcom/apache/commons/desc/binary/Hex,具体如下图:

比较蛋疼的是在这次版本迭代后才出现这个问题,而且是高版本手机有问题,10.0的测试机有问题,6.0的测试却没问题。

问题定位及解决

基于上述不同机型的表现,用代码验证下,org.apache.commons.codec.binary.Hex这个类的加载情况,验证代码如下:

try {
    Class.forName("org.apache.commons.codec.binary.Hex");
    Log.e("HexTest","success");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
    Log.e("HexTest","failed");
}

经过验证,在10.0的手机上输出的是falied,6.0的手机上输出的是success

org.apache.commons.codec.binary.Hex这个类到底是干嘛的?是哪个包下的呢?
全局搜索项目代码,没发现org.apache.commons.codec.binary.Hex,这就表示这个类不是我们项目自己添加的依赖。

为了先解决问题,我就找到了相应的jar包,具体位于Apache Commons Codec,通过下面的方式给项目添加了依赖:

    compile group: 'commons-codec', name: 'commons-codec', version: '1.14'

问题暂时解决了。

问题原因分析

接下来我们来分析下出现这个问题的原因,问题的核心在于6.0的手机上是可以加载到这个类的,10.0的手机加载不到,初步猜测是手机系统内置了这个类,高版本的手机默认把这个类给hide了。

后来经过详细的排查本次迭代的代码,发现了一处可能的原因,就是编译版本compileSdkVersion27升级到了28,然后把compileSdkVersion回退到27,这个问题果然没了。

api 28对应的是Android 9,具体对应关系请看Android version history

emmmmmm,现在的问题是compileSdkVersion从27到28,跟这个apache的包hide起来有什么关系?

突然想起来Android6.0(也就是api 23)中移除了对Apache HTTP客户端的支持,这个也是apache包,他们之间是不是有什么关系呢?我们看下官网,它的解释是这样的:

Apache HTTP 客户端弃用
在 Android 6.0 中,我们移除了对 Apache HTTP 客户端的支持。从 Android 9 开始,该内容库已从 bootclasspath 中移除,且默认情况下应用无法使用它。

我们找一个org.apache.http.legacy的jar包分析一下,具体如下:

org.apache.http.legacy包下有我们想要的org.apache.commons.codec.binary.Hex类,那么我们可以参照官网提供的在高版本使用org.apache.http.legacy建议即可,具体参考Apache HTTP 客户端弃用

我们只需要在AndroidManifest.xml中添加以下内容即可:

<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

当然了,我们还可以用另一种方式,在模块的build.gradle中添加如下代码即可:

android { 
    useLibrary ‘org.apache.http.legacy'
}

需要说明的是,我们每个版本的Android sdk中其实都是有org.apache.http.legacy的jar包的,具体位于sdk/platforms/android-xx/options/路径下,如下图:

至此,出现问题的原因搞明白了,我们平时能引用到org.apache.commons.codec.binary.Hex类或者org.apache.commons.codec.binary.Base64这些类,是因为Android自带的org.apache.http.legacyjar包中包含了它们。如果你项目的compileSdkVersionapi 28及以上,那你就需要注意下这个问题了。

参考

Apache HTTP 客户端弃用

相关文章
|
8月前
|
XML JSON Apache
【Android】如何获得Apache服务器的JSON文件数据
【Android】如何获得Apache服务器的JSON文件数据
149 0
|
Android开发
android:ClassNotFoundException for Activity class的解决方法
<p style="margin-top:5px; margin-right:auto; margin-bottom:5px; margin-left:auto; padding-top:0px; padding-bottom:0px; font-family:verdana,'ms song',宋体,Arial,微软雅黑,Helvetica,sans-serif; line-height
1097 0
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
30 1
|
29天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
53 19
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
30天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
58 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
34 5

推荐镜像

更多