Android源代码下载及编译方法

Android源代码下载及编译方法
Android源代码下载及编译方法

本文主要参考官方文档(https://www.360docs.net/doc/e418120817.html,/download)和

网上相关资料(https://www.360docs.net/doc/e418120817.html,/HKjinzhao/archive/2009/03/18/4002326.aspx,

https://www.360docs.net/doc/e418120817.html,/2009/04/30/how-to-build-android-15-kernel-image/)。网上的资料对于andorid的最新代码有的已经过时,或者有错误,这份文档本人亲自实验,保证可行。另本人没有使用eclipse的习惯,所以并没有做eclipse的相关配置。

编译环境:ubuntu9.10

1)安装必要的软件环境

$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

官方推荐的就是上面这些,如果在编译过程中发现某些命令找不到,就apt-get它。可能需要的包还有:

$ sudo apt-get install make

$ sudo apt-get install gcc

$ sudo apt-get install g++

$ sudo apt-get install libc6-dev

$ sudo apt-get install patch

$ sudo apt-get install texinfo

$ sudo apt-get install zlib1g-dev

$ sudo apt-get install valgrind

$ sudo apt-get install python2.5(或者更高版本)

需要注意的是,官方文档说如果用sun-java6-jdk可出问题,得要用sun-java5- jdk。经测试发现,如果仅仅make(make不包括make sdk),用sun-java6-jdk是没有问题的。而make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。

因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装,并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话,除了javadoc工具是用1.5版本,其它均用1.6版本:

$ sudo apt-get install sun-java6-jdk

修改javadoc的link

$ cd /etc/alternatives

$ sudo rm javadoc.1.gz

$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz

$ sudo rm javadoc

$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc

2)设置环境变量

$ emacs ~/.bashrc

在.bashrc中新增或整合PA TH变量,如下:

#java 程序开发/运行的一些环境变量

JA V A_HOME=/usr/lib/jvm/java-6-sun

JRE_HOME=${JA V A_HOME}/jre

export ANDROID_JA V A_HOME=$JA V A_HOME

export CLASSPATH=.:${JA V A_HOME}/lib:$JRE_HOME/lib:$CLASSPATH

export JA VA_PATH=${JA V A_HOME}/bin:${JRE_HOME}/bin

export JA VA_HOME;

export JRE_HOME;

export CLASSPATH;

HOME_BIN=~/bin/

export PA TH=${PATH}:${JA V A_PATH}:${HOME_BIN};

保存后,同步更新:

source ~/.bashrc

3)安装repo(用来更新android源码)

创建~/bin目录,用来存放repo程序,如下:

$ cd ~

$ mkdir bin

并加到环境变量PATH中,在第2步中已经加入

下载repo脚本并使其可执行:

$ curl https://www.360docs.net/doc/e418120817.html,/repo >~/bin/repo

$ chmod a+x ~/bin/repo

4)初始化repo

repo是android对git的一个封装,简化了一些git的操作。

创建工程目录:

$ mkdir android

$ cd android

repo初始化

$ repo init -u git://https://www.360docs.net/doc/e418120817.html,/platform/manifest.git

在此过程中需要输入名字和email地址。初始化成功后,会显示:

repo initialized in /android

在~/android下会有一个.repo的隐藏目录。

5)同步源代码

$ repo sync

这一步要很久很久

6)编译android源码,并得到~/android/out目录

$ cd ~/andoird

$ make

这一过程很久

7)在模拟器上运行编译好的android

编译好android之后,emulator在~/android/out/host/linux-x86/bin下,ramdisk.img,system.img 和userdata.img则在~/android/out/target/product/generic下

$ cd ~/android/out/host/linux-x86/bin

增加环境变量

$ emacs ~/.bashrc

在.bashrc中新增环境变量,如下

#java 程序开发/运行的一些环境变量

export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic

ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin

export

PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};

最后,同步这些变化:

$ source ~/.bashrc

$ cd ~/android/out/target/product/generic

$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img

最后进入android桌面,就说明成功了。

8)编译模块

android中的一个应用程序可以单独编译,编译后要重新生成system.img

在源码目录下执行

$ . build/envsetup.sh (.后面有空格)

就多出一些命令:

- croot: Changes directory to the top of the tree.

- m: Makes from the top of the tree.

- mm: Builds all of the modules in the current directory.

- mmm: Builds all of the modules in the supplied directories.

- cgrep: Greps on all local C/C++ files.

- jgrep: Greps on all local Java files.

