




免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中南财经政法大学程序开发实践课程报告浅析安卓应用程序开发技术组 长 * (*)组 员 * (*)* (*)* (*)专 业信息管理与信息系统(2010级)指导教师*完成日期2012年6月目 录前言31 简介31.1 技术原理41.2 开发平台简介42 开发流程52.1 技术准备52.2 开发步骤52.3 部分代码分析93 问题及分析143.1 技术优势143.2 系统漏洞153.3 优化发展154 项目组成员分工情况1前言 Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。Android作为目前最流行的手机操作系统,关于其应用开发技术已经成了人们主要感兴趣的技术之一,此次我们浅析一下其开发的主要流程技术,便于参考学习,同时加强人们对于Android系统的理解。本篇论文主要介绍一下该开发技术的工作步骤,以及部分参考代码的分析,目的在于更好地理解其技术实现。简要说明其在不同平台上的实现,并分析在目前的Android市场中出现的系统和技术方面的不足,以及优化设想。1、 简介1.1 技术原理 Android系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。 Linux Kernel Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。 如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。 如果你只是做应用开发,就不需要深入了解Linux Kernel层。 Android Runtime Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以将 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。 Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。 Libraries Android包含一个C/C+库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库: 系统C库-标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备 媒体库-基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG 界面管理-管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层 LibWebCore-新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图 SGL-基本的2D图形引擎 3D库-基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅 FreeType -位图和矢量字体渲染 SQLite -所有应用程序都可以使用的强大而轻量级的关系数据库引擎 Application Framework 通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。 开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。 所有的应用程序其实是一组服务和系统,包括: 视图(View)-丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器 内容提供者(Content Providers)-使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据 资源管理器(Resource Manager)-提供访问非代码资源,如本地化字符串、图形和布局文件 通知管理器(Notification Manager)-使所有的应用程序能够在状态栏显示自定义警告 活动管理器(Activity Manager)-管理应用程序生命周期,提供通用的导航回退功能 Applications Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发! 从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆迭(Software Stack),或称为软件迭层架构,迭层主要分成三层:操作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。1.2平台Android系统采用Linux作为内核,其开发平台主要具有以下功能: + Application framework: 可重用的和可替换的组件部分,在这个层面上,所有的软件都是平等的。 Dalvik virtul machine: 一个基于Linux的虚拟机。 Integrated browser: 一个基于开源的WebKit引擎的浏览器,在应用程序层。 Optimized graphics: 包含一个自定义的2D图形库和基于OpenGL ES 1.0 标准的3D实现。 SQLite: 数据库 Media support: 通用的音频,视频和对各种图片格式的支持(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) GSM Telephony: GSM 移动网络, 硬件支持。 Bluetooth, EDGE, 3G, and WiFi: 都依赖于硬件支持。 Camera, GPS, compass, and accelerometer: 都依赖于硬件支持。 Rich development environment: 包含一套完整的开发工具集,方便跟踪调试,内存检测和性能测试,而且提供了Eclipse的插件。2、 开发流程 2.1 技术准备开发环境 1. Eclipse + Android SDK + ADT2. JDK 1.6或1.53. VMWARE+Ubuntu Linux4. Android源代码 2.2 开发步骤 1、在Eclipse中新建Android工程 工程名 JNITest Package名Test.powerise.JNITest Activity名 JNItest 应用程序名 JNItest2、编辑res/layout/main.xml内容注:Test_powerise_JNITest_JNITest.c前面有一个tab,$(JNI_H_INCLUDE)前面有一个tab3、 编辑Test.poserise.JNITest下的java文件JNITest.java代码 1package Test.powerise.JNITest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.TexTestiew; 6 7 public class JNITest extends Activity 8 static 9 System.loadLibrary(JNITest); 10 11 12 public native String GetTest(); 13 14 public void onCreate(Bundle savedInstanceState) 15 super.onCreate(savedInstanceState); 16 setContenTestiew(R.layout.main); 17 String str = GetTest(); 18 TexTestiew JNITest = (TexTestiew) findViewById(R.id.JNITest); 19 JNITest.setText(str); 20 21 224、用javah命令生成head文件(1). 设置好jdk环境变量(2). 运行cmd进入工程的根目录下(3). 运行javah -classpath bin -d jni Test.powerise.JNITest.JNITest(4). 会在根目录下生成一个.h的头文件内容如下:代码 1/* DO NOT EDIT THIS FILE - it is machine generated */ 2#include 3/* Header for class Test_powerise_JNITest_JNITest */ 4 5#ifndef _Included_Test_powerise_JNITest_JNITest 6#define _Included_Test_powerise_JNITest_JNITest 7#ifdef _cplusplus 8extern C 9#endif 10/* 11 * Class: Test_powerise_JNITest_JNITest 12 * Method: GetTest 13 * Signature: ()Ljava/lang/String; 14 */ 15JNIEXPORTjstringJNICALL Java_Test_powerise_JNITest_GetTest 16 (JNIEnv *, jobject); 17 18#ifdef _cplusplus 19 20#endif 21#endif5、编写C/C+文件如下代码#include Test_powerise_JNITest_JNITest.h JNIEXPORT jstring JNICALL Java_Test_powerise_JNITest_JNITest_GetTest (JNIEnv * env, jobject obj) return (*env)-NewStringUTF(env, (char *)JNITest Native String); 6、 编写Android.mk文件代码 1LOCAL_PATH := $(call my-dir) 2include $(CLEAR_VARS) 3LOCAL_SRC_FILES:= 4 Test_powerise_JNITest_JNITest.c 5LOCAL_C_INCLUDES := 6 $(JNI_H_INCLUDE) 7LOCAL_SHARED_LIBRARIES := libutils 8LOCAL_PRELINK_MODULE := false 9LOCAL_MODULE := libJNITest 10include $(BUILD_SHARED_LIBRARY) 7、编译生成动态库(1). 打开Ubuntu虚拟机(2). 新建文件夹 路径:/mydroid/external/libJNITest(mydroid的为android的源码根文件夹)(3). 把上面编写好的头文件、c/c+源文件、make文件拷贝进上面目录中(4). 执行如下命令:1cd mydroid/external/libJNITest 2. ././build/envsetup.sh (注:.和./之间有一个空格) 3mm 注:如果上面的命令不成功或没有加最前面的点,这个命令将无效 编译成功的后会在下面目录中生成libJNITest.so文件mydroid/out/target/product/generic/system/lib/ 8、在模拟器中执行程序首先要把so文件拷到/system/lib目录下(1). 启动模拟器(2). 设置android sdk的环境变量(3). 运行cmd,执行如下命令:adb remount adb push libJNITest.so /system/lib 不要关闭模拟器,运行java程序JNITest,屏幕会出现“JNITest Native String”这段字符串。代码执行成功!代码 2.3 部分代码解析举例 1. 应用程序的每个屏幕的显示都通过继承和扩展基类Activity 类来实现。重写Activity 类的onCreate()方法,在onCreate()方法中做游戏的初始化工作,该类的代码如下。 1 package wyf.ytl; /声明所在类 2 import android.app.Activity; /引入相关类 3 /该处省略了部分类的引入代码4 import android.view.WindowManager; /引入相关类 5 public class KLSDActivity extends Activity 6 WelcomeView welcomeView; / “欢迎”动画界面的引用 7 GameView gameView; /游戏界面的引用 8 AboutView aboutView; / “关于”界面 9 HelpView helpView; / “帮助”界面 10 Handler myHandler = new Handler() /用来更新 UI线程中的控件 11 public void handleMessage(Message msg) 12 if(msg.what = 1) / “欢迎”界面发送的消息 13 if(welcomeView != null) 14 welcomeView = null; 15 16 initGameView(); /初始化游戏界面 17 KLSDActivity.this.setContentView(gameView); 18 else if(msg.what = 2) /游戏胜利或者失败时点击屏幕 19 if(gameView != null) 20 gameView = null; 21 22 initWelcomeView(); /初始化“欢迎”界面 23 KLSDActivity.this.setContentView(welcomeView); /切换到“欢迎”界面 24 else if(msg.what = 3) 25 initAboutView(); /初始化“关于”界面 26 KLSDActivity.this.setContentView(aboutView);/切换到“关于”界面 27 else if(msg.what = 4) 28 initHelpView(); /初始化“帮助”界面 29 KLSDActivity.this.setContentView(helpView); /切换到“帮助”界面 30 31 32 ; 33 public void onCreate(Bundle savedInstanceState) /重写的onCreate方法 34 super.onCreate(savedInstanceState); 35 /设置全屏 36 requestWindowFeature(Window.FEATURE_NO_TITLE); /去掉标题栏 37 getWindow().setFlags( 38 WindowManager.LayoutParams.FLAG_FULLSCREEN 39 40 initWelcomeView(); /初始化“欢迎”界面 41 this.setContentView(welcomeView); /切换到“欢迎”界面 42 43 public void initWelcomeView() /初始化“欢迎”界面 44 welcomeView = new WelcomeView(this); 45 46 public void initGameView() /初始化游戏界面 47 gameView = new GameView(this); 48 49 public void initAboutView() /初始化“关于”界面 50 aboutView = new AboutView(this); 51 52 public void initHelpView() /初始化“帮助”界面 53 helpView = new HelpView(this); 54 55 第69 行声明为各个界面的引用。 第1032 行创建一个Handler 类,根据接收到的信息的不同初始化不同的用户界面并切换到相应用户界面。 第3342 行为重写的onCreate 方法,其中第3539 行将屏幕设置为全屏模式,而第4041 行初始化并切换到欢迎界面。 第4354 行为各个View 的初始化方法,在各个方法中,对相应的界面进行初始化,然后在其他位置可以通过使用setContentView 方法将用户界面设置成期望的界面。 48 welcomeViewGoThread.setFlag(false); 49 while (retry) /循环50 try 51 welcomeViewDrawThread.join(); /等待线程结束52 welcomeViewGoThread.join(); /等待线程结束53 retry = false;54 55 catch (Exception e) /不断地循环,直到刷帧线程结束56 e.printStackTrace(); /打印异常信息57 58 59 60 第912 行创建了存放动画帧图片ID 的数组,将其存放到数组中方便管理,在之后进行系统维护时,如需新增动画帧,只需在此数组中添加新的ID 即可。第16 行的变量记录了当前已经绘制到图片的第几帧,在之后进行绘制时,会根据该变量的值进行图片的读取。而第18 行为界面的状态值,根据状态的不同会有不同的处理。第2128 行为该类的构造器,先得到activity 的引用,然后添加Callback 接口的实现,同时初始化图片资源及相关的线程资源。第3234 行为重写的绘制方法,代码会在之后给出,而第3537 行为重写的屏幕监听方法,负责根据玩家点击屏幕的事件的不同执行不同的操作,代码会在后面进行介绍。第3857 行实现了接口中的三个抽象方法,其中第3944 行的surfaceCreated 方法会在此View 创建时被调用,在方法中启动绘制线程及动画生成线程。而其中4557 行的surfaceDestroyed 方法则会在此View 被释放时被调用,在方法中等待绘制线程及动画线程的结束。接下来对图片资源的初始化方法进行介绍,代码如下所示。 1 public void initBitmap() /初始化图片方法2 paint = new Paint(); /画笔的初始化3 paint2 = new Paint();4 paint2.setAlpha(125); /设置透明度5 paint.setColor(Color.WHITE);6 paint.setAntiAlias(true); /打开抗锯齿7 paint.setTextSize(18); /设置字体大小8 bitmaps = new BitmapbitmapsID.length; /初始化图片数组9 for(int i=0; ibitmaps.length; i+) /循环初始化图片10 bitmapsi = BitmapFactory.decodeResource(getResources(),bitmapsIDi);11 12 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.menu);13 for(int i=0; imenuBitmap.length; i+) /切成小图片14 menuBitmapi = Bitmap.createBitmap(bitmap, 0,15 (bitmap.getHeight()/menuBitmap.length)*i,16 bitmap.getWidth(),17 (bitmap.getHeight()/menuBitmap.length);18 19 bitmap = null; /释放掉大图即释放掉菜单图元20 第23 行初始化两个画笔,一个用于正常图片的绘制,另一个用于绘制透明度不同的图片。 第57 行对画笔进行设置,包括颜色、抗锯齿及字体大小。 第811 行初始化欢迎动画的各个图片帧资源。 第1219 行先初始化菜单图元,然后按照一定比例将其分割成各个单个的菜单,并将其存储到图片数组中,最后释放菜单图元。绘制方法onDraw 的完善,代码如下所示。 1 protected void onDraw(Canvas canvas) /绘制方法 2 super.onDraw(canvas); 3 canvas.drawColor(Color.BLACK); /清背景 4 canvas.drawBitmap(bitmapsdrawIndex, 0, 100, paint); 5 if(status = 0) /欢迎动画播放时 6 if(drawString) /允许绘制文字时 7 canvas.drawText(点击屏幕继续 ., 103, 380, paint); /绘制文字 8 9 10 else if(status = 1) /菜单状态时 11 canvas.drawRect(0, 0, 320, 480, paint2); /绘制半透明矩形 12 for(int i=0; i60 & x130 & y60 & x180 & y60 & x230 & y60 & x280 & y310) /退出游戏 16 System.exit(0); /直接退出游戏 17 18 19 20 return super.onTouchEvent(event); 21 第3 行先得到事件的X 、Y 坐标。第5 行表示当欢迎动画正在播放时,玩家点击了屏幕,此时只需将当前状态设置成1即可,表示进入菜单状态。第817 行表示在菜单界面,根据玩家单击的按钮的不同执行不同的操作,一般的操作是向Activity 发送Handler 消息。第20 行调用父类的onTouchEvent 方法并将返回值返回。刷帧线程WelcomeViewDrawThread 类的实现对“欢迎”动画界面的服务线程WelcomeViewDrawThread 进行介绍,该类主要负责界面的定时刷新,代码如下所示。1 package wyf.ytl; /声明所在包2 import android.graphics.Canvas; /引入相关类3 import android.view.SurfaceHolder; /引入相关类4 public class WelcomeViewDrawThread extends Thread5 WelcomeView welcomeView; /welcomeView的引用6 private int sleepSpan = 100;7 private boolean flag = true; /循环标志位8 private SurfaceHolder surfaceHolder; /surfaceHolder的9 public WelcomeViewDrawThread(WelcomeView welcomeView) /构造器10 this.welcomeView = welcomeView; /得到 WelcomeView 的引用11 surfaceHolder = welcomeView.getHolder(); /得到 SurfaceHolder的引用12 13 public void run() /重写的 run方法14 Canvas c; /声明画布15 while (this.flag) 16 c = null; /将画布置空17 try 18 /锁定整个画布19 c = this.surfaceHolder.lockCanvas(null);20 synchronized (this.surfaceHolder) /同步21 welcomeView.onDraw(c); /调用绘制方法22 23 finally /用finally保证一定被执行24 if (c != null) 25 /更新屏幕显示内容26 this.surfaceHolder.unlockCanvasAndPost(c);27 28 29 try30 Thread.sleep(sleepSpan); /睡眠指定毫秒数31 catch(Exception e) /捕获异常32 e.printStackTrace(); /打印异常信息33 34 35 36 public void setFlag(boolean flag) /循环标记位的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电瓶车保险相关知识培训课件
- 北京五年级考试数学题及答案
- 电焊工职业健康知识培训课件
- 高温防护安全知识培训课件
- 2-Ethyl-ss-ketobutiryl-SCoA-2-Ethyl-ss-ketobutiryl-coenzyme-A-生命科学试剂-MCE
- 新解读《GB-T 25122.1-2018轨道交通 机车车辆用电力变流器 第1部分:特性和试验方法》
- 会考物理考试题及答案
- 电焊学徒基础知识培训总结
- 保定动力技校考试题目及答案
- 蚌埠四中近期考试试卷及答案
- 精神科意外事件防-噎食
- 国家职业技术技能标准 6-28-01-03 汽轮机运行值班员 人社厅发202226号
- GB/T 44633-2024电力突发事件信息报送技术规范
- 虹桥商务区核心区一期及南北片区集中供能专项规划
- 新人教版八年级数学上册教学计划及进度表
- 2024年新人教版地理七年级上册全册课件
- 灌浆施工工艺
- 古诗词诵读《无衣》课件+2024-2025学年统编版高中语文选择性必修上册
- 北京市西城外国语学校2024-2025学年高三上学期开学测试 数学试题含答案
- 实验室程序文件
- 北师大版数学三年级上册全册教案【完整版】
评论
0/150
提交评论