
《ARM技术及其应用》实验指导书扬州大学物理科学与技术学院2019年5月
《ARM 技术及其应用》实验指导书 扬州大学物理科学与技术学院 2019 年 5 月

目录实验一Android应用开发1·001实验二Android应用开发2.026实验三Android应用开发3..·064实验四Android源码编译.·098实验五Android驱动开发·138实验六Android底层开发·171.实验七Android设备开发1.·252实验八Android设备开发2.271附录一参考程序,·288附录二补充实验307
目录 实验一 Android 应用开发 1···············································001 实验二 Android 应用开发 2···············································026 实验三 Android 应用开发 3···············································064 实验四 Android 源码编译·················································098 实验五 Android 驱动开发················································138 实验六 Android 底层开发················································171 实验七 Android 设备开发 1···············································252 实验八 Android 设备开发 2···············································271 附录一 参考程序·························································288 附录二 补充实验·························································307

实验一Android应用开发1一实验自的1理解Android服务、广播与通知基本原理。2掌握Android服务、广播与通知应用程序设计方法。3掌握Android实验箱使用方法,二实验原理2.1Android服务1Services组件一个Service是一个应用程序组件,它能完成长时间运行的操作在后台,并且不提供用户接口。另一个应用程序组件能开启一个service并且它将继续运行在后台即使用户转换到另一个应用程序。额外的,一个组件可以被绑定到一个service来和它交互甚至完成进程间通信。例如,一个service可能操作网络联接、播放音乐、执行I/O或和一个contentprovider交互,所有这些都是在后台进行。2回调方法(1)onStartCommandO系统调这个方法,当另一个组件,例如一个activity,请求启动这个service通过startServiceO。一旦这个方法执行,这个service将启动并且无期限的运行在后台。如果你实现这个,那么停止service就是你的责任了,当它的工作完成,通过调用stopSelfO)或stopServiceO。(如果你只希望提供绑定,你不需要实现这个方法)(2)onBind系统调用这个方法,当另一个组件希望绑定service(例如RPC),通过bindService()。在你这个方法的实现中,你必须提供一个客户使用的来和这个service通信的接口,通过一个IBinder。你必须一直实现这个函数,但如果你不希望允许绑定,那么你返回null。(3)onCreate0系统调用这个方法,当service第一次被创建,实现一次安装的步骤(在它调onStartCommandO)和onBindO之前)。如果service已经在运行,那么这个方法不会调用。(4)onDestroy0)系统调用这个方法,service不再使用将被摧毁。你的service应该实现这个来清理所有资源例如线程、注册的监听者、接收器等。这是service接收到的最后一个调用。2.2广播接收者1Android四大组件之BroadcastReceiverBroadcastReceiver用于接收并处理广播通知。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的broadcastreceivers来响应它觉得重要的通知。broadcastreceiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,BroadcastReceiver在后台执行,不能生成UI,对用户是不可见的。2BroadcastReceiver的注册方式1
1 实验一 Android 应用开发 1 一 实验目的 1 理解 Android 服务、广播与通知基本原理。 2 掌握 Android 服务、广播与通知应用程序设计方法。 3 掌握 Android 实验箱使用方法。 二 实验原理 2.1 Android 服务 1 Services 组件 一个 Service 是一个应用程序组件,它能完成长时间运行的操作在后台,并且不提供用户接 口。另一个应用程序组件能开启一个 service 并且它将继续运行在后台即使用户转换到另一 个应用程序。额外的,一个组件可以被绑定到一个 service 来和它交互甚至完成进程间通信。 例如,一个 service 可能操作网络联接、播放音乐、执行 I/O 或和一个 content provider 交互, 所有这些都是在后台进行。 2 回调方法 (1)onStartCommand() 系统调这个方法,当另一个组件,例如一个 activity,请求启动这个 service 通过 startService()。 一旦这个方法执行,这个 service 将启动并且无期限的运行在后台。如果你实现这个,那么 停止 service 就是你的责任了,当它的工作完成,通过调用 stopSelf()或 stopService()。(如果 你只希望提供绑定,你不需要实现这个方法) (2)onBind() 系统调用这个方法,当另一个组件希望绑定 service(例如 RPC),通过 bindService()。在你这 个方法的实现中,你必须提供一个客户使用的来和这个 service 通信的接口,通过一个 IBinder。 你必须一直实现这个函数,但如果你不希望允许绑定,那么你返回 null。 (3)onCreate() 系统调用这个方法,当 service 第一次被创建,实现一次安装的步骤(在它调 onStartCommand() 和 onBind()之前)。如果 service 已经在运行,那么这个方法不会调用。 (4)onDestroy() 系统调用这个方法,service 不再使用将被摧毁。你的 service 应该实现这个来清理所有资源 例如线程、注册的监听者、接收器等。这是 service 接收到的最后一个调用。 2.2 广播接收者 1 Android 四大组件之 BroadcastReceiver Broadcast Receiver 用于接收并处理广播通知。多数的广播是系统发起的,如地域变换、电量 不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers 来 响应它觉得重要的通知。broadcast receiver 可以通过多种方式通知用户:启动 activity、使用 NotificationManager、开启背景灯、振动设备、播放声音等,BroadcastReceiver 在后台执行, 不能生成 UI,对用户是不可见的。 2 BroadcastReceiver 的注册方式