- resgrep: Greps on all local res/*.xml files.

- godir: Go to the directory containing a file.

可以加—help查看用法

我们可以使用mmm来编译指定目录的模块,如编译联系人:

$ mmm packages/apps/Contacts/

编完之后生成两个文件:

out/target/product/generic/data/app/ContactsTests.apk

out/target/product/generic/system/app/Contacts.apk

可以使用

$ make snod

重新生成system.img,再运行模拟器

9)编译SDK

直接执行make是不包括make sdk的。make sdk用来生成SDK,这样,我们就可以用与源码同步的SDK来开发android了。

a)修改/frameworks/base/include/utils/Asset.h

‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改为‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’

原因是eclipse编译工程需要大于1.3M的buffer;

b)编译ADT。

由于本人不使用eclipse,所以没有进行这步;

c)执行make sdk。

注意,这里需要的javadoc版本为1.5,所以你需要在步骤1中同时安装sun-java5-jdk

$ make sdk

编译很慢。编译后生成的SDK存放在out/host/linux-x86/sdk/,此目录下有android-sdk_eng.xxx_linux- x86.zip和android-sdk_eng.xxx_linux-x86目录。android-sdk_eng.xxx_linux-x86就是SDK目录

实际上,当用mmm命令编译模块时,一样会把SDK的输出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出来

此后的应用开发,就在该SDK上进行,所以把7)对于~/.bashrc的修改注释掉,增加如下一行:

export PA TH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools

注意要把xxx换成真实的路径;

d)关于环境变量、android工具的选择

目前的android工具有:

A、我们从网上下载的SDK,如果你下载过的话(tools下有许多android工具,lib/images 下有img映像)

B、我们用make sdk编译出来的SDK(tools下也有许多android工具,lib/images下有img 映像)

C、我们用make编译出来的out目录(tools下也有许多android工具,lib/images下有img 映像)

那么我们应该用那些工具和img呢?

首先,我们一般不会用A选项的工具和img,因为一般来说它比较旧,也源码不同步。其次,也不会用C选项的工具和img,因为这些工具和img没有经过SDK的归类处理,会有工具和配置找不到的情况;事实上,make sdk产生的很多工具和img,在make编译出来out目录的时候,已经编译产生了,make sdk只是做了copy而已。

e)安装、配置ADT

略过;

f)创建Android Virtual Device

编译出来的SDK是没有A VD(Android Virtual Device)的,我们可以通过android工具查看:$ android list

创建A VD:

$ android create avd -t 1 -n myavd

可以android –help来查看上面命令选项的用法。创建中有一些选项,默认就行了

再执行android list,可以看到A VD存放的位置

以后每次运行emulator都要加-avd myavd或@myavd选项:

$ emulator -avd myavd

10)编译linux内核映像

a)准备交叉编译工具链

android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。

b)设定环境变量

$ emacs ~/.bashrc

增加如下两行:

export PA TH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin

export ARCH=arm

保存后,同步变化:

$ source ~/.bashrc

c)获得合适的内核源代码

$ cd ~/android

获得内核源代码仓库

$ git clone git://https://www.360docs.net/doc/e418120817.html,/kernel/common.git kernel

$ cd kernel

$ git branch

显示

* android-2.6.27

说明你现在在android-2.6.27这个分支上,也是kernel/common.git的默认主分支。

显示所有head分支:

$ git branch -a

显示

* android-2.6.27

remotes/origin/HEAD -> origin/android-2.6.27

remotes/origin/android-2.6.25

remotes/origin/android-2.6.27

remotes/origin/android-2.6.29

remotes/origin/android-goldfish-2.6.27

remotes/origin/android-goldfish-2.6.29

我们选取最新的android-goldfish-2.6.29,其中goldfish是android的模拟器模拟的CPU。$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

$ git branch

显示

android-2.6.27

* android-goldfish-2.6.29

我们已经工作在android-goldfish-2.6.29分支上了。

d)设定交叉编译参数

打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器

CROSS_COMPILE ?= arm-eabi-

LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\

$(call ld-option, -Wl$(comma)–build-id,))

这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下: LDFLAGS_BUILD_ID =

e)编译内核映像

$ cd ~/android/kernel

$ make goldfish_defconfig

$ make

f)测试生成的内核映像

$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage

Android usb流程分析 文档以UMS(usb mass storage)为例来分析流程,主要按照图中红线来分析(即从插入USB 开始到状态栏弹框,然后又从选择UMS功能开始往下的流程)。以前没有看过USB相关代码,网上也很少有分析usb FRAMEWORK相关的东西,文档中可能存在错误,如果发现欢迎指正。 总体框图 1.Kernel USB 流程 LINUX KERNEL GADGET 架构 Linux USB Gadget分三层架构,层次关系从上到下 一层:USB Gadget功能层。BSP/Driver开发者通常是要实现这一层,从而实现一个具体的设备驱动,如Anddroid在此层实现了adb,mtp,mass_storage等。浏览参考关注此层代码时,会发现“composite”是此层的关键字,此层中关键的数据结构是:struct usb_composite_driver。这一层的驱动文件一般为:driver/usb/gadget/android.c(android实现的)或driver/usb/gadget/serial.c(传统Linux实现的USB转串口)。 二层:USB设备层(usb core)。这一层是Linux内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。浏览参考关注此层时,会发现“gadget”是此层的关键字,此层的关键数据结构是:usb_gadget_driver,usb_composite_dev。这层主要的一个驱动文件为:driver/usb/gadget/composite.c 三层:USB设备控制器驱动层。这一层主要是与CPU、CPU USB控制器有关,与硬件

android studio 控件常用属性 下面是RelativeLayout各个属性 1.android:layout_above="@id/xxx" --将控件置于给定ID控件之上 2.android:layout_below="@id/xxx" --将控件置于给定ID控件之下 3. android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐 4.android:layout_toRightOf="@id/xxx" --将控件的左边缘和给定ID控件的右边缘对齐 5. android:layout_alignLeft="@id/xxx" --将控件的左边缘和给定ID控件的左边缘对齐 6.android:layout_alignTop="@id/xxx" --将控件的上边缘和给定ID控件的上边缘对齐 7.android:layout_alignRight="@id/xxx" --将控件的右边缘和给定ID控件的右边缘对齐 8.android:layout_alignBottom="@id/xxx" --将控件的底边缘和给定ID控件的底边缘对齐 9.android:layout_alignParentLeft="true" --将控件的左边缘和父控件的左边缘对齐 10. android:layout_alignParentTop="true" --将控件的上边缘和父控件的上边缘对齐 11. android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐 12.android:layout_alignParentBottom="true" --将控件的底边缘和父控件的底边缘对齐 13.android:layout_centerInParent="true" --将控件置于父控件的中心位置 14.android:layout_centerHorizontal="true" --将控件置于水平方向的中心位置 15.android:layout_centerVertical="true" --将控件置于垂直方向的中心位置 android:layout_width 设置组件的宽度 android:layout_height 设置组件的高度 android:id 给组件定义一个id值,供后期使用 android:background 设置组件的背景颜色或背景图片 android:text 设置组件的显示文字 android:textColor 设置组件的显示文字的颜色 android:layout_below 组件在参考组件的下面 android:alignTop 同指定组件的顶平行

基于安卓操作系统的应用软件开发分析 众所周知,信息技术在其自身的发展过程中,电子产品的丰富性与多样性充分地展现出来,并且使得人们生活方式有所改变,一定程度上为人们日常生产与生活带来了便利。正是因为安卓操作系统自身独特的开放性特征,使其同电子设备实现了有效地沟通,并且始终能够满足用户不同需求。现阶段,安卓手机已经被广泛使用,并且已经普及,在此背景下,使人们开始重视其便携性问题,希望能够时刻进行操作,所以,在安卓操作系统的基础上,应该积极开发出相应的应用软件,这是省前安卓操作系统工作领域中亟待解决的问题。 1.安卓操作系统开发平台在安卓操作系统平台中,其主要的构成部分就是应用软件、中间件以及用户界面和操作系统,给予平台各层分离有力的支撑与保障,使得各层中间都能够保证分工的明确性m。通常情况下,安卓操作系统中的应用程序框架可以有效地提供API,同时还能够合理地设计出其自身特有的功能模块,这样一来,还可以实现为其他应用程序提供有价值的使用依据。在安卓操作系统当中,其最核心的应用程序就是联系人、网络浏览器、日历、SMS应用程序以及电子邮件等等。在编写并设计应用程序的过程中,开发工作人员需要对Java语言进行充分地利用,这样才能够确保系统程序和开发程序所包含的资源实现共享。在此基础上,安卓操作系统还能够向组件提供相应的C/C++库集合,然而,开发工作人员不能够对其进行直接调用’一定要根据上层的应用程序框来实现C/C++库的应用p1。通常情况下,安卓操作系统库的构成内容是媒体库、FreeType、界面管理和SQLite等多种系统。 2.基于安卓操作系统应用软件开发的重要意义随着科技发展与人们生活水平的提升,始终对个人电脑与智能手机在社会经济当中的发展情况产生影响。现阶段,我国智能手机市场始终处于爆炸式增长的趋势,而截至到2013年,智能手机的普及率也迅速上升,将近2/3的国民都已经拥有智能手机pi。然而,国民拥有智能手机的技术水平也处于上升的阶段,其中,智能手机终端CPU处理能力以及存储和用户交互等方面的能力都出现了明显的提高,以上内容也同样是智能手机关键性的指标,所以,一定程度上对于安卓操作系统应用软件的开发工作提供了有力的硬件基础。基于安卓操作系统的应用软件开发能够保证使用者手中安卓智能操作系统同社会各行业经济发展过程中所使用的电子设备实现有效连接,进而能够为使用者提供更具特色与专业化的服务。若安卓智能操作系统应用软件能够得到广泛地应用,必然会为人们的生产与生活带来便利与实用价值,进而更方便人们的工作与生活。 3.安卓操作系统概述 3.1安卓发展史安卓股份有限公司位于美国加州,公司成立于2003年,并在2005年被谷歌所收购。谷歌公司的主要目标就是要创建标准化与开放化的安卓系统移动客户端平台141。同其他智能手机的操作系统相比,安卓操作系统的开放性更加明显,并且能够在其实际运行的过程中始终处于开放状态,同时还能够同其他电子设备实现数据链接,在此基础上,更好地实现高级操作。安卓系统是智能手机当中的一种智能操作系统,所以,其更新的速度相对较快,当前最新版本已经是Android6.0.1(M)操作系统。 3.2安卓开发平台结构与特征(1)应用程序层。智能手机操作系统中的安卓系统,其自身就能够为智能手机的运行提供相应的应用软件,而且,其基本的应用软件都是操作系统本身所配置的,主要的表现形式就是系统应用151。然而,在智能手机实际运行的过程当中,这些应用软件同其他的应用软件共同享受同等资源的支配权利。(2)应用程序框架。在智能手机操作系统当中的安卓操作系统,本身明显的特征就是能够支持使

今天我用自己写的一个Demo 和大家详细介绍一个Android开发中遇到的一些常用系统控件的使用技巧。 1.文本框TextView TextView的作用是用来显示一个文本框,下面我用两种方式为大家呈现TextView,第一种是通过xml布局文件

呈现,第二种是通过代码来呈现,由此可见Android 的界面开发真的是非常灵活。 view plaincopy to clipboardprint? 1. public class TextViewActivity extends Activity { 2. @Override 3. protected void onCreate(Bundle savedInstanceState) { 4. setContentView(https://www.360docs.net/doc/e418120817.html,yout.textview);

5. 6. LinearLayout ll = (LinearLayout) findViewById(R.id.textviewll); 7. TextView textView = new TextView(this); 8. //设置显示文字 9. textView.setText("从代码中添加一个TextView"); 10. //设置显示颜色 11. textView.setTextColor(Color.WHITE); 12. //设置显示字体大小 13. textView.setTextSize(18); 14. //设置显示背景颜色 15. textView.setBackgroundColor(Color.BLUE); 16. //设置锚点位置 17. textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.CE NTER_HORIZONTAL); 18. //把这个view加入到布局当中 19. ll.addView(textView); 20. 21. super.onCreate(savedInstanceState); 22. } 23. } 1. 2.

Android开发日志—常用控件篇(容器控件) android简介: Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。 Android的系统架构和其操作系统一样,采用了分层的架构。 Android结构 从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。 隐藏在每个应用后面的是一系列的服务和系统, 其中包括; 丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(Lists),网格(Grids),文本框(Text boxes),按钮(Buttons),甚至可嵌入的web 浏览器。 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据 资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件(Layout files )。 通知管理器(Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。 Android开发四大组件分别是:活动(Activity):用于表现功能。服务(Service):后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider):支持在多个应用中存储和读取数据,相当于数据库。 活动(当前界面视图):

《Android基础应用》 Android常用控件 ?本章任务 ?使用Android开发使用时间组件 ?使用Android开发使用进度条组件 ?使用Android开发创建底部选项卡 ?本章目标 ?了解Android的组件层次结构 ?掌握常用的日期时间类控件 ?掌握常用的几个容器组件 1.Android组件的层次结构 UI组件都是View的子类,View有很多子类,它们之间存在树状的继承关系View及其子类结构图

TextView及其子类结构图

ViewGroup及其子类结构图 其下的子类一般作为容器或布局来使用 FrameLayout及其子类结构图 其下的子类通常作为容器或布局来使用

2.时间控件 2.1日期时间选择器 DatePicker组件可用于输入日期,TimePicker组件可用来选择时间,只能输入小时和分,默认12小时制 DatePicker ●使用onDateChangedListener监听器来获取用户的日期选择 ●使用init对组件进行初始化 ●使用getYear,getMonth,getDayOfMonth方法获得用户选择的年,月,日 TimePicker ●使用onTimeChangedListener监听器获取用户的时间选择 ●使用setIs24HourView设置是否以24小时制显示 ●使用getCurrentHour获得当前的小时数 ●使用getCurrentMinute获得当前的分钟数 示例

示例的实现结果

2.2时钟组件 AnalogClock组件用来以表盘的方式显示当前时间,该表只有时针和分针,DigitClock组件以数字的方式显示当前时间可以显示时分秒,由于DigitClock继承TextView,可以使用TextView 的属性 示例

Android本质上就是一个基于Linux内核的操作系统。与Ubuntu Linux、Fedora Linux 类似。只是Android在应用层专门为移动设备添加了一些特有的支持。既然Android是Linux内核的系统,那么基本的启动过程也应符合Linux的规则。如果研究过其他Linux 系统应该了解,一个完整的Linux系统首先会将一个Linux内核装载到内存,也就是编译Linux内核源代码生成的bzImage文件,对于为Android优化的Linux内核源代码会生成zImage文件。该文件就是Linux内核的二进制版本。由于zImage在内核空间运行,而我们平常使用的软件都是在应用空间运行(关于内核空间和应用空间的详细描述,可以参考《Android深度探索(卷1):HAL与驱动开发》一书的内容,在后续的各卷中将会对Android的整体体系进行全方位的剖析)。内核空间和应用空间是不能直接通过内存地址级别访问的,所以就需要建立某种通讯机制。 目前Linux有很多通讯机制可以在用户空间和内核空间之间交互,例如设备驱动文件(位于/dev目录中)、内存文件(/proc、/sys目录等)。了解Linux的同学都应该知道Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些与内核空间交互的文件都在用户空间,所以在Linux内核装载完,需要首先建立这些文件所在的目录。而完成这些工作的程序就是本文要介绍的init。Init是一个命令行程序。其主要工作之一就是建立这些与内核空间交互的文件所在的目录。当Linux内核加载完后,要做的第一件事就是调用init程序,也就是说,init是用户空间执行的第一个程序。 在分析init的核心代码之前,还需要初步了解init除了建立一些目录外,还做了如下的工作 1. 初始化属性 2. 处理配置文件的命令(主要是init.rc文件),包括处理各种Action。 3. 性能分析(使用bootchart工具)。 4. 无限循环执行command(启动其他的进程)。 尽管init完成的工作不算很多,不过代码还是非常复杂的。Init程序并不是由一个源代码文件组成的,而是由一组源代码文件的目标文件链接而成的。这些文件位于如下的目录。 /system/core/init 其中init.c是init的主文件,现在打开该文件,看看其中的内容。由于init是命令行程序,所以分析init.c首先应从main函数开始,现在好到main函数,代码如下: int main(int argc, char **argv) { int fd_count = 0; struct pollfd ufds[4]; char *tmpdev; char* debuggable; char tmp[32]; int property_set_fd_init = 0; int signal_fd_init = 0;

android常用控件大全 在Android中使用各种控件(View) DatePicker-日期选择控件 TimePicker-时间选择控件 ToggleButton-双状态按钮控件 EditText-可编辑文本控件 ProgressBar-进度条控件 SeekBar-可拖动的进度条控件 AutoCompleteTextView-支持自动完成功能的可编辑文本控件 MultiAutoCompleteTextView-支持自动完成功能的可编辑文本控件,允许输入多值(多值之间会自动地用指定的分隔符分开) ZoomControls-放大/缩小按钮控件 Include-整合控件 VideoView-视频播放控件 WebView-浏览器控件 RatingBar-评分控件 Tab-选项卡控件 Spinner-下拉框控件 Chronometer-计时器控件 ScrollView-滚动条控件 在Android中使用的Layout FrameLayout:里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角 LinearLayout:里面可以放多个控件,但是一行只能放一个控件

TableLayout:这个要和TableRow配合使用,很像html里面的table AbsoluteLayout:里面可以放多个控件,并且可以自己定义控件的x,y的位置 RelativeLayout:里面可以放多个控件,不过控件的位置都是相对位置 (Android界面布局好像还可以直接引用一些view,如ScrollView等) 常用控件: 1,EditText 主要函数:setText/getText设置/获取文本内容,setHint设置缺省显示内容; 2,RadioGroup,RadioButton RadioButton的isChecked()判断是否被选中 获取选中RadioButon的ID:设置 RadioGroup.setOnCheckedChangeListener方法 publiconCheckedChanged(RadioGroupgroup,intcheckedId)//checkedId 是选中RadioButton的ID 3,CheckBox isChecked()判断是否被选中 setOnCheckedChangeListener方法监视选中状态改变情况 4,Spinner a,显示数据 1),硬编码加载 通过setAdapter方法设置类型为 ArrayAdapter(Contextcontext,inttextViewResId,String[]objects) textViewResourceId:显示内容的ViewID默认设置为 https://www.360docs.net/doc/e418120817.html,yout.simple_spinner_item

android休眠与唤醒驱动流程分析 标准linux休眠过程: ●power management notifiers are executed with PM_SUSPEND_PREPARE ●tasks are frozen ●target system sleep state is announced to the platform-handling code ●devices are suspended ●platform-specific global suspend preparation methods are executed ●non-boot CPUs are taken off-line ●interrupts are disabled on the remaining (main) CPU ●late suspend of devices is carried out (一般有一些BUS driver的动作进行)? ●platform-specific global methods are invoked to put the system to sleep 标准linux唤醒过程: ●t he main CPU is switched to the appropriate mode, if necessary ●early resume of devices is carried out (一般有一些BUS driver的动作进行)? ●interrupts are enabled on the main CPU ●non-boot CPUs are enabled ●platform-specific global resume preparation methods are invoked ●devices are woken up ●tasks are thawed ●power management notifiers are executed with PM_POST_SUSPEND 用户可以通过sys文件系统控制系统进入休眠: 查看系统支持的休眠方式: #cat /sys/power/state 常见有standby(suspend to RAM)、mem(suspend to RAM)和disk(suspend to disk),只是standby耗电更多,返回到正常工作状态的时间更短。 通过#echo mem > /sys/power/state 让系统进入休眠。 Android休眠与唤醒 android是在传统的linux内核电源管理设计的基础上,结合手机设计的实际需求而进化出的一套电源管理系统,其核心内容有:wakelock 、early_suspend与late_resume。 wakelock在Android的电源管理系统中扮演一个核心的角色。wakelock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得。这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了,内核就会启动休眠的那套机制来进入休眠。 当系统在启动完毕后,会自己去加一把名为“main“的锁,而当系统有意愿去睡眠时则会先去释放这把“main”锁,在android中,在early_suspend的最后一步会去释放“main”锁(wake_unlock: main)。释放完后则会去检查是否还有其他存在的锁,如果没有则直接进入睡眠过程。 它的缺点是,如果有某一应用获锁而不释放或者因一直在执行某种操作而没时间来释放的话,则会导致系统一直进入不了睡眠状态,功耗过大。 early_suspend:先与linux内核的睡眠过程被调用。一般在手机系统的设计中对背光的操

Android系统的开机画面显示过程分析 分类:Android2012-07-0900:561252人阅读评论(39)收藏举报 好几个月都没有更新过博客了,从今天开始,老罗将尝试对Android系统的UI实现作一个系统的分析,也算是落实之前所作出的承诺。提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了。Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。本文将详细分析这三个开机画面的显示过程,以便可以开启我们对Android系统UI实现的分析之路。 第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。接下来,我们就分别分析这三个画面是如何在fb上显示的。 1.第一个开机画面的显示过程 Android系统的第一个开机画面其实是Linux内核的启动画面。在默认情况下,这个画面是不会出现的,除非我们在编译内核的时候,启用以下两个编译选项: CONFIG_FRAMEBUFFER_CONSOLE CONFIG_LOGO 第一个编译选项表示内核支持帧缓冲区控制台,它对应的配置菜单项为:Device Drivers--->Graphics support--->Console display driver support--->Framebuffer Console support。第二个编译选项表示内核在启动的过程中,需要显示LOGO,它对应的配置菜单项为:Device Drivers--->Graphics support--->Bootup logo。配置Android 内核编译选项可以参考在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)一文。 帧缓冲区硬件设备在内核中有一个对应的驱动程序模块fbmem,它实现在文件kernel/goldfish/drivers/video/fbmem.c中,它的初始化函数如下所示: 1/**

实验二 android基本控件实验 【目的】 熟悉Android常用控件的基本操作,掌握它们的基本使用方法。了解控件之间的构成关系,熟悉适配器的使用原理。 【要求】 1、了解控件的继承关系; 2、掌握适配器的使用; 3、掌握信息提示的实现机制; 4、实现基本界面。 【原理】 1.控件类之间的关系 android.view.View类(视图类)呈现了最基本的UI构造块。View类是Android中的一个超类,几乎包含了所有的屏幕类型,主要负责绘制和事件处理。 Android中控件类的扩展结构如图所示。 View有众多的扩展者,它们大部分是在android.widget包中,这些继承者实际上就是Android 系统中的“控件”。View实际上就是各个控件的基类,创建交互式的图形用户界面的基础。View的直接继承者包括文本视图(TextView)、图像视图(ImageView)、进度条(ProgressBar)等。它们各自又有众多的继承者。每个控件除了继承父类功能之外,一般还具有自己的公有 方法、保护方法、XML属性等。 在Android中使用各种控件的一般情况是在布局文件中可以实现UI的外观,然后在Java文件中实现对各种控件的控制动作。控件类的名称也是它们在布局文件XML中使用的标签名称。

2.控件通用行为和属性 View是Android中所有控件类的基类,因此View中一些内容是所有控件类都具有的通用行为和属性。 提示:由于Java语言不支持多重继承,因此Android控件不可能以基本功能的“排列组合”的方式实现。在这种情况下,为了实现功能的复用,基类的功能往往做得较强,作为控件的祖先类,View所实现的功能也是最多的。 控件类经常在布局文件中使用,因此其可以使用XML属性(XMLAttributes),和Java代码经常具有对应关系。 View作为各种控件的基类,其XML属性所有控件通用,XML属性及其对应的方法如表1所示。 表1 View中的XML属性及其对应的方法 其中,android:id表示控件的标识,通常需要在布局文件中指定这个属性。View中与控件标识相关的几个方法如下所示: public int getId() // 获得控件的id(int类型)

在 Eclipse 环境中进行 Android 应用程序开发 开始之前 本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程序。第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段。第二个应用程序示例涉及比较复杂的 Android 特性,包括联系人搜索和 Google Maps 地址查找。要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的。开发 Android 应用程序需要Java? 编程技能,但是对于本教程不是必需的。 关于本教程 我们为什么要关注 Android?有两个原因使 Android 成为重要的平台。首先,Google 引入了 Android,它在很短时间内就获得了市场的关注。Google 正在进军移动市场。它在这个市场上采取的第一个行动就是发布 Android 和 Open Handset Alliance,这是一个令人印象深刻的起点。第二,Android 不仅仅是另一种包含电话、菜单和触摸屏功能的移动平台。您将在本教程中了解到,Android 提供了一种不同的应用程序开发方法。由于可以对请求的操作和代码进行运行时绑定,Android 的体系结构支持高度可定制的软件环境。无论是考虑市场因素还是 Android 的技术方面,它都是一个值得研究的平台。 本教程分为以下几节: ?Android 基础知识和必需的工具 ?Android Software Developer Kit ?构建和调试 SaySomething Android 应用程序 ?创建内容提供器和 Google Maps 应用程序 系统需求 本教程需要结合使用几种技术。 Eclipse 平台Eclipse 是一个运行插件的平台。您应该安装 Eclipse Classic 的最新版本(本教程使用 V3.3.1)。Android Developer Tools按照安装 Android SDK中的说明安装 Android Developer Tools(Eclipse 插件)。 源代码本教程中的源代码片段包括: ?AndroidManifest.xml(片段)—这个文件是 Android 应用程序的应用程序部署描述符。 ?IntentReceiver —演示 IntentReceiver 的实现,这个类处理 AndroidManifest.xml 文件中 IntentFilter 标记所公布的 intent。 ?SaySomething.java —实现一个 Android 活动,这是本教程的示例应用程序的主要入口点。 ?Main.xml —这个文件包含 Android 活动所用的视觉元素或资源。 ?R.java —这个文件是由 Android Developer Tools 自动生成的,它把视觉资源“连接” 到 Java 源代码。 ?AndroidManifest.xml(完整)—这是完整的 AndroidManfest.xml 文件,包含每个重要元素的描述。

第一章Android GDI之基本原理及其总体 框架 Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了。但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理。 GDI主要管理图形图像的输出,从整体方向上来看,GDI可以被认为是一个物理屏幕使用的管理器。因为在实际的产品中,我们需要在物理屏幕上输出不同的窗口,而每个窗口认为自己独占屏幕的使用,对所有窗口输出,应用程序不会关心物理屏幕是否被别的窗口占用,而只是关心自己在本窗口的输出,至于输出是否能在屏幕上看见,则需要GDI来管理。 从最上层到最底层的数据流的分析可以看到实际上GDI在上层为GUI提供一个抽象的概念,就好像操作系统中的文件系统所提供文件,目录等抽象概念一样,GDI输出抽象成了文本,画笔,位图操作等设备无关的操作,让应用程序员只需要面对逻辑的设备上下文进行输出操作,而不要涉及到具体输出设备,以及输出边界的管理。GDI负责将文本、线条、位图等概念对象映射到具体的物理设备,所以GDI的在大体方向上可以分为以下几大要素:画布 字体 文本输出 绘画对象 位图输出 Android的GDI系统 Android的GDI系统所涉及到概念太多,加之使用了OpenGL使得Android的层次和代

码很繁杂。但是我们对于Android的GDI系统需要了解的方面不是他的静态的代码关系,而是动态的对象关系,在逻辑运行的架构上理解GDI。我们首先还是需要从代码结构开始我们的理解。 Frameworks/Libs/Surfaceflinger Frameworks/base/core/jni/android_view_Surface.cpp Frameworks/base/core/java/android/view/surface.java Frameworks/base/Graphics:绘图接口 Frameworks/Libs/Ui External/Skia 其中External/Skia是一个C++的2D图形引擎库,Android的2D绘制系统都是建立在该基础之上.Skia完成了:文本输出,位图,点,线,图像解码等功能。在这里给出Android GDI 的基本框架示意图。 对于上面的GDI架构图我们只是一个大概的了解,我们有太多的问题需要解决,有太多的疑问需要得到答案,我就一直在想,为什么设计者有提出如此众多的概念,这个概念的背景是什么?他要管理什么,他要抽象什么?从前面知道,Android的整个设计理念就是无边界化,他是如何穿透Linux进程这个鸿沟来达到无边界的?Surface,Canvas,Layer,LayerBase, NativeBuffer,SurfaceFlinger,SurfaceFlingerClient这些到底是一个什么东西?如

参考答案 第一章 一、填空题。 1、嵌入式系统主要融合了计算机软硬件技术、通信技术和微电子技术,它是将计算机直接嵌入到应用系统中,利用计算机的高速处理能力以实现某些特定的功能。 2、目前国内对嵌入式系统普遍认同的定义是:以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 3、嵌入式系统一般由嵌入式计算机和执行部件组成,其中嵌入式计算机主要由四个部分组成,它们分别是:硬件层、中间层、系统软件层以及应用软件层。 4、嵌入式处理器目前主要有ARM、MIPS、Power PC、68K等,其中arm处理器有三大特点:体积小、低功耗、的成本和高性能,16/32位双指令集,全球合作伙伴众多。 5、常见的嵌入式操作系统有:Linux、Vxworks、WinCE、Palm、uc/OS-II和eCOS。 6、嵌入式系统开发的一般流程主要包括系统需求分析、体系结构设计、软硬件及机械系统设计、系统集成、系统测试,最后得到最终产品。 二、选择题 1、嵌入式系统中硬件层主要包含了嵌入式系统重要的硬件设备:、存储器(SDRAM、ROM等)、设备I/O接口等。(A) A、嵌入式处理器 B、嵌入式控制器 C、单片机 D、集成芯片 2、20世纪90年代以后,随着系统应用对实时性要求的提高,系统软件规模不断上升,实时核逐渐发展为,并作为一种软件平台逐步成为目前国际嵌入式系统的主流。(D) A、分时多任务操作系统 B、多任务操作系统 C、实时操作系统 D、实时多任务操作系统 3、由于其高可靠性,在美国的火星表面登陆的火星探测器上也使用的嵌入式操作系统是。(B) A、Palm B、VxWorks C、Linux D、WinCE [在此处键入]

实例解析Android HAL的开发方法 本篇文章为大家带来的是,通过分析台湾的Jollen的mokoid 工程代码,和在s5pc100平台上实现过程种遇到的问题,解析Andorid HAL的开发方法。我相信,看完本篇文章,对你的学习非常有帮助。因为本篇文章来自华清远见,最具权威! 一、我们需要做个HAL介绍,现有HAL架构由Patrick Brady (Google) 在2008 Google I/O演讲中提出的,如下图。 Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚。思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space。而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是一个开源的平台。也许也正是因为Android 不遵从GPL,所以Greg Kroah-Hartman才在2.6.33内核将Andorid驱动从linux中删除。GPL和硬件厂商目前还是有着无法弥合的裂痕。Android想要把这个问题处理好也是不容易的。 二、总结下来,Android HAL存在的原因主要有: 1. 并不是所有的硬件设备都有标准的linux kernel的接口 2. KERNEL DRIVER涉及到GPL的版权。某些设备制造商并不原因公开硬件驱动,所以才去用HAL方式绕过GPL。

3. 针对某些硬件,An有一些特殊的需求。 三、HAL内容 1、HAL 主要的储存于以下目录: (注意:HAL在其它目录下也可以正常编译) ● libhardware_legacy/ - 旧的架构、采取链接库模块的观念进行 ● libhardware/ - 新架构、调整为 HAL stub 的观念 ● ril/ - Radio Interface Layer ● msm7k QUAL平台相关 主要包含以下一些模块:Gps、Vibrator、Wifi、Copybit、Audio、Camera、Lights、Ril、Overlay 等。 2、两种 HAL 架构比较 目前存在两种HAL架构,位于libhardware_legacy目录下的“旧HAL架构”和位于libhardware目录下的“新HAL架构”。两种框架如下图所示。

关于Android平台下的sensor介绍 随着移动互联网技术的普及,人们对智能手机的需要也越来越多。而在众多 智能手机操作系统之中,Android 系统凭借着Google 的技术支持及其开源特性在短时间内迅速占领大量的市场。传感器系统可以让智能手机的功能更加丰富多 彩,所以传感器设备已经成为智能手机必备的组件之一。Android 系统可以支持 多种传感器,有的传感器已经在Android 的框架中使用,大多数传感器由应用程 序使用。 本文基于MTK6582 的平台上Android 系统的传感器模块进行移植和 开发,对Android 系统框架和开发环境进行了简介,对Android 系统的传感器模块的驱动层和硬件抽象层的开发进行深入的分析与研究,概括并总结了传感器模 块的工作原理和工作流程,对传感器的数据采集、数据传输、设备休眠和设备控 制等方面进行了具体的设计与实现,最终在MTK6582 的平台上实现了传感器模 块的驱动层和硬件抽象层。 Android 系统可大致分为四部分,应用层、框架层、硬件抽象层、Linux 驱动层,Android 系统的传感器模块涉及到了Android 系统的各个层次。应用 层以Java 为编程语言,一般为第三方开发的应用程序,也有一些是Google 自 己提供的应用程序,框架层是Google 自己开发的,有着完整代码的体系,提 供完善的接口,以便第三方开发应用程序。硬件抽象层是能以封闭源码形式提 供硬件驱动模块,可以把框架层与驱动层隔开,使得Android 框架层的开发能 在完全不考虑驱动程序的前提下进行。驱动层会根据硬件的设计对传感器进行 初始化和寄存器的读写,使传感器正常工作。 Android 系统支持多种传感器,包括加速度传感器、磁力域传感器、方向传感 器、陀螺仪、光线传感器、压力传感器、温度传感器、接近传感器,一般手 机都支持加速度传感器、磁力域传感器、方向传感器、光线传感器、接近传感 器,也有一些比较高端的手机支持陀螺仪。

Android操作系统分析 穆英华 基于Linux内核的Android操作系统尽管非常年轻,却已经占领了智能手机9%的市场,而且还在向其它移动平台及嵌入式领域迅速扩张着。下图为2010年一季度的智能手机操作系统占有率统计。在国内外制造商纷纷推出基于Android的产品、Android Market中的应用程序飞速增长的背景下,有必要对Android操作系统的情况进行调研,对比其与Midinux的优劣势、估计其机遇或威胁。本文将从以下几个方面分析Android:目标用户群、支持硬件架构、平台技术架构、应用程序数量、未来发展方向。 一.目标用户群 覆盖高、中、低端智能手机用户是Android的主要目标,尤其是市场上基于ARM11处理器的智能手机已经降到1000元人民币的价格,让低成本的硬件配置也可以运行Android系统,更使得Android从中高端扩展到低端成为可能。除智能手机外,Android已经渗透到了平板电脑、上网本,乃至汽车电子、机顶盒、电子相册、无绳电话等各移动平台和嵌入式产品领域。 对于Android的智能手机和平板电脑用户,Android Market中种类丰富和数量众多的应用程序是其选择Android的重要原因,没有众多可选择的第三方应用程序,操作系统就是再性能优异,也不会对用户有任何杀伤力。这一点类似于苹果的iOS,但总体来说,Android 的用户不会像苹果用户那样忠诚、他们中的很大一部分也不会像苹果用户那样为数码产品花费那么多金钱,可以说Android更大众一些。 二. 支持硬件架构 1.支持的硬件架构 目前Android已经移植到了ARM、X86、M IP S各体系架构中的很多处理器核、处理器芯片、以及更多的板级结构上,对PPC等体系架构的移植也早已开始。如高通、三星等芯片制造商推出的基于ARM C ortex-A8处理器核及P o w er V R显示核心的处理器芯片早已移植Android成功,并被联想的Le Ph one、魅族的M9等许多手机采用,多核的C ortex-A9也蓄势待发。随着

本文主要讲解开发Android平台下的LKM(Linux Kernel Module)的步骤,以及如何使用Android Emulator调试LKM。 一、编译android内核 1.首先运行模拟器(emulator命令所在目录为androidsdk/tools/,可将其添加至系统环境变量PATH中) emulator -avd android4 注意:本人使用的是android4的版本,android2.x的版本也可使用 2.goldfish内核下载 git clone https://www.360docs.net/doc/e418120817.html,/kernel/goldfish.git 3.从模拟器中将/proc/config.gz文件复制到goldfish(即kernel)目录 cd goldfish/ adb pull /proc/config.gz . 4.将config.zg解压 gunzip config.gz mv config .config 5.进行编译 make ARCH=arm CROSS_COMPILE=arm-eabi- -j4 注意:本人所用arm toolchain为NDKr5c版本,NDKr7所用的gcc 4.4.3版本编译后的模块在加载时会出问题,切莫使用。也可自己编译arm toolchain 6.通过emulator运行刚刚编译好的kernel emulator -kernel /Volumes/Software/Android/kernel/goldfish/arch/arm/boot/zImage -avd android4 7.通过"About phone",可以查看当前内核信息

相关文档
最新文档