Android开发注意点小记
暂时主要讨论以下几点:
- Android引用外部包,报NoClassDefFoundError异常崩溃
- 同名包引用关系问题
- 程序图标
- 9patch图片素材
Android引用外部包,程序报java.lang.NoClassDefFoundError异常崩溃
在Android工程中,引用第三方jar包(尤其是经过本地编译的),在Java代码开发环境中正常编译输出,但到手机等设备上运行时一旦运行到引用该包的代码,立即异常崩溃,系统显示进程意外停止提示窗口,LogCat报出异常信息
dalvikvm Could not find class '引用包.类', referenced from method...
AndroidRuntime java.lang.NoClassDefFoundError: 引用包.类
打开Console控制台窗口,Android监控页中显示异常信息
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx
trouble processing:
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing 引用包/类.class
...while processing 引用包/类.class
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx 1 warning
出现这种错误的原因是,当前Android工程(API17 android4.2.2 ADT v21.1)默认使用的是jdk 1.6(JDK 6.0)编译器,而引用的包编译环境大于1.6(如1.7等),由于编译出的字节码版本不一致,导致无法转换成android虚拟机dalvikvm可读的字节码,因此引用的这个类包实际上并没有被编译到这次输出的apk中,自然程序运行的时候就找不到对应的类文件了。
解决方法:
获取引入包的源代码工程,右击工程菜单: Properties(属性)->Java Compiler 窗口中可以选择工程编译使用的jdk版本,选择1.6或1.5,点击确定,重新编译输出jar包,导入Android工程即可:
PS. Android工程本身是不支持更改jdk编译版本的,如果尝试更改至1.7的话,Console控制台将得到错误输出信息 Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
同名包引用关系问题
同时引入两个同名jar包到工程,例如:
a.jar
|---wavky.wand.A
ab.jar
|---wavky.wand.A
|---wavky.wand.B extends wavky.wand.A
在javaSE中测试,使用 wavky.wand.B 类时,不会导致冲突,但只会引用第一个加载的jar包的类。
在下面的Order and Export界面中,可以调整相应类包的加载顺序,调整 a.jar 到 ab.jar 上面,则类B继承自 a.jar 中的类A(ab.jar中的类A不再被类加载器加载)。
但是,无法通过这种调整加载顺序的方式替换JDK中的包类!
但在Android中,这种调整类加载顺序的方式似乎已经不再起作用,所有外部引用的包自动被整合为一个单独的Android Dependencies,而且跟javaSE的情况一样,无法通过将Android Dependencies调整至顶层的方式替换Android SDK中的原生同名包类,如果外部引用与Android SDK内同名的包,则自动优先使用SDK内的jar包的类,而忽略外部引用。
程序图标
- 根目录\ic_launcher-web.png——512×512分辨率图标,用于google Play市场展示
- 根目录\res\drawable-xdpi\ic_launcher.png——各像素密度下程序图标
9patch图片素材使用
- 除了左、上的扩充像素标记外,右、下的内容范围像素标记也必需涂上(且连续、不断点),否则实际布局显示效果将产生混乱、无法对齐等不可预测现象。
- 在eclipse(ADT)的XML布局设计界面上使用9patch的图片,在API16/17以下的版本保存编译XML会导致IndexOutOfBoundsException
异常,但不影响相应版本系统的运行显示效果,安装使用API16/17 SDK编译即可。相关信息可参考:http://stackoverflow.com/questions/10757997/9-patch-not-working
Android开发注意点小记的更多相关文章
- Android开发-动态布局小记
android动态布局相比静态布局,动态布局不用再将xml转变了布局代码,提高了一定的效率,当然可以忽略不记.动态布局主要是比较灵活,可以很快的在代码中直接修改布局,并直接使用控件进行业务逻辑开发.但 ...
- ADT Android开发环境搭建小记
1.之前因为产品方向原因,Android开发暂时搁浅,最近重新启动,SDK Manager.exe不能启动的话用启动\sdk\tools\adroid.bat即可启动SDK Manager.exe 2 ...
- Android开发的菜鸟小记
1.主线程异常:添加网络连接: 2.权限异常: 3.空指针异常:NullException: 添加网络权限: DEBUG:Connected to the target VM, address: 'l ...
- Linux环境下搭建Android开发环境
最近在折腾linux.因为咱是搞安卓开发的,所以少不了需要搭建Android开发环境,就此小记,希望能给向我一样的开发者一点帮助!开干! 1.安装JDK 下载JDK包,得到的是类似于jdk-8u65- ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- Android 开发一定要看的15个实战项目
前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ...
- Android开发学习之路-关于Exception
Exception在Java中是表示异常的一个类.它是Throwable的子类. 而Exception的子类RuntimeException是一个特殊的异常类,在代码中不需要对此类进行throw,而是 ...
- Android开发学习之路-Android中使用RxJava
RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...
- Android开发学习之路-记一次CSDN公开课
今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确. 原话是这样的:点击事件可以通过事件监听和回调两种方法实现. 我一听到之后我的表情是这样的: 这跟我学的看的都不 ...
随机推荐
- Hive优化之谓词下推
Hive优化之谓词下推 解释 Hive谓词下推(Predicate pushdown) 关系型数据库借鉴而来,关系型数据中谓词下推到外部数据库用以减少数据传输 基本思想:尽可能早的处理表达式 属于逻辑 ...
- 【Android】下拉刷新实现
关于这方面的文章百度下有很多,我就只写写我自己实现过程. 我觉得学习一门语言不是做了几个项目就可以认为自己会了,这只是暂时的,若没有笔记,时间长了,你是怎么解决某些问题,估计连你自己都忘了,又得费时费 ...
- scrapy编写爬虫的时候出现缺少win32api
环境:python3.6 工具:pycharm2017.3 scrapy fetch http://www.baidu.com ModuleNotFoundError: No module named ...
- 使用 MySQL 存储 Hue 元数据
1.在 MySQL 中增加数据库 hue 2.编辑 hue.ini 文件 [[database]] # Database engine is typically one of: # postgresq ...
- git 本地分支与远程分支 新建/删除/合并
github上已经有master分支 和dev分支 在本地 git checkout -b dev 新建并切换到本地dev分支 git pull origin dev 本地分支与远程分支相关联 在本地 ...
- Electron入门应用打包exe(windows)
最近在学习nodejs,得知Electron是通过将Chromium和Node.js合并到同一个运行时环境中,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一门技术.对于之前一直从 ...
- [转] Bash脚本:怎样一行行地读文件(最好和最坏的方法)
用bash脚本读文件的方法有很多.请看第一部分,我使用了while循环及其后的管道命令(|)(cat $FILE | while read line; do … ),并在循环当中递增 i 的值,最后, ...
- 设置socket接收和发送超时的一种方式
Linux环境设置Socket接收和发送超时: 须如下定义:struct timeval timeout = {3,0}; //设置发送超时setsockopt(socket,SOL_SOCKET, ...
- ProxySQL初体验
Preface As we all know,it's a common sense that separate reading and writing operations can ...
- 《python核心编程第二版》第3章习题
3-1. 标识符.为什么 Python 中不需要变量名和变量类型声明? 答: 对象的类型和内存占用都是运行时确定的. 尽管代码被编译成字节码,Python 仍然是一种解释 型语言. 在创建也就是赋值时 ...