静态注册:在AndroidManifest.xml中注册动态注册:在Activity的onResumeO方法中注册,在onPauseO方法中注销。区别:静态注册的广播当程序退出时仍然一直有效,动态注册的广播只在应用程序中有效。3BroadcastReceiver的发送与接收消息发送:广播消息的实质就是一个Intent对象。使用sendBroadcast(或sendOrderBroadcastO)方法发出去的Intent,所有满足条件的BroadcastReceiver都会执行其onReceiveO方法。sendOrderBroadcastO发出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行。消息接收:当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法,并在其中执行接收到广播时需要的操作。2.3消息通知1Notification简介Notification是应用程序提醒用户发生某些事件的一种方式,它无须某个Activity可见。通知是由NotificationManager进行处理的,它包括以下功能:显示状态栏图标、灯光/LED闪烁、让手机振动、发出声音提醒、在通知托盘中显示额外的信息和在通知托盘中使用交互式操作来广播Intent。Notification是那些不可见的应用程序组件(BroadcastReceiver、Service等)的首选机制用来提醒用户,需要他们注意的事件已经发生。它们也可以用来指示持续运行的后台Service-一特别是已经被设置为具有前台优先级的Service。常量:DEFAULTALL使用所有默认值,比如声音,振动,闪屏等等:DEFAULTLIGHTS使用默认闪光提示:DEFAULTSOUNDS使用默认提示声音:DEFAULTVIBRATE使用默认手机振动。设置flag位:FLAGAUTO_CANCEL该通知能被状态栏的清除按钮给清除掉;FLAGNO_CLEAR该通知能被状态栏的清除按钮给清除掉:FLAGONGOINGEVENT通知放置在正在运行;FLAGINSISTENT是否一直进行,比如音乐一直播放,知道用户响应。常用字段:contentlntent设置Pendinglntent对象,点击时发送该Intent;defaults添加默认效果;flags设置flag位,例如FLAG_NOCLEAR等icon设置图标:sound设置声音;tickerText显示在状态栏中的文字;when发送此通知的时间戳。2
2 静态注册:在 AndroidManifest.xml 中注册 动态注册:在 Activity 的 onResume()方法中注册,在 onPause()方法中注销。 区别:静态注册的广播当程序退出时仍然一直有效,动态注册的广播只在应用程序中有效。 3 BroadcastReceiver 的发送与接收 消息发送:广播消息的实质就是一个 Intent对象。使用sendBroadcast ()或 sendOrderBroadcast() 方法发出去的 Intent,所有满足条件的 BroadcastReceiver 都会执行其 onReceive()方法。 sendOrderBroadcast ()发出去的 Intent,会根据 BroadcastReceiver 注册时 Intent Filter 设置的优 先级的顺序来执行,相同优先级的 BroadcastReceiver 则是随机执行。 消息接收:当 Intent发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver 的 onReceive()方法。所以 当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceive()方法,并在其中执行接 收到广播时需要的操作。 2.3 消息通知 1 Notification 简介 Notification 是应用程序提醒用户发生某些事件的一种方式,它无须某个 Activity 可见。通知 是由 Notification Manager 进行处理的,它包括以下功能:显示状态栏图标、灯光/LED 闪烁、 让手机振动、发出声音提醒、在通知托盘中显示额外的信息和在通知托盘中使用交互式操作 来广播 Intent。 Notification 是那些不可见的应用程序组件(Broadcast Receiver、Service 等)的首选机制用来 提醒用户,需要他们注意的事件已经发生。它们也可以用来指示持续运行的后台 Service— —特别是已经被设置为具有前台优先级的 Service。 常量: DEFAULT_ALL 使用所有默认值,比如声音,振动,闪屏等等; DEFAULT_LIGHTS 使用默认闪光提示; DEFAULT_SOUNDS 使用默认提示声音; DEFAULT_VIBRATE 使用默认手机振动。 设置 flag 位: FLAG_AUTO_CANCEL 该通知能被状态栏的清除按钮给清除掉; FLAG_NO_CLEAR 该通知能被状态栏的清除按钮给清除掉; FLAG_ONGOING_EVENT 通知放置在正在运行; FLAG_INSISTENT 是否一直进行,比如音乐一直播放,知道用户响应。 常用字段: contentIntent 设置 PendingIntent 对象,点击时发送该 Intent; defaults 添加默认效果; flags 设置 flag 位,例如 FLAG_NO_CLEAR 等; icon 设置图标; sound 设置声音; tickerText 显示在状态栏中的文字; when 发送此通知的时间戳

