安卓系统结构

安卓系统结构详解

什么是Android?Android详解:Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和T-Mobile 在内的30 多家技术和无线应用的领军企业组成。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,我们希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。我们认为此举必将推进更好、更快的创新,为移动用户提供不可预知的应用和服务。

Android的应用程序框架:
以HelloActivity程序为例,简单介绍Android应用程序的框架。希望读者可以根据HelloActivity,自己写出一个Andorid的应用程序。


  HelloActivity工程的源代码在Android目录的development/samples/HelloActivity/中,代码的结构如下所示:
development/samples/HelloActivity/
|-- Android.mk
|-- AndroidManifest.xml
|-- res
|   |-- layout
|   |   `-- hello_activity.xml
|   `-- values
|       `-- strings.xml
|-- src
    `-- com
        `-- example
            `-- android
                `-- helloactivity
                    `-- HelloActivity.java

  其中tests是一个独立的项目,可以暂时不考虑。其他部分看作一个Android的一应用程序的工程。这个工程主要的组成部分如下所示:
Android.mk
是整个工程的“Makefile”,其内容如下所示:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := samples
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := HelloActivity
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
其中LOCAL_PACKAGE_NAME表示了这个包的名字。这个文件是最终生成的包(*.apk)的名称,注意,包的名称和应用程序目录的名称无关,而与这里的HelloActivity的名称有关。

AndroidManifest.xml

工程的描述文件



    package="com.example.android.helloactivity">
   
        
            
               
               
            
        
   

  在工程描述文件中,package的名称需要和JAVA文件中包的名称相同,activity 的名称必须和JAVA文件中JAVA类的名称相同,JAVA文件的文件名也必须和其中类的名称相同。
  而那个android:label的名字既是应用程序在菜单中的名字,也是应用程序启动后的标题。

HelloActivity.java
这是JAVA类文件,这个文件的路径表示在Andorid的JAVA包的结构中的位置,这个包的使用方式为com.example.android.helloactivity。

package com.example.android.helloactivity;
import android.app.Activity;                
import android.os.Bundle;                  
public class HelloActivity extends Activity {
    public HelloActivity() {
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hello_activity);
    }
}

AndroidManifest.xml和*.JAVA的名称需要匹配(这里的HelloActivity.java和HelloActivity),否则是找不到JAVA类的。

  程序编译完成后,将生成apk包,将其放置在system/app中即可。除了使用界面启动之外,还可以在QEMU仿真器的启动界面中,使用如下的方式启动:
am start -n com.example.android.helloactivity/com.example.android.helloactivity.HelloActivity

事实上,启动的方法和工程描述文件中包的名称和类的名称有关。

几个注意点:
  1、应用程序文件夹的名称并无实际的影响
  2、Android.mk的LOCAL_PACKAGE_NAME,决定APK包的名称;
  3、AndroidManifest.xml中需要包含包的名称和activity类的名称,并需要和JAVA文件中对应;
  4、AndroidManifest.xml中application android:label的名称既是应用程序在界面中的名称,也是启动后的标题


