Android升级ADT22后会报ClassNotFoundException的原因分析
http://blog.csdn.net/huzgd/article/details/8962702
1.ADT16下,只要add to path就是add to path并export;
2.ADT21下,普通路径要手工add to path且不会export,但放libs下就会自动add to path并export;
3.ADT22下,放libs下就是add to path,也可以手工add to path,但都不export,要自己去勾选export了。
最近有个同事跟我报怨说,他的系统重装Eclipse使用新的ADT22后,编译的android apk运行总会报ClassNotFoundException错误。我说这怎么可能,谷歌这么大的公司出来的东西怎么可能有这种问题。他说不信你试试, 我说试试就试试。我之前用的是ADT21,结果升到ADT22后一运行,晕,不得不服,还果真是ClassNotFound了。
接下来我又换了几个工程编译运行,发现并不一定是所有工程都有错,而是部分使用了第三方JAR包或库工程的APK才会出错,也就是说,NotFound的Class都是在引用的JAR包里的。
接下来自然是在网上找解决办法了,最后也找到了,就是在.classpath里给 com.android.ide.eclipse.adt.LIBRARIES加exported=true,或者在工程属性Java Build Path的Order and Export里勾选Android Private Libraries,将相关的库导出到APK里。
问题解决了,但为什么要这么做呢?之前ADT21为何又不需要呢?我另一台机器使用的还是ADT21,因此我把两个版本的ADT工程属性比较了一下,发现还真不一样。下面这个是ADT21的:
其中相互对应的包和源码我用红线相连起来了以便分析。下面这个是ADT22的:
显然,ADT21把所有引用的JAR包都归纳为Android Dependencies,而ADT22是自动将JAR分成Android Private Libraries和Android Dependencies两类了。ADT21不需要勾选Export就能自动将所有引用的JAR包导出并打包到APK,而ADT22则给开发人员选择权 限,让开发人员自己决定哪些包要导出到APK里。比如程序面向的是高版本的Android系统,可以选择不需要导出低版本的某些支持包。
显然ADT22比ADT21更合理,用户没勾选的包自然是不应该导出的。但话说回来,其实基本上大部分情况下我们既然把包加到工程里就是需要导出的。在上图情况下,要达到ADT21版本的导出效果,其实只需要把最后两项勾选上,如下图:
这样ADT就会把相应的JAR包里的类也打包到APK里,再运行就不会找不到类了。
其实要说ClassNotFound这个问题,安卓的开发人员应该都已经不是第一次遇上,在从ADT16升级到ADT17时,就已经搞过一回。再 ADT17之前,只要是在工程Build Path里的JAR,不管放在哪,ADT都会自动编译进APK里;但到了ADT17就得把要导出的包全放在libs目录下。为此我还翻译了老外一篇文章, 参见:http://blog.csdn.net/huzgd/article/details/7604069。
从任何JAR都自动导出,到只导出libs目录的JAR,到只导出勾选的JAR,应该说ADT是在改进,但也带来升级的麻烦。总得来说并不是 ADT22有问题,而是ADT21之前的编译工具不规范,ADT22只是更规范。就说嘛谷歌不会这么容易令人失望的,但就是会折腾人。
Android升级ADT22后会报ClassNotFoundException的原因分析的更多相关文章
- 修改List报ConcurrentModificationException异常原因分析
使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...
- Android ListView异步载入图片乱序问题,原因分析及解决方式
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android全部系统自带的控件其中,ListView这个控件算是 ...
- c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法
原因分析:首先,目前大多数网站为了提升网页浏览传输速率都会对网站内容在传输前进行压缩,最常用的是GZIP压缩解压解压算法,也是支持最广的一种. 因为网站传输时采用的是GZIP压缩传输,如果我们接受we ...
- 关于J-LINK升级最新固件后无法连上的一点分析
昨天升级了最新的 Keil MDK 4.53,怕它老是提示 J-Link 要升级,就去 SEGGER 的网站下了个最新版的 J-Link 软件包(4.46F 版的),装好后运行 J-Link Comm ...
- maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析
1.maven打包: 一直以来我都没太注意过在myeclipse下使用run as来clean居然对项目的target目录没有进行操作,要让操作有效,需要进入到maven build...选项下,进行 ...
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报java.util.ConcurrentModificationException异常,下面看一个例子演示: package ...
- phpcms v9升级后台无法上传缩略图的原因分析
phpcms V9 是目前国内使用人数最多的一款开源免费的CMS系统,正是由于他的免费性,开源性,以及其自身的功能性比较强大,所以倍受许多站长朋友们的亲来,以及许多的公司的喜欢.phpcms也为了完善 ...
- Android setVisibility(View.GONE)无效的问题及原因分析
解决方案:可以在setVisibility()之前调用clearAnimation()方法清除掉动画,或setFillAfter(false)(时间上该函数内部也调用了clearAnimation() ...
- 【转】Android WiFi 经常掉线出现的几个原因分析!
原因1.从Log分析来看,这个是由于Dhcp request fail 导致最终disconnect . Log 分析如下: 16:53:31.659 958 6525 D NetUtils: dhc ...
随机推荐
- z-index详细攻略
概念 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 层级关系的比较 1. 对于同级元素,默认(或position:static)情况下文档流后面的 ...
- 分块+deque维护 Codeforces Round #260 (Div. 1) D. Serega and Fun
D. Serega and Fun time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...
- ⑤ 设计模式的艺术-05.原型(Prototype)模式
场景 思考一下:克隆技术是怎么样的过程? 克隆羊多利大家还记得吗? javascript语言中的,继承怎么实现?那里面也有prototype,大家还记得吗? 原型模式 通过new产生一个对象需要非常繁 ...
- Stat1—浅谈协方差矩阵
今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~本文我将用自认为循序渐进的方式谈谈协方差 ...
- iOS程序启动原理---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
- python初步学习-异常
异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常. 异常是python对象,表示一个错误. 当python脚本 ...
- Android设备相关配置
http://source.android.com/devices/tech/storage/index.html Android supports devices with external sto ...
- 144.Binary Tree Preorder Traversal---二叉树先序、中序非递归遍历
题目链接 题目大意:返回二叉树的先序遍历list.中序见94,后序见145. 法一:普通递归遍历,只是这里多了一个list数组,所以分成了两个函数.代码如下(耗时1ms): public List&l ...
- MAC 文件被锁定
从windows拷贝到MAC的文件,有时候会被锁定.右键-简介-已锁定也是灰色的,无法取消: xattr -l 文件名 xattr -d com.apple.FinderInfo 文件名
- fullpage.js 具体使用方法
1.fullpage.js 下载地址 https://github.com/alvarotrigo/fullPage.js 2.fullPage.js 是一个基于 jQuery 的插件,它能够很方便 ...