Ubuntu下android学习——(2)Android系统构架分析和应用程序目录结构分析

你离开我真会死。 提交于 2019-12-05 01:14:51

一、Android系统构架

Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层。




英文不好,那下面是简单翻译的版本:




  • Linux内核(LinuxKernel)

    • Android运行在linuxkernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的。

    • Linux内核是硬件和软件层之间的抽象层。

    • 图中我们可以看出驱动就是以C或汇编代码来控制硬件并向上提供接口操作

  • 中间件

    • 中间件包括两部分:核心库和运行时(libraries& Android runtime)

    • 核心库包括,Android的核心库主要是基于C\C++实现的一些原生组件,包括CBionic、浏览器引擎Webkit、多媒体引擎OpenCORESQL数据库SQLite3D渲染引擎OpenGLES、位图和字体矢量渲染引擎FreeType2D图像渲染引擎SGLSkiaGraphics Library)、互联网安全协议SSLTSL等。

      1,SurfaceManager

      当系统同时执行多个应用程序时,Surface Manager会负责管理显示与存取操作间的互动,另外也负责将2D绘图与3D绘图进行显示上的合成。

    2.多媒体框架(MediaFramework

      Android中,在Android2.3以前,多媒体框架采用的是PacketVideoOpenCORE平台,OpenCORE支持多种视频、音频和图像格式,并支持硬件、软件编解码器插件。在Android2.3中,正式引入了Stagefright框架。

    3SQLite

      在数据库方面,Android采用的是业界著名的SQLite数据库,SQLite是一个轻量级的交互性数据库,大小在500KB左右,目前主流的数据存储后台都是基于SQLite的。

    4OpenGLES

      Android中,3D图形的渲染支持业界主流的OpenGLES 2.0规范。OpenGLES 2.0可以有效的利用硬件来进行加速。在实际的操作中,软件加速采用的是OpenGLES 1.1规范,硬件加速采用地是OpenGLES 2.0规范。

    5FreeType

    FreeType是一个开源、免费、高质量的,且可移植的位图和字体矢量渲染引擎。它提供了统一的接口来供上层访问各种字体文件,包括TrueTypeOpenTypeType1CIDCFFWindowsFON/FNTX11PCF等。另外FreeType还支持单色位图、反走样位图的渲染。需要说明的是FreeType虽然是基于ANSIC来进行开发的,但采用的却是基于面向对象的设计思想,因此在可裁剪性上显得比较灵活。

    6Webkit

      Android中,内置的浏览器是基于著名的开源浏览器引擎Webkit的,支持CSSJavaScriptDOMAJAX等特性,完全遵守WWW规范,支持单栏和自适应视图渲染等。Webkit是浏览器领域著名的引擎之一,GoogleChromeAppleSafariAppleIPhoneSymbianS60等浏览器均采用了该引擎。在浏览器的网页渲染的速度和效果,以及对WWW国际标准上,浏览器引擎起着极其重要的作用。在目前的主流浏览器中,IE采用的是Trident引擎,firefox采用的是Gecko引擎,Opera采用的是Presto引擎,konqueror采用的是KHTML引擎。

    7SGL

    SGL为一个基于Skia2D图像渲染引擎,Google通过收购Skia公司获得了该技术,并将SGL应用在Chome浏览器和Android上。

    8SSL

      Android对常用的互联网安全协议提供了支持,支持的标准为SecureSockets Layer 3.0TransportLayer Security1.2SSL被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。TLS利用密钥算法在互联网上提供端点身份认证与通信保密。)

9Libc

Android中,C库并没有采用桌面Linux所采用的GNULibc,而是采用了Google开发的基于BSD许可的Bionic库。这是因为传统的GNU内核在体积和运行效率上都不适合移动设备,其核心组件都是以动态库的形式驻留在每个进程中,运行效率和内存占用都是十分重要的考虑。另外Google也希望C库能够运行在用户空间。

Bionic库仅为200KB大小,是GNULibc体积的一半,具有更高的效率、低内存占用、非常快和小的线程实现、内置了对Android特有服务的支持等特点,配合经过优化的DalvikBionic保证了Android的高性能。但需要注意的是Bionic不支持一些特性如Unicode、异常处理等。另外Bionic也和GNULibc不兼容,这会导致不少移植方面的问题。

    • Dalvik虚拟机:区别于Java虚拟机的是,每一个Android应用程序都在它自己的进程中运行,都有一个属于自己的Dalvik虚拟机,这一点可以让系统在运行时可以达到优化,程序间的影响大大降低。Dalvik虚拟机并非运行Java字节码,而是运行自己的字节码。

  • 应用程序框架(ApplicationFramework)

    • 丰富而又可扩展性的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textboxes),按钮(buttons),可嵌入的web浏览器。

    • 内容提供者(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。

    • 资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles)。

    • 通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息。

    • 活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。

  • 应用程序(Applications)

    • Android系统会内置一些应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

