原文:Posted by Foxykeep on 22/03/2012

http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17


在升级了我的Android SDK和ADT到版本17后,我又遇到了一个大问题:)


在使用了第三方JAR包的工程中,我仍然能正常编译,但只要在手机上一运行,程序就会直接崩溃,错误信息如下:


[plain] view plain copy
  1. <spanstyle="font-size:16px;">03-2119:20:56.455:E/AndroidRuntime(24471):FATALEXCEPTION:main
  2. 03-2119:20:56.455:E/AndroidRuntime(24471):java.lang.NoClassDefFoundError:org.acra.ACRA
  3. 03-2119:20:56.455:E/AndroidRuntime(24471):atcom.foxykeep.myproject.HomeActivity.onCreate(MyProjectApplication.java:127)
  4. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
  5. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.app.ActivityThread.handleBindApplication(ActivityThread.java:3925)
  6. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.app.ActivityThread.access$1300(ActivityThread.java:122)
  7. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1184)
  8. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.os.Handler.dispatchMessage(Handler.java:99)
  9. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.os.Looper.loop(Looper.java:137)
  10. 03-2119:20:56.455:E/AndroidRuntime(24471):atandroid.app.ActivityThread.main(ActivityThread.java:4340)
  11. 03-2119:20:56.455:E/AndroidRuntime(24471):atjava.lang.reflect.Method.invokeNative(NativeMethod)
  12. 03-2119:20:56.455:E/AndroidRuntime(24471):atjava.lang.reflect.Method.invoke(Method.java:511)
  13. 03-2119:20:56.455:E/AndroidRuntime(24471):atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  14. 03-2119:20:56.455:E/AndroidRuntime(24471):atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  15. 03-2119:20:56.455:E/AndroidRuntime(24471):atdalvik.system.NativeStart.main(NativeMethod)</span>

于是我在Google+上问了Xavier Ducrohet和Tor Norbye(两者都是ADT插件的开发人员)关于此问题的原因,他们给了我这个页面链接(http://tools.android.com/recent/dealingwithdependenciesinandroidprojects),解释了如何去解决此问题,但解释得不是非常清晰(至少对我是这样)。


关于这个问题,下面我截的这几个图能更容易地说清楚:



从左到右三个图分别是:
1.我的ADT16版的工程(三个截图的细节图标有些不一样,因为第一个是Windows的Eclipse下截的图,而另两个是在Mac的Eclipse下截的)
2.我修复前的ADT17版工程
3.我修复后的ADT17版工程


从中我们可以看到:
1.蓝色方框中的内容变化,是由新版补丁引起的(后面详细说明)
2.红色方框的内容变化,是我做的修复工作的结果


我所做的修复工作如下:
1.从标准的Java编译路径中移除第三方JAR包
在工程名称上点右键 > Properties > Java Build Path > Libraries标签 >移除Android SDK之外的所有第三方JAR包
2把JAR包所在的文件夹名称从“lib”修改为“libs”
这样做之后,ADT能自动找到所有在libs文件夹下的JAR包,把他们加到工程的依赖路径中,并直接显示在Android Dependecies分类下。
3.清理整个工程(可能需要也可能不用)
4.完成修复,可以正常运行了


导致此问题的原因,是新版的ADT管理JAR包的方式发生成变化,旧版支持两种不同的JAR包引用(一是Android工程的库,另一个是标准的库),新版则把这两者合并到Android Dependencies下了。


另外,新增加的annotations.jar提供了新的优化提示功能(更新信息请参阅http://tools.android.com/recent/ignoringlintwarnings)


除了这个小问题,新版的ADT17看起来很不错,我也很喜欢新的优化检查功能。


【更新】
开发团队DroidUX找到另一个解决此问题的办法,我没有亲自测试,但看起来应该也行得通,内容如下:


嗨,各位:

下面是问题的解决办法:

如果你引用了不在libs目录下的第三方JAR文件,比如你用了“classpath”变量,你可以通过导出引用来解决ADT17下报NoClassDefFoundError错误的问题。

导出引用的步骤:只需要转到“Properties > Java Build Path > Order and Export”,然后把你想要导出引用的全部勾选上就可以了。

祝顺利!

——DroidUX团队

更多相关文章

  1. 《第一行代码》第十二章引用toolbar出错,从android升级到androidx
  2. Android(安卓)Studio App 播放工程内部音乐文件
  3. linux下 在Android工程中查看framework java层的代码
  4. 如何快速定位SElinux问题并修复?
  5. aapt dump badging 找不到'android:versionCode' Bug解决
  6. cocos2d-x环境配置
  7. android 使用android.support.v7 添加ActionBar
  8. android+eclipse+phonegap1.7(cordova)配置项目 .
  9. eclipse 上使用recycleview,cardview的办法

随机推荐

  1. 用Android-X86和VirtualBox打造高性能And
  2. Android 应用程序退出后不在运行列表中显
  3. Android TextView前加图标垂直居中第一行
  4. Android(安卓)View(四)-View相关属性详解
  5. Android(安卓)重用Layout
  6. android手势实现图片的拖动和缩放效果
  7. android nfc中Ndef格式的读写
  8. Android开发新手常见的10个误区
  9. Android设置TextView的Selector来控制点
  10. Android Lottie动画