Android核心模块及相关技术:
Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下几个层次:  第一、操作系统层(OS)
  第二、各种库(Libraries)和Android 运行环境(RunTime)  第三、应用程序框架(Application Framework)  第四、应用程序(Application)  以下分别介绍Andoid各个层次的软件的重点及其相关技术:
  ● 操作系统层(OS)
  Android使用Linux2.6作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。主要的驱动如下所示:
  显示驱动(Display Driver):
  基于Linux的帧缓冲(Frame Buffer)驱动
  键盘驱动(KeyBoard Driver):
  作为输入设备的键盘驱动
  Flash内存驱动(Flash Memory Driver):
  基于MTD的Flash驱动程序
  照相机驱动(Camera Driver):
  常用基于Linux的v4l2(Video for Linux)驱动。
  音频驱动(Audio Driver):
  常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动
  蓝牙驱动(Bluetooth Driver):
  基于IEEE 802.15.1标准的无线传输技术
  WiFi驱动(Camera Driver):
  基于IEEE 802.11标准的驱动程序
  Binder IPC驱动:
  Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能
  Power Management(能源管理)
  ● 各种库(Libraries)和Android 运行环境(RunTime)
  本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android 运行环境。本层的内容
  大多是使用C++实现的。
  在其中,各种库包括:
  C库 :C语言的标准库,这也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。
  多媒体框架(MediaFrameword):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共
  分为两大部分,一个部分是音频、视频的回放(PlayBack),另一部分是则是音视频的纪录(Recorder)。
  SGL:2D图像引擎。
  SSL:即Secure Socket Layer位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
  OpenGL ES 1.0 :本部分提供了对3D的支持。
  界面管理工具(Surface Management):本部分提供了对管理显示子系统等功能。
  SQLite:一个通用的嵌入式数据库
  WebKit:网络浏览器的核心
  FreeType:位图和矢量字体的功能。
  Android 的各种库一般是以系统中间件的形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切相关。
  Android 运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般JAVA虚拟机(Java VM)不同,它执行的不是JAVA标准的字节码(bytecode )而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。 二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。
  ● 应用程序框架(Application Framework)
  Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以JAVA构建的,因此本
  层次提供的首先包含了UI程序中所需要的各种控件:
  例如: Views (视图组件)包括 lists(列表), grids(栅格), text boxes(文本框), buttons(按钮)等。甚至一个嵌入式的Web浏览器。
  一个Andoid的应用程序可以利用应用程序框架中的以下几个部分:
  Activity (活动)
  Broadcast Intent Receiver (广播意图接收者)
  Service (服务)
  Content Provider (内容提供者)
  ● 应用程序(Application)
  Android的应用程序主要是用户界面(User Interface)方面的,通常以JAVA程序编写,其中还可以包含各种资源文件(放置在res目录中)JAVA程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home),联系人(Contact),电话(Phone),浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。
                                                                        