2NotificationManager简介NotificationManager是用来处理Notification的系统Service。使用getSystemService方法可以获得对它的引用,通过它可以出发新的Notification,修改现有的Notification或者删除那些不再需要的Notification。NotificationManager常用方法介绍:publicvoidcancelAllO移除所有通知(只是针对当前Context下的Notification);publicvoidcancel(intid)移除标记为id的通知(只是针对当前Context下的所有Notification);publicvoidnotify(Stringtag,intid,Notificationnotification)将通知加入状态栏,标签tag,标记为id。publicvoidnotify(intid,Notificationnotification)将通知加入状态栏,标记为id。三实验内容3.1准备工作1软件准备工作(1)按下PC电源开关,启动Windows7系统。(2)单击Windows7桌面图标VMwareWorkstation,启动虚拟机管理软件VMware。(3)在VMware中,启动Linux系统Ubuntu10.04"。(4)使用用户名“ada"和密码“ada”,登录Ubuntu系统,如下图所示。星国O5)Ubuntu系统启动好之后,如果弹出UpdateManager对话框及子对话框,分别单击"Close按钮关闭这两个对话框。窗口不能立即关闭,单击左上角最小化按钮,最小化显示。3
3 2 Notification Manager 简介 Notification Manager 是用来处理 Notification 的系统 Service。使用 getSystemService 方法可 以获得对它的引用,通过它可以出发新的 Notification,修改现有的 Notification 或者删除那 些不再需要的 Notification。 NotificationManager 常用方法介绍: public void cancelAll() 移除所有通知(只是针对当前 Context 下的 Notification); public void cancel(int id) 移除标记为id的通知(只是针对当前Context下的所有Notification); public void notify(String tag ,int id, Notification notification) 将通知加入状态栏,标签 tag,标 记为 id。public void notify(int id, Notification notification) 将通知加入状态栏,标记为 id。 三 实验内容 3.1 准备工作 1 软件准备工作 (1)按下 PC 电源开关,启动 Windows 7 系统。 (2)单击 Windows 7 桌面图标“VMware Workstation”,启动虚拟机管理软件 VMware。 (3)在 VMware 中,启动 Linux 系统“Ubuntu 10.04”。 (4)使用用户名“ada”和密码“ada”,登录 Ubuntu 系统,如下图所示。 (5)Ubuntu 系统启动好之后,如果弹出“Update Manager”对话框及子对话框,分别单击“Close” 按钮关闭这两个对话框。窗口不能立即关闭,单击左上角最小化按钮,最小化显示

