1)、linux kernel
该层是使用google自己精简优化过的linux系统,使其更适合内存和电量有限的移动设备。
主要是负责系统底层的内存管理,安全管理,进程调度以及硬件进行通讯等等,并对其上层提供服务。
2)、android runtime
包含两部分:
1、core libraries(核心库),该核心库提供大部分在j**a编程语言核心类库中可用的功能。
2、dalvik 虚拟机。dalvik是google公司自己设计用于android平台的j**a虚拟机,dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个dalvik 应用作为一个独立的linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
dalvik和jvm的几点区别。
1、dalvik 基于寄存器,而 jvm 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。
2、dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾**等等重要功能。
3、dalvik负责进程隔离和线程管理,每一个android应用在底层都会对应一个独立的dalvik虚拟机实例,其**在虚拟机的解释下得以执行。
4、不同于j**a虚拟机运行j**a字节码,dalvik虚拟机运行的是其专有的文件格式dex,ex文件格式可以减少整体文件尺寸,提高i/o操作的类查找速度。
5、所有的android应用的线程都对应一个linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。
3)、libraries
android包含一个c/c++库的集合,供android系统的各个组件使用。例如:
libc:这是系统的c库,media framework: **库,surfacemanager 显示系统管理库,负责把2d或3d内容显示到屏幕,webkit,浏览器内核等不同的库。
供上层调用。
4)、application framework
应用程序框架,也是我们开发的时候打交道最多的,给我们提供里丰富多彩的应用程序api,通过这些我们可以做出丰富多彩的应用。
activity manager(活动管理器),主要负责程序生命周期的管理。
content providers (内容提供者),使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据。
resource manager (资源管理器),提供访问非**资源,如本地化字符串、图形和布局文件。
view (试图),丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器。
5)applications
四层中的最上层,在系统中安装的应用程序,就位于该层,我们以后写的程序也基本在该层运行,全部由j**a语言编写,当然android也允许用户使用c和c++编写程序的。
2、android应用程序的目录结构。
1、src: 没什么好说的,就是我们的源**了。
2、gen: 不知道gen是不是generate的缩写,gen目录存放系统自动维护的一些文件,主要是 文件由adt自动维护,主要是为res目录下面的xml,图像,**等文件同步生成一个类似字典的东西,系统中对这些资源的引用可以通过r文件来操作。在编译的时候会对r文件进行检查,如果r文件中没有引用的资源不会被编译打包,以节省系统资源,另外,r文件只有一个,我们不需要也不要去改里面的内容。
3、assets:assets也是一个资源文件夹,assets中的资源可以被打包到程序里面,和res不同的地方是,adt会为res下面的文件在r文件中生成一个id,而不会为assets中的资源生成id,因此要使用该目录下面的文件,需要通过完整路径的方式进行调用。(该目录下面的文件不会被编译,直接复制到程序安装包中)
4、res:资源目录(我们不能在res目录下面建立自定义目录,以及为已有的目录建立子目录)
drawable:主要存放不同分辨率的**文件。
1)drawable-hdpi里面存放高分辨率的**,如wvga (480x800),fwvga480x854)
2)drawable-mdpi里面存放中等分辨率的**,如hvga (320x480)
3)drawable-ldpi里面存放低分辨率的**,如qvga (240x320)
layout:存放用于布局的xml文件。
values:用于存放一些常量(不同类型的变量存放在不同的文件中,该目录中xml的文件名是不能改的)
定义字符串和数值。
定义数组。定义颜色和颜色字串数值。
定义尺寸数据。
定义样式。anim:存放一些和动画有关的xml文件。
xml:存放一些自定义的xml文件。
raw:该目录下面的文件不会被编译,直接复制到程序安装包中。
xml**
2 lt;manifest xmlns:android=""
3 package=""
4 android:versioncode="1"
5 android:versionname="1.0">
9 10android:label="@string/app_name">
xmlns:android:包含命名空间的声明。xmlns:android=""使得android中各种标准属性能够在文件中使用,提供大部分元素的数据。
package:声明应用程序包。
application:包含package中application级别组件声明的根节点。此元素耶可包含application的一些全局和默认的属性,如标签、icon、主题、必要权限等。
一个manifest能够包含零个或一个此元素,不能大于一个。
android:icon:应用程序图标。
android:lebel:应用程序名字。
activity:用户交互工具。
android:name:应用程序默认启动的activity。
intent-filter:声明了指定一组组件支持的intent值,从而形成intentfilter。
action:组件支持的intent action 。
category:组件支持的intent category。指定应用程序默认启动的activity。
uses-sdk: 应用程序所使用的sdk版本。
android调试方法大全。
jason in
写**是每个程序员最乐意做的事,然而在开发中也会遇到很多令程序员很头疼的事情。如果说让程序员最头疼的事情是看到无数bug、软件的发布遥遥无期,那么让程序员最最头疼的事情是程序在调试状态下没有问题然而在实际运行中确有问题。
调试程序是每个程序员工作中必不可少的部分,而且可以毫不夸张地说调试程序占用了程序员50%的工作时间。由此可见,调试程序是每个程序员必不可少的技术,调试水平的高低决定了程序员水平的高低。
在开发android程序前,有必要总结下如何调试android程序。
目前就开发过程中,常用调试程序的方法总结如下:
1 使用eclipse开发平台调试;
2 结合android sdk调试;
3 使用junit调试;
使用eclipse开发平台调试。
这是使用eclipse工具开发android必须熟练掌握的调试技术,主要包括:设置断点、查看变量值、查看当前堆栈等。打开eclipse工具,单击“run”
以及在调试的过程中,打开其他调试面板,相信只要使用一次就完全明白了。不要小瞧这些调试工具,只要你细心,说不定其他同事好几天没有解决的bug,你通过这些工具就发现了。所以熟练使用这些工具,是开发人员必须的,在有些时候甚至可以事半功倍的效果。
结合android sdk调试。
在复杂的程序运行过程中,如何调试程序了?把程序运行过程的信息保存为文件或者输出到ide中,这样就可以知道程序是否是正常运行了。
在android中可以使用log类,log类在包中,可以使用它将运行过程的信息输出到ide中,直接查看程序运行的过程。log 类提供了若干静态方法 :
tag, string msg); tag, string msg); tag, string msg); tag, string msg); tag, string msg);
分别对应 verbose,debug,info,warning,error。 tag是一个标识,可以是任意字符串,通常可以使用类名+方法名,主要是用来在查看日志时提供一个筛选条件。程序运行后,在show view中选择locat就可以直接看到输出了。
也可以在程序运行后,可以通过ddms 查看程序的运行过程记录,并可以通过string tag来过滤输出的信息,关于android ddms如何使用,请阅读android ddms使用详细说明。
除了以上方法外,我们也可以把程序运行过程信息的输出当作程序运行的一部分,比如使用toast notificatio将输出信息显示在界面中,当然这些只是些调试**,在发布程序时需要去掉。
最后一种方法,也是最有效的一种方法,直接将运行过程的信息以文件的方式存储,在程序运行后打开文件,查看输出的信息。在一些复杂的工具中,都是用这种日志文件的方法来记录文件运行的过程。如何在android中读写文件,请阅读android数据存储(总结篇)。
看了以上2种方法是否觉得:以上只是在发现问题后找到问题的原因,解决问题,是不是有些被动的、消极的,有没有其他有效的方法来避免bug?看到这里,有些“牛”人就说了:
我写的**几乎没有bug,我的**好几年都没有发生过崩溃现象了。从我个人的观点说:的确牛。
至少我自己,感觉自己的**似乎很脆弱,要想写一个完全正确的**真的不容易。自己考虑了很多,为什么会这样,难道是自己写的**的确很差?至少我自己在写**的过程中都是很仔细的,尽量把问题考虑清楚了在写的,每次修改都是小心翼翼的!
后来发现,每段**在写的时候都是有一些“运行环境”的,在后来使用的过程中,这个环境逐渐被破坏,以致最后修改的乱七八糟。如果你也有同受,建议你仔细阅读以下说明!
使用junit调试。
android增加了对junit的支持,这对程序员来说,是个很好消息。
首先说明下junit是用来解决什么问题的?junit是采用测试驱动开发的方式,也就是说在开发前先写好测试**,主要用来说明被测试的**会被如何使用,错误处理等;然后开始写**,并在测试**中逐步测试这些**,直到最后在测试**中完全通过。
看了是否感觉有些不符合程序员的思维习惯(先写**然后在调试),的确这也是junit是对程序员思维的“颠覆”。在这里我自己也感觉,好像很难做到,为什么?在一匹“马”没有完全设计好前,怎么规定这匹“马”将来会如何跑?
而且即使把“马”将来会如何“跑”定义好了,在实现的时候“马”被改变了怎么办?说到底还是:一个人不能同时具有2个角色,否则自己有时候就不知道当前是哪个角色!
说到这里,我就说明下,我自己对junit “错误”的使用方法,这也许与junit测试驱动开发的目的相矛盾,但是的确可以有效地减少bug。junit从核心来说就是将源**与测试**完全分开,将测试**作为一个单独的程序。前面介绍的方法,都将源**与测试**合为一体,由于源**的重要性大于测试**的重要性,所以测试**经常有不完整、结构不清晰等问题,这样程序员的单元测试也就不完整。
junit就是被我用来做完整的单元测试,对当前的部分**,测试其在每种“环境”下的运行结果。
现简要说下junit的几个主要功能:
4 junit首先有管理测试用例的功能。修改了哪些**,这些**的修改会对哪些部分有影响,通过junit将这次的修改做个完整测试。这也就junit中所谓的testsuite。
5 如何定义需要测试的**?这也就是junit中所谓的testcase,根据源**的测试需要定义每个testcase,并将testcase添加到相应的testsuite方便管理。
6 如何定义测试的“环境”?在testcase测试前会先调用“环境”配置,在测试中使用,当然也可以在直接测试用例中定义测试“环境”。
7 最为重要的部分,测试结果的检测。对于每种正常、异常情况下的测试,运行结果是什么、结果是否是我们预期的等都需要有个明确的定义,junit在这方面提供了强大的功能。
android笔记
button跳转页面。package import import import import import public class demomain extends activity 在中增加。设置背景。在res里建drawable的文件夹,把背景 放到文件夹中,在布局中输入android bac...
android笔记
code jdk net io 本地文件。j a class jvm dvmc c j a 900万人 j a android应用开发 app android系统开发。android移植开发。flv rmvb mp4 3gp 1.android源码,修改libraries,c 写插件 flv j a...
android笔记
android中调用activity的常用的纯背景颜色有 如图 开始动画 帧动画 第一种方式启动帧动画 在activity启动时会自动运行动画 animationdrawable ad imageview iv imageview findviewbyid animationdrawable 当一个...