怎样使用Eclipse来开发Android源码:
用eclipse+ADT作为android开发工具,可以说是很方便的,在HelloActivity小程序里我们就感觉到eclipse功能的强大。那么,我们可以用eclipse来开发android源码吗?如果我们直接把android源码里一个工程导入eclipse,一般来说都会出现错误,说许多类库(包)找不到。  今天找到关于怎样使用eclipse来开发android源码的官方文档:
  https://sites.google.com/a/android.com/opensource/using-eclipse(需要翻墙,谷歌在中国的地位越来越低了...)
  从该文档和实践可以总结出几点:
  1、可以使用eclipse来编辑JAVA程序、检查错误(主要是类库包含和语法方面),但是不能在eclipse上编译运行android源码,还是得在shell中make(或mm或mmm)
  2、android源码文件夹里提供有一些eclipse配置文件,
  .claapath:eclipse工程的配置文件,方便我们直接把android源码相应的文件和JAVA包导入工程
  android-formatting.xml和android.importorder:这个很重要,主要是用来规范我们的编码风格,更容易使我们的代码风格一致
  3、把android源码作为一个工程导入eclipse时,必须注意两点
  1)、新建的工程必须是javaproject,不能是androidproject,否则会破坏android源码(一般是多添加文件/文件夹)
  2)、导入前最好检查.classpath里的文件在android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹)
  总的来说:
  1、用eclipse来编辑代码、检查错误
  2、不在eclipse上编译、运行android源码程序,只能在命令行通过make(或mm或mmm)编译android源码
  3、可以在eclipse上调试android源码程序(原理:eclipse通过ddms服务器在emulator上进行调试),并可以单步调试、断点调试。
  下面,从官方文档总结出具体怎样用eclipse来开发android源码
  1、建立基本的android开发环境
  请参考官方文档或<android模拟器在ubuntu8.10的安装>
  2、编译android源码
  android源码根目录下通过make进行编译,请注意一些配置,具体可参考<android源码的编译>
  3、把eclipse工程配置文件复制到android源码根目录下
  cp development/ide/eclipse/.classpath ./
  chmod u+w .classpath # Make the copy writable
  4、修改eclipse程序的配置
  1)、修改eclipse缓存设置
  把eclipse.ini(在eclipse软件的安装目录下)的3个值改为下面的值:
  -Xms128m
  -Xmx512m
  -XX:MaxPermSize=256m
  2)、把android-formatting.xml和android.importorder导入eclipse
  android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
  android-formatting.xml用来配置eclipse编辑器的代码风格;android.importorder用来配置eclipse的import的顺序和结构。
  在window->preferences->java->Codestyle->Formatter中导入android-formatting.xml
  在window->preferences->java->Codestyle->OrganizeImports中导入android.importorder
  3)、安装anyedit插件(可选)
  在http://andrei.gmxhome.de/anyedit/下载并导入eclipse中
  5、把android源码作为一个工程导入eclipse
  导入前先检查.classpath里的文件在android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹),.classpath里多余的路径可删除
  新建JavaProject(不是androidproject,否则会破坏android源码),选择从已存在的工程导入,工程名任意,完成。
  导入时,eclipse要build工程,比较慢。导完后,一般都没有错误。
  6、eclipse上调试android里的程序。
  先执行:
  cd android源码目录
  . build/envsetup.sh
  lunch 1 # to build the emulator
  emulator & # you should see a GUI picture of a phone
  ddms & # you should get a splufty debugging console
  然后在eclipse中配置调试类型和端口:
  在Run->Debug Configurations->Remotejavaapplication上双击,然后,”Host:”设为localhost,”Port:”设为8700,”ConnectionType”为Standard(SocketAttach)
  然后“Apply”
  注意,在点击”Debug”时苦出错,说8700端口被占用,那么把DDMS程序关掉,重新打开DDMS就OK了。如果提供连不到VM错误时,请注意,要先在DDMS中选中某一进程(对应某一应用程序),才能在eclipse执行Debug。
  在eclipse调试时,可以设断点、单步调试。估计google团队也是这样开发、调试android应用程序的
  7、编译android源码
  执行:
  cd android源码目录
  . build/envsetup.sh
  那么就会多出mm/mmm等命令,mm/mmm用来编译模块(包括C、C++、JAVA程序)。我们也可以直接在android源码根目录下执行“make模块名”来编译模块。

Android中各种JAVA包的功能描述:
在Android的应用程序开发中,通常使用的是JAVA语言,除了需要熟悉JAVA语言的基础知识之外,还需要了解Android提供的扩展的JAVA功能。  在一般的JAVA应用中,如果需用引用基础类库,通常需要使用如下的方式:
import javax.swing.*;
  以上代码表示了引用JAVA的GUI组件Swing,javax.swing即JAVA中的一个包。
  android提供一些扩展的JAVA类库,类库分为若干个包,每个包中包含若干个类。例如:在Android中计算器是一个相对简单的程序,其入口程序文件为Calculator.java,该文件包含了以下内容:
package com.android.calculator2;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.Config;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.content.res.Configuration;
在Android中,各种包写成android.*的方式,重要包的描述如下所示:
android.app :提供高层的程序模型、提供基本的运行环境
android.content :包含各种的对设备上的数据进行访问和发布的类
android.database :通过内容提供者浏览和操作数据库
android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.
android.location :定位和相关服务的类
android.media :提供一些类管理多种音频、视频的媒体接口
android.net :提供帮助网络访问的类,超过通常的java.net.* 接口
android.os :提供了系统服务、消息传输、IPC机制
android.opengl :提供OpenGL的工具
android.provider :提供类访问Android的内容提供者
android.telephony :提供与拨打电话相关的API交互
android.view :提供基础的用户界面接口框架
android.util :涉及工具性的方法,例如时间日期的操作
android.webkit :默认浏览器操作接口
android.widget :包含各种UI元素(大部分是可见的)在应用程序的屏幕中使用