二、Android应用程序结构分析

接下来解析一个Android程序的各个组成部分,这次我们拿一个HelloWorld做例子,虽然只是一个HelloWorld,但也是麻雀虽小五脏俱全,通过分析Hello,World的目录结构,让我们对Android程序有一个整体全面的认识。





HelloWorld显示效果)


HelloWorld目录结构)

接下来我们逐个部分加以讲解:

1ActivityMainHelloWorld文件浅析

ActivityAndroid中的视图部分,负责界面显示。

    packagecom.example.test;

importandroid.os.Bundle;

importandroid.app.Activity;

importandroid.view.Menu;


publicclassMainActivity extendsActivity {


@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}


@Override

publicbooleanonCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.activity_main,menu);

returntrue;

}

}

可以看到MainActivityActivity的子类,子类要重写onCreateonCreateOptionsMenu方法。setContentView(R.layout.main)方法是给Activity设置可以显示的视图(View),视图由R类负责寻找。而getMenuInflater().inflate(R.menu.activity_main,menu);方法是给Activity设置menu按钮弹出的快捷目录的

2R文件浅析

我们看到Gen目录下有个R.Java文件,R文件由ADT自动生成,程序员不需要也不要去修改它,R文件负责调用应用程序中的非代码资源。

  1. packagecom.example.test;


publicfinalclassR {

publicstaticfinalclassattr {

}

publicstaticfinalclassdrawable {

publicstaticfinalintic_action_search=0x7f020000;

publicstaticfinalintic_launcher=0x7f020001;

}

publicstaticfinalclassid {

publicstaticfinalintmenu_settings=0x7f070000;

}

publicstaticfinalclasslayout {

publicstaticfinalintactivity_main=0x7f030000;

}

publicstaticfinalclassmenu {

publicstaticfinalintactivity_main=0x7f060000;

}

publicstaticfinalclassstring {

publicstaticfinalintapp_name=0x7f040000;

publicstaticfinalinthello_world=0x7f040001;

publicstaticfinalintmenu_settings=0x7f040002;

publicstaticfinalinttitle_activity_main=0x7f040003;

}

publicstaticfinalclassstyle {

publicstaticfinalintAppTheme=0x7f050000;

}

}

R文件中可以看到每一个资源都会有一个整数和它相对应。

3res/layout/activity_main.xml文件浅析– 布局layout

我们看到有个res目录,也就是resource目录,这个目录下存放资源文件,资源文件的统一管理,也是Android系统的一大特色。现在要注意看的是layout目录下的activity_main.xml。这个文件的内容是有关用户界面布局和设计的。在桌面程序设计领域采用XML也许比较新颖,但是在网页设计领域,这个就很平常了。可以用html来类比xml在布局中的用途。

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#000000">


<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:text="@string/hello_world"

android:textColor="#FFFFFF"

tools:context=".MainActivity"/>


</RelativeLayout>

从以上代码可以看到整个程序界面由一个线性布局控件(RelativeLayout)1个文本框控件(TextView)组成。res的其他目录里的其他文件也都是相关的资源描述。

4AndroidManifest.xml文件浅析

在每个应用程序的根目录都会有一个AndroidManifest.xml文件,该文件向Android操作系统描述了,本程序所包括的组件,所实现的功能,能处理的数据,要请求的资源等等。学过JavaWeb开发的可以用Web应用程序里的web.xml来类比这个AndroidManifest.xml文件。

    <manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.test"

android:versionCode="1"

android:versionName="1.0">


<uses-sdk

android:minSdkVersion="10"

android:targetSdkVersion="15"/>


<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

<activity

android:name=".MainActivity"

android:label="@string/title_activity_main">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>


<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>


</manifest>

我们看到Manifest是根节点,节点属性里有versionCodeversionName来表示应用程序的版本;里面可以包含0个或1application元素,application可以包含多个activity组件等等,具体的内容我们在接下来慢慢详细讲解。

5Android.jar文件浅析

作为一个Java项目,通常情况下都会引入要用到的工具类,也就是Jar包,在Android开发中,绝大部分开发用的工具包都被封装到一个叫Android.jar的文件里了。如果我们在Eclipse中展开来看,可以看到j2se中的包,apache项目中的包,还有Android自身的包文件。

