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 客户端弃用

相关文章
|
4月前
|
XML JSON Apache
【Android】如何获得Apache服务器的JSON文件数据
【Android】如何获得Apache服务器的JSON文件数据
104 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
1070 0
|
2天前
|
Android开发 开发者 Kotlin
探索安卓开发中的新特性
【9月更文挑战第14天】本文将引导你深入理解安卓开发领域的一些最新特性,并为你提供实用的代码示例。无论你是初学者还是经验丰富的开发者,这篇文章都会给你带来新的启示和灵感。让我们一起探索吧!
|
6天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
2天前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
|
4天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
6天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
18 5
|
6天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
17 5
|
7天前
|
安全 Android开发 开发者
探索安卓开发的未来:Kotlin的崛起与Flutter的挑战
在移动开发的广阔天地中,安卓平台始终占据着举足轻重的地位。随着技术的不断进步和开发者需求的多样化,Kotlin和Flutter成为了改变游戏规则的新玩家。本文将深入探讨Kotlin如何以其现代化的特性赢得开发者的青睐,以及Flutter凭借跨平台的能力如何挑战传统的安卓开发模式。通过实际案例分析,我们将揭示这两种技术如何塑造未来的安卓应用开发。
23 6