apparmor-utilsYour Ubuntu release is not supportedpdatesPleaseuCheckinstallUpdatesnnturC过一段时间弹出"Metacity"对话框,单击ForceQuit"按钮强制退出,如下图所示。eMetacitisnotrespondinghoosetowaitashortwhilefor it to continue ororcetheapplicationtoqiwtentirelyForceQuitWait2硬件准备工作(1)打开“物联网嵌入式平台"实验箱。(2)从实验箱中取出电源线,连接实验箱电源接口(实验箱左部)与实验室电源接线板。(3)从实验箱中取出IUSB线,链接实验箱USB接口(实验箱上部)与PCUSB接口(4)打开实验箱电源开关(实验箱左部),打开ARMCortexA9开发板电源开关(实验箱中上部)。(5)向右方拖动解锁按钮,解锁Android系统,进入Android主界面。(6)在Android主界面中,左下方依次为返回键、HOME键和多任务键,右下方显示时间,左上方为谷歌搜索,右上方为应用程序列表,中间为浏览器、照相机和时钟。向左边拖动Android桌面,出现图库”和设置"图标:单击屏幕左下方HOME键,返回主界面:向右边拖动Android桌面,出现WIFI、蓝牙、定位、屏幕旋转和屏幕亮度图标。(7)实验箱左上角复位按钮“RST”无效。实验箱下部左起第三个按钮是返回键,第四个按钮是HOME键,第六和第七个按钮是音量调节键。3创建学号目录(1)单击Ubuntu桌面图标Computer,打开文件浏览器。(2)选中文件浏览器左侧列表项目“ada”,进入用户主目录(/home/ada)。(3)单击文件浏览器菜单"Go|Location",查看用户主目录位置(/home/ada),如下图所示。(4)在文件浏览器右下部单击鼠标,弹出快捷菜单,选中"CreateFolder"项目,用自己的学号为名创建学号目录。实验中创建的文件和项目均存放在学号目录下,与其他同学相区分。后续实验作同样处理,不再赞述。,4
4 过一段时间弹出“Metacity”对话框,单击“Force Quit”按钮强制退出,如下图所示。 2 硬件准备工作 (1)打开“物联网嵌入式平台”实验箱。 (2)从实验箱中取出电源线,连接实验箱电源接口(实验箱左部)与实验室电源接线板。 (3)从实验箱中取出 USB 线,链接实验箱 USB 接口(实验箱上部)与 PC USB 接口。 (4)打开实验箱电源开关(实验箱左部),打开 ARM Cortex A9 开发板电源开关(实验箱中 上部)。 (5)向右方拖动解锁按钮,解锁 Android 系统,进入 Android 主界面。 (6)在 Android 主界面中,左下方依次为返回键、HOME 键和多任务键,右下方显示时间, 左上方为谷歌搜索,右上方为应用程序列表,中间为浏览器、照相机和时钟。向左边拖动 Android 桌面,出现“图库”和“设置”图标;单击屏幕左下方 HOME 键,返回主界面;向右边 拖动 Android 桌面,出现 WIFI、蓝牙、定位、屏幕旋转和屏幕亮度图标。 (7)实验箱左上角复位按钮“RST”无效。实验箱下部左起第三个按钮是返回键,第四个按 钮是 HOME 键,第六和第七个按钮是音量调节键。 3 创建学号目录 (1)单击 Ubuntu 桌面图标“Computer”,打开文件浏览器。 (2)选中文件浏览器左侧列表项目“ada”,进入用户主目录(/home/ada)。 (3)单击文件浏览器菜单“Go|Location”,查看用户主目录位置(/home/ada),如下图所示。 (4)在文件浏览器右下部单击鼠标,弹出快捷菜单,选中“Create Folder”项目,用自己的学 号为名创建学号目录。实验中创建的文件和项目均存放在学号目录下,与其他同学相区分。 后续实验作同样处理,不再赘述

