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 ...
随机推荐
- spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111
http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...
- python_继承.ziw
2017年1月2日, 星期一 python_继承 null
- R1(上)—R关联规则分析之Arules包详解
Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R ...
- 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结
20155117 王震宇 2006-2007-2 <Java程序设计>第三周学习总结 教材学习内容总结 在JAVA程序编写中,常常要用到对象(Object),要产生对象首先要定义类(Cla ...
- Linux下的lds链接脚本详解【转】
转自:http://www.cnblogs.com/li-hao/p/4107964.html 转载自:http://linux.chinaunix.net/techdoc/beginner/2009 ...
- python基础===如何在列表,字典,集合中根据条件筛选数据
#常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...
- python基础===python自带idle的快捷键
Ctrl + [ Ctrl + ] 缩进代码Alt+3 Alt+4 注释.取消注释代码行Alt+5 Alt+6 切换缩进方式 空格<=>TabAlt+/ 单词完成,只要文中出现过,就可 ...
- WebClient vs HttpClient vs HttpWebRequest
转载:http://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/ Just when I was startin ...
- 在Mac上搭建Python虚拟环境
安装 virtualenv $ sudo pip install virtualenv 然后建立一个测试目录: $ mkdir testvirtual $ cd testvirtual 就可以成功创建 ...
- centos7安装ssh服务
1.查看是否安装了相关软件: rpm -qa|grep -E "openssh" 显示结果含有以下三个软件,则表示已经安装,否则需要安装缺失的软件 openssh-ldap-6.6 ...