Android应用开发入门五问:
1. Android是什么?  Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌与开放手机联盟合作开发了 Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。
  Android 作为谷歌企业战略的重要组成部分,将进一步推进"随时随地为每个人提供信息"这一企业目标的实现。
  2. Android用什么语言开发的?
  Android的SDK(software development kit)是Java的,将来可能有其他语言版本。
  SDK下载地址:http://code.google.com/android/download.html
  3. Android模拟器是用什么开发的?
  Android的核心是Java虚拟机,为了高效,目前来看,google是不会支持其它语言的开发的。不过,android的模拟器是用qeum开发的,它的镜像文件分成4部分放在tools目录下,如果我们将qeum修改一下,说不定能玩一下它的linux系统。
  4. 怎么进行Android开发?
  Android支持在模拟器上运行和调试应用软件,有兴趣的朋友可以下载他的SDK(software development kit)来了解android的界面;然后应该学习android的基本框架和应用程序的构成;最后就可以试着在sdk的API Demo的基础上开发自己的application了。
  希望刚刚了解软件开发的朋友不要着急,一步一个脚印,一定会茁壮成长,开发优秀的application的。
  5. 有哪些好的网络资源可供Android学习者用的呢?
  首先,最好的最基本的学习资料无疑是SDK的文档了,也就是这个地方(http://code.google.com/intl/zh-CN/android/documentation.html)的介绍,它循序渐进的介绍了Android的各个方面。
  其次,大家可能有对android文档不太理解的地方,或者自己的想法等等,完全可以通过下面的groups进行咨询和交流:
  ◆Android Beginner http://groups.google.com/group/android-beginners?lnk=
  ◆Developper Groups http://groups.google.com/group/android-developers
  ◆Android Internals http://groups.google.com/group/android-internals?lnk=
  ◆Android Porting http://groups.google.com/group/android-porting?lnk=

深入详解Android GSM驱动模块:

上文说到request是接收,是通过ril_event_loop中的多路复用I/O,也对初始化做了 分析.现在我们来仔细看看这个机制如何运转。  ril_event_set负责配置一个event,主要有两种event:
ril_event_add添加使用多路I/O的event,它负责将其挂到队列,同时将event的通道 句柄fd加入到watch_table,然后通过select等待.
ril_timer_add添加timer event,它将其挂在队列,同时重新计算最短超时时间.
无论哪种add,最后都会调用triggerEvLoop来刷新队列,更新超时值或等待对象.
  刷新之后, ril_event_loop从阻塞的位置,select返回,只有两种可能,一是超时,二 是等待到了某I/O操作.
超时的处理在processTimeouts中,摘下超时的event,加入pending_list.
检查有I/O操作的通道的处理在processReadReadies中,将超时的event加入 pending_list.
最后在firePending中,检索pending_list的event并依次执行event->func.
这些操作完之后,计算新超时时间,并重新select阻塞于多路I/O.
  前面的初始化流程已分析得知,初始化完成以后,队列上挂了3个event对象,分别是:
s_listen_event: 名为rild的socket,主要requeset & response通道
s_debug_event: 名为rild-debug的socket,调试用requeset & response通道(流 程与s_listen_event基本相同,后面仅分析s_listen_event)
s_wakeupfd_event: 无名管道,用于队列主动唤醒(前面提到的队列刷新,就用它来 实现,请参考使用它的相关地方)。

ADT和Eclipse开发Android程序时注意点:最近使用Eclipse配合ADT开发Android感觉到bug还是很多的,问题比Symbian还要多,突然感觉到微软真的是处处想到开发者。Eclipse的稳定性和运行效率再次体现出了Java的不足。除了 R.id.XXX cannot be resolved解决方法 这样的问题解决了外,新问题来了,编译时总是报错,clear build后,重启Eclipse还是错误。奇怪了,仔细用FileMon监视了下文件变化,Eclipse和ADT竟然在C:\Documents and Settings\android123.com\Local Settings\Application Data\Android 文件夹中建立和很多文件(其中android123.com是我当前电脑用户名),似乎是Cache缓存,清空后才解决问题。

你可能感兴趣的:(android)