android

包含在平台和包括定义系统功能的应用程序的权限的应用程序使用的资源类。

android.accessibilityservice

这个包中的类用于辅助服务的发展提供替代或增强反馈给用户。

android.accounts

android.animation

这些类提供了属性动画系统,它允许你任何类型的对象属性的动画功能。整数浮点数,十六进制的颜色值默认支持。你可以动画告诉系统,自定义类型的值如何计算任何其他类型TypeEvaluator

欲了解更多信息,请参阅 动画指 南。

android.app

包含高层次的类,封装整体的Android应用程序模型。 提供基本的运行环境

android.app.admin

提供系统级的设备管理功能,允许您创建安全感知应用程序是有用的,在企业设置,其中IT专业人员超过雇员装置需要丰富的控制。

欲了解更多信息,请参阅 设备管理 指南。

android.app.backup

包含备份和恢复功能的应用程序可用。如果用户清除设备上的数据或升级到一个新的Android供电设备,已启用的所有应用程序的备份可以恢复以前的数据用户的应用程序时重新安装。

欲了解更多信息,请参阅数据备份指南。

android.appwidget

包含必要的组件,以创建“应用程序部件”,用户可以嵌入在其他应用程序(如主屏幕)快速访问应用程序的数据和服务,而无需启动一个新的活动。

欲了解更多信息,请参阅 应用部件的指南。

android.bluetooth

提供管理类蓝牙功能,如扫描设备,连接的设备,管理设备之间的数据传输。

有关更多信息,请参阅的 蓝牙指南。

android.content

包含类设备上的数据访问和发布。

android.content.pm

包含用于访问有关的应用程序包的信息,包括有关的活动,权限,服务,签名,和供应商的信息类。

android.content.res

访问应用程序资源,如资产原始文件,颜色,可绘制,媒体或其他包中的其他文件,再加上重要的设备配置细节(方向,输入类型等)的影响如何应用程序的行为可能含有类。

欲了解更多信息,请参阅应用程序资源指南。

android.database

包含的类,以探索通过内容提供商返回的数据。

android.database.sqlite

包含SQLite数据库管理类,应用程序将使用它来管理自己的私人数据库。

android.drm

提供类管理DRM内容和确定的DRM插件(代理人)的能力。

android.gesture

提供类创造,识别,加载和保存的手势。

android.graphics

提供低水平如画布,颜色过滤器,点,让你处理直接绘制到屏幕的矩形绘图工具。

android.graphics.drawable

提供类来管理各种各样的视觉元素,仅用于显示的,如位图和梯度,。

android.graphics.drawable.shapes

包含绘制几何形状的类。

android.hardware

硬件功能,如摄像机和其他传感器,提供支持。

android.hardware.input

android.hardware.usb

Android的供电设备连接到USB硬件外设通信提供支持。

有关详细信息,请参阅 USB指南。

android.inputmethodservice

写输入法(如软件键盘)的基类。

android.location

包含类定义Android的基于位置和相关服务。

欲了解更多信息,请参阅 位置和地图指南。

android.media

提供管理各种媒体音频和视频接口的类。

android.media.audiofx

提供管理类媒体框架中实现的音频效果。

android.media.effect

提供类,让您适用于各种图像和视频的视觉效果。

android.mtp

提供API,让你直接交互连接相机和其他设备,使用PTP(图片传输协议)的MTP(媒体传输协议)规范的子集。

android.net

帮助网络访问超出了正常的java.net类。* API的。

android.net.http

android.net.nsd

android.net.rtp

提供用于RTP(实时传输协议)的API,允许应用程序管理的需求或交互式数据流。

android.net.sip

提供访问,例如拨打和接听VoIP电话使用SIP会话发起协议(SIP)功能。

欲了解更多信息,请参见 会话初始协议 开发指南“。

android.net.wifi

提供类来管理Wi-Fi功能的设备。

android.net.wifi.p2p

提供类来创建同行对等(P2P)连接与Wi-Fi直。

android.net.wifi.p2p.nsd

android.nfc

提供近场通信(NFC)功能,允许应用程序读取NFC标签NDEF的消息。“标签”,实际上可能是作为一个标记出现的另一个设备。

欲了解更多信息,请参阅 近场通信指南。

android.nfc.tech

这些类提供了一个标记技术的特点,不同类型的标签,扫描的访问。

android.opengl

提供OpenGL ES的静态接口和公用事业。

android.os

提供基本的操作系统服务,消息传递,设备上的进程间通信。

android.os.storage