e100%RcomViwBac1CMQationthDnslhFle SystemoncrAndrotpPrpieam-2009q3DesktopNetworkFloppyDriveTashPMuslDOCUmentDownloadLMuseayture司videonoscEnemplateVideoDoanlo口14ltems,Froe space: 216 GE3.2创建Android应用程序1双击Ubuntu桌面图标Terminal",打开终端,如下图所示。VEaLHEn可以使用菜单“FileOpenTerminal"打开新的终端。也可以使用菜单FilejOpenTab"打开新的终端表单,如下图所示。关闭新的终端表单ateroot@ubuntuxada@ubuntu:X-S15
5 3.2 创建 Android 应用程序 1 双击 Ubuntu 桌面图标“Terminal”,打开终端,如下图所示。 可以使用菜单“File|Open Terminal”打开新的终端。也可以使用菜单“File|Open Tab”打开新的 终端表单,如下图所示。关闭新的终端表单

2在终端中输入命令“sudo-s",并输入密码"ada",进入超级用户。3在终端中输入命令"studio.sh&”,后台启动AndroidStudio,弹出"WelcometoAndroidStudio”对话框,如下图所示。oowometoAndroidStudAndroid StudiooeStart'anewAcdroldStudioproject00Chesf.impo4在"WelcometoAndroidStudio”对话框,单击"StartanewAndroidStudioproject"项目,弹出“CreateNewProject"对话框的"NewProject"表单,如下图所示。NewProjectConfigure yournewprojectnnConce5在“NewProject"表单中,“Applicationname"编辑框输入应用程序名“HelloWorld",并在后面加上学号:单击"Projectlocation"静态文本右侧按钮,选择学号目录:单击右下部"Next"按钮,进入“TargetAndroidDevices"表单,如下图所示。6
6 2 在终端中输入命令“sudo -s”,并输入密码“ada”,进入超级用户。 3 在终端中输入命令“studio.sh&”,后台启动 Android Studio,弹出“Welcome to Android Studio” 对话框,如下图所示。 4 在“Welcome to Android Studio”对话框,单击“Start a new Android Studio project”项目,弹出 “Create New Project”对话框的“New Project”表单,如下图所示。 5 在“New Project”表单中,“Application name”编辑框输入应用程序名“HelloWorld”,并在后 面加上学号;单击“Project location”静态文本右侧按钮,选择学号目录;单击右下部“Next”按 钮,进入“Target Android Devices”表单,如下图所示

TargetAndroidDevicesSelecttheformfactorsyourappwillrunonDffarertplatfonPg.andTabeAPI15:fnims504BytargetingaponweAPI21MnrDTErevous,Cance6在"TargetAndroidDevices"表单中,选中"PhoneandTablet"复选框;其"minimumSDK"列表项目选为"API15:Android4.0.3(IceCreamSandwich)"项目;单击右下部"Next"按钮,进入“AddanActivitytoMobile"表单,如下图所示。AddanActivitytoMobileActMitBasic Activtyuhyan ActivtyGoogle AdMob.AdsActytCoegle Maps ActstyLagin Actsey7在“AddanActivitytoMobile"表单中,选择"EmptyActivity"项目,单击右下部"Next"按钮,进入“CustomizetheActivity"表单,如下图所示
7 6 在“Target Android Devices”表单中,选中“Phone and Tablet”复选框;其“minimum SDK”列 表项目选为“API 15: Android 4.0.3 (IceCreamSandwich)”项目;单击右下部“Next”按钮,进入 “Add an Activity to Mobile”表单,如下图所示。 7 在“Add an Activity to Mobile”表单中,选择“Empty Activity”项目,单击右下部“Next”按钮, 进入“Customize the Activity”表单,如下图所示

司ustomizetheActivityiteLayoutFileEmptyActiutyErevousJNeadConceEimish8在“CustomizetheActivity"表单中,保持默认值不变,单击右下部"Finish"按钮,完成项目创建,弹出AndroidStudio集成开发环境,如下图所示。00.0.owttylat:AodrsidShd]-[ana-rorle-ThoneasndraidWOEAXDOEAEMOILGIPEKU9单击AndroidStudio左部"Android"下拉列表,将项目视图由"Android"切换为"Project",如下图所示。8
8 8 在“Customize the Activity”表单中,保持默认值不变,单击右下部“Finish”按钮,完成项目 创建,弹出 Android Studio 集成开发环境,如下图所示。 9 单击 Android Studio 左部“Android”下拉列表,将项目视图由“Android”切换为“Project”,如 下图所示