包含系统存储服务,资产管理二进制文件系统被称为不透明的二进制水滴(OBBs的)的类。

android.preference

提供管理类应用的喜好和实施的喜好的UI

android.provider

提供方便的类访问由Android提供的内容提供商。

android.renderscript

Renderscript渲染和计算的API提供低级别的进行数学计算和3D图形渲染,高性能的手段。

有关详细信息,请参阅的 Renderscript开发指南。

android.sax

一个框架,可以很容易地编写高效和稳健的SAX处理程序。

android.security

android.service.textservice

提供类,允许你创建类似的输入法(IME的)框架的方式拼写检查。

android.service.wallpaper

android.speech

android.speech.tts

android.support.v13.app

支持类来访问一些API 13级后在向后兼容的方式引进的android.app包功能。

android.support.v13.dreams

支持类,以纾缓在向后兼容的方式实现梦想。

android.support.v4.accessibilityservice

支持android.accessibilityservice班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.app

支持android.app班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.content

支持android.content班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.content.pm

支持android.content.pm班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.database

支持android.database班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.net

android.support.v4.os

android.support.v4.util

支持android.util班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.view

支持android.util班,以协助Android API的第4级或更高的应用程序的开发。

android.support.v4.view.accessibility

访问一些API级别4在一个向后兼容的方式推出后的android.view.accessibility包功能的支持类。

android.support.v4.widget

支持android.widgetAndroid API的第4级或更高的应用程序,以协助发展。

android.telephony

为监测网络类型和连接状态,再加上电话号码字符串操纵的工具,如手机基本信息的API

android.telephony.cdma

为利用特定的CDMA电话功能的API

android.telephony.gsm

为利用特定的GSM电话功能,如文字/数据/ PDUSMS消息的API

android.test

编写Android的测试案例和套房的框架。

欲了解更多信息,请参阅 测试开发指南。

android.test.mock

实用工具类,提供各种Android框架积木存根或嘲笑。

有关详细信息,请参阅 测试指南。

android.test.suitebuilder

支持测试亚军类的实用工具类。

android.text

提供用于渲染或跟踪屏幕上的文字和文字跨度类。

android.text.format

这个软件包包含一些文本格式定义类的替代类java.utiljava.text

android.text.method

提供监视或修改键盘输入的类。

android.text.style

提供用于查看或更改视图中的对象跨度文本的样式类。

android.text.util

工具,用于识别的文本字符串转换成可点击的链接和创造RFC 822型消息(SMTP)令牌。

android.util

提供操纵日期/时间的base64编码器和解码器,字符串和数字转换的方法,和XML的实用工具,例如常见的实用方法。

android.view

提供公开处理屏幕布局和与用户的交互的基本用户界面类的类。

android.view.accessibility

这个包中的类,用来表示查询系统的全局可访问状态屏幕上的内容和它的变化,以及作为原料药。

android.view.animation

提供类处理补间动画。

android.view.inputmethod

意见和输入法(如软键盘)之间的相互作用的框架类。

android.view.textservice

android.webkit

提供用于浏览网页的工具。

android.widget

Widget包包含使用您的应用程序屏幕上的UI元素(主要是视觉)。

dalvik.bytecode

提供有关Dalvik字节码的类。

dalvik.system

提供实用工具和系统信息类特定的Dalvik虚拟机。

java.awt.font

java.beans

java.io

java.lang

java.lang.annotation

java.lang.ref

提供系统ReferenceQueue实施以及不同形式的参考对象,实行垃圾收集器上的特殊行为。

java.lang.reflect

java.math

java.net

java.nio

java.nio.channels

java.nio.channels.spi

java.nio.charset

java.nio.charset.spi

java.security

这个包是仅遗留代码的兼容性,不应使用或预期做任何有用的。

java.security.acl

这个包提供的类和接口需要建立访问控制列表。

java.security.cert

这个软件包提供的所有类,并生成所需的所有接口,管理和验证的X.509证书。

java.security.interfaces

这个包提供了生成所需的接口:(1)密钥使用RSA非对称加密算法的PKCS1标准;2)(3)密钥数字签名算法(DSA)的FIPS-186中指定的键;为一般的椭圆曲线非对称加密算法。

java.security.spec

这个包提供的类和接口,需要指定用于加密和签名算法的密钥和参数。

java.sql

访问基于SQL的数据库,提供了一个兼容接口。

java.text

java.util

java.util.concurrent

在并发编程中很常用的实用工具类。

java.util.concurrent.atomic

支持无锁在单个变量的线程安全编程一类的小工具包。

java.util.concurrent.locks

提供一个框架,锁定和等待条件是从不同的内置同步和监视器的接口和类。

java.util.jar

java.util.logging

java.util.prefs

java.util.regex

java.util.zip

javax.crypto

此包提供了实施加密,解密或密钥协议算法的加密应用程序的类和接口。

javax.crypto.interfaces

这个包提供的接口需要实现的Diffie-Hellman(卫生署)PKCS3指定的金钥协议的算法。

javax.crypto.spec

这个包提供的类和接口,需要指定用于加密的密钥和参数。

javax.microedition.khronos.egl

javax.microedition.khronos.opengles

提供了一个标准的OpenGL接口。

javax.net

此包提供创建套接字和服务器套接字工厂类。

javax.net.ssl

这个包提供的类和接口,需要使用安全套接字层(SSL)协议的继任者传输层安全(TLS)协议。

javax.security.auth

javax.security.auth.callback

此包提供与应用程序交互,以执行身份验证和授权过程所需的类和接口。

javax.security.auth.login

这个软件包提供了一个可插拔和可堆叠的认证系统基于Unix-PAM模块的思想和概念。

javax.security.auth.x500

这个包提供了所需的存储X.500的校长和他们的凭据类。

javax.security.cert

这个软件包只提供兼容性的原因。

javax.sql

javax.xml

提供有用的XML常量的一个实用工具类。

javax.xml.datatype

XML / Java类型映射。

javax.xml.namespace

XML命名空间处理。

javax.xml.parsers

提供允许处理XML文档的类。

javax.xml.transform

此包定义了用于处理转换指令,以及执行从源到成果转化的一般API

javax.xml.transform.dom

此包实现特定于DOM的转换API

javax.xml.transform.sax

此包实现特定于SAX2的转换API

javax.xml.transform.stream

这个包实现数据流和特定URI的转换API

javax.xml.validation

这个包提供了用于XML文档验证的API

javax.xml.xpath

这个包提供了一个对象模型中立API XPath表达式的计算和访问计算环境的评价。

junit.framework

JUnit测试框架。

junit.runner

实用工具类,支持JUnit测试框架。

org.apache.http

HTTP组件的核心接口和类。

org.apache.http.auth

客户端对服务器的HTTP认证的API,通常被称为为HttpAuth

org.apache.http.auth.params

参数配置HttpAuth

org.apache.http.client

为客户端的HTTP通信和切入点HttpClient API的模块。

org.apache.http.client.entity

org.apache.http.client.methods

要求实现像各种HTTP方法GETPOST

org.apache.http.client.params

参数配置HttpClient

org.apache.http.client.protocol

额外的请求和响应拦截。

org.apache.http.client.utils

佣工和公用事业类HttpClient

org.apache.http.conn

客户端连接管理和处理API在什么样的核心是简称为HttpConn“ 

org.apache.http.conn.params

参数配置HttpConn

org.apache.http.conn.routing

客户端的路由代表性和跟踪API,部分HttpConn

org.apache.http.conn.scheme

org.apache.http.conn.ssl

TLS / SSL的具体零部件HttpConnAPI

org.apache.http.conn.util

org.apache.http.cookie

通过cookie客户端状态管理的API,俗称为HttpCookie

org.apache.http.cookie.params

参数配置HttpCookie

org.apache.http.entity

HTTP消息实体的表示。

org.apache.http.impl

在接口的默认实现 org.apache.http

org.apache.http.impl.auth

org.apache.http.impl.client

org.apache.http.impl.conn

org.apache.http.impl.conn.tsccm

执行一个线程安全的客户端连接管理器。

org.apache.http.impl.cookie

org.apache.http.impl.entity

在接口中默认实现 org.apache.http.entity

org.apache.http.impl.io

在接口的默认实现 org.apache.http.io

org.apache.http.io

传输层抽象的HTTP组件。

org.apache.http.message

选择一个HTTP 消息 实现。

org.apache.http.params

HTTP组件的参数化框架。

org.apache.http.protocol

HTTP协议的执行框架。

org.apache.http.util

大多出于各种目的的静态辅助方法的实用工具类。

org.json

org.w3c.dom

提供文档对象模型级别2核心的官方W3C Java绑定。

org.w3c.dom.ls

org.xml.sax

这个包提供了核心SAX API的。

org.xml.sax.ext

此包包含适合的SAX驱动程序不一定支持的SAX2设施的接口。

org.xml.sax.helpers

此包包含“助手”类,其中包括对引导基于SAX的应用程序的支持。

org.xmlpull.v1

org.xmlpull.v1.sax2


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!