android应用开发流程

android应用开发流程
android应用开发流程

给菜鸟看的Android应用开发全流程——好多Android

开发中,没人告诉过你的事

很多菜鸟开始学习Android开发,去网上搜集过很多“Android开发教程”,但是搜索出来的东西,如果不是特别针对性的关键词,基本上内容都是:环境配置-工具安装-第一个Hello Android项目-项目结构、文件作用-布局-控件-……等等涉及具体开发内容的文章,最后打包发布了事;且不说这些文章又有一大半都是互相转载来转载去,单看内容,大部分都是讲具体功能实现手段,或者某个API怎么用,然而很多细节可能虽然确实很简单,却往往令菜鸟迷惑头痛不已……唉,我当年不堪回首的岁月啊!虽然这些问题可能日后看来是小意思,但当初一个菜鸟可能根本不知道这个问题的存在,更不用说用什么词去搜索;所以虽然这些问题可能也是有专门文章讲,但菜鸟们根本不知道这个关键字啊~~~~

本人靠着一本书+网上各种搜,现在总算能完成一个完整的Android开发流程。回头看看,总结一下这些经验,即给自己加深印象,也帮助后来的菜鸟,也是功德无量啊。

话说本人半路出家,编程水平实在一般,所以此文重点在流程,至于技术细节和各种实现功能的技巧,还是专门搜索专业的文章吧,不过想必彼时已经能够知道自己想要什么了,那些问题也就不算个事了。

该流程基本是本人的经验总结,未必是完全官方和教科书式的。不过虽然不一定是最好的解决办法,但起码都走得通,替后来人排除一些弯路。如果有幸被大牛看到此文,还请对不妥之处不吝赐教,哪怕路过留个名也好啊~

一、准备工作

1.技能储备

1)Java

重要程度:★★★★★

当然是掌握的越多越好,毕竟Android就是用Java语言来开发的。遇到很多没有Java 基础的朋友问:要想直接学Android,Java应该掌握到什么程度?个人认为,如果一个熟练的Java程序员技能算100分的话,掌握到40-50分,基本开发Android不会有语言上的太大障碍了。其实主要也就是Java的类、继承、接口、IO、XML解析等这些基本的操作掌握了也就可以开始用Android开发些简单应用了。话说我一个朋友完全没有Java基础,直接上手开发Android,没几天也就能写出个应用,虽然他是个C++和C#高手……编程这玩意很多东

西都是相通的,基本的搞明白了,再学学Java特有的也就算入门了。不过还是强烈建议——掌握的越多越好。

不过也不用摸不着头脑,太刻意去学,没目标抱着本《Java编程思想》学也不见得有多大效果。自己动手做个Android小应用,遇到问题了回头再针对性的去学Java。我这个半吊子也是这样,开发Android时,经常碰到一些Java比较基础的类的使用,但当时没弄明白,所以需要回头专门再看看。

2)XML

重要程度:★★★★

Android开发中很重要的一类文件,也是一种标记语言,与平台和编程语言无关,所以一般用来保存和传递各种数据、参数。在Android中,很多配置信息、数据存储,尤其是Android界面,要大量的和xml打交道。虽然很重要,但其实并不复杂,找些基本教程看看,明白xml结构和语法特点也就基本够用了。(这里顺便强烈推荐新手一个入门网站:https://www.360docs.net/doc/d04222283.html,/,简洁,全面,有力!没有多余的废话,页面干净无广告!……最主要我觉得有一定的权威性,作为XML等学习的入门网站和查询工具很有用)

3)数据库

重要程度:★★★

Android要保存数据,经常使用内置的SQLite数据库,可以使用SQL查询语言操作。所以如果有数据库使用经验,这个就简单多了。如果没接触过,就了解一些基本的SQL语句:增加、删除、修改、查询。

4)Dos

重要程度:★★

这个,貌似也谈不上掌握了,会操作就行了,因为之前碰到几个哥们,确实连cd,dir 等一点dos操作都不会用,这就稍微麻烦点了,因为无论一开始配置java,还是最后生成签名,当然还有很多场合会需要在Dos环境操作,虽然可能有部分操作已经有图像界面替代了,但还是稍微看看吧,起码很酷么~~

5)Linux

重要程度:★

好像不应该是“重要程度”,应该是会使用程度吧。Android本身是基于Linux内核开发,说不重要可能会被拍唉。

主要就是会一些基本的linux命令,su,sh,cd什么的,后期调试Android程序可能会用到,比如查看SQLite数据。也不用特意去学,需要的时候网上现找找,多用几次也就记住了。

2.工具准备

1)Eclipse

最强大的Java开发工具,安装Android开发插件后可以方便快速的开发和调试Android 程序。

2)Android SDK

Android开发工具包,包括核心API,AVD(Android虚拟设备)等,可以到Android官网下载。具体安装配置就不多写了,网上很多,我再引用这文章写成书了……

参考:https://www.360docs.net/doc/d04222283.html,/Android/tutorial/200812/171154.shtml

3)Java SDK

Java工具包,包括JDK和JRE,可到Java官网下载。

安装,配置环境变量。

参考:https://www.360docs.net/doc/d04222283.html,/huanghm88/article/details/3965218(很全,一般到path和classpath设置完就ok了)

4)其他

FireWorks:用于编辑png图片,Android中主要的图片格式。纯粹个人喜好,有其他图片编辑工具也行。

3.文档资料

1)一本纸质书

最好有本入门的纸质书,毕竟写的质量比较好的书能够尽量全部的涵盖Android开发各个方面,对新手很有帮助。

说下我当时看的吧:《深入浅出Google Android》,人民邮电出版的,不过很老了,09年的,还是基于Android API1.5。

2)API文档

Java API,Android API,重要的查询手册。不能上传附件,这个搜一下吧,很多。

二、开发

1.建立项目

在Eclipse中新建一个Android项目,基本流程是:新建项目,选择Android Project,然后输入package名、应用名和Activity名,选择Android Api版本。

菜鸟提示:package,包名,一般的命名规则是尽量独一无二,方便区分和管理,所以一般比较规范的命名都是公司域名的倒写,比如google的包,google域名是https://www.360docs.net/doc/d04222283.html,,所以包名是:com.google.*

2.基本开发流程

1)构思布局,用xml构建基本的布局和控件

2)写java程序,实体化xml的布局、控件、实现业务逻辑。

菜鸟提示:很多控件既可以在xml文件中设定各种属性,也可以在java文件中设定属性;通常如果需要动态的改变某些属性,比如setText(),则需要在java中实现,这也是非常常用的,比如按下按键,按键颜色变深等等。

3)运行,调试程序:即可以使用Android模拟器调试,也可以通过数据线,直接接手机调试。提示:如果是用模拟器调试,调试后需要修改程序再次调试时,不需要关闭模拟器,直接再次运行就可以。

4)美化、找图片:菜鸟提示:Android标准图标根据手机分辨率不同,分别有

36*36/48*48/72*72这三种尺寸,你会看到drawable-hdpi/drawable-ldpi/drawable-mdpi不同的目录用来存储不同尺寸的图标,在AndroidManifest.xml中只需要写@drawable/icon就可以,它会根据屏幕分辨率去找不同目录下的图标。(参考:

https://www.360docs.net/doc/d04222283.html,/blog/1056785)

5)关于应用中的文字等引用资源:重点说说文字吧,应用中比如菜单名字,标题等,既可以直接写在java文件中,也可先写在res/values/strings.xml文件里。不过呢,还是强烈建议,尽量都写在strings.xml文件里,这样以后要修改文字,直接改这个文件就行,否则在java程序里找可费了大劲了,尤其是要开发多语言版本的话,所有文字全部要改成外语,当然还是在strings.xml里写方便的多。养成个好习惯,不要嫌麻烦,Android系统里专门弄这么个文件是有道理的。

6)最后,切记切记,修改AndroidManifest.xml文件,修改版本信息,加上需要的各种权限,如发送短信,访问网络等等,否则程序发布了,很多相关功能没法用。

三、打包发布

每次发布前都是最激动人心的时刻啊~然而这部分网上很少有专门讲的(也许我手拙没找到),针对这部分我还专门到开发论坛发布了很多帖子提问,时至今日,除了同样困扰的菜鸟帮顶,无人回答……鄙视一下。也正因如此,动了写这篇文章的念头,Android开发,很多东西简单,但是从没有人和你说过~

1.加入广告

我们很多开发的应用,最终目的是发布到网上给大家用,如果顺便能有收入也是我们的一项劳动成果,虽然很多很惨淡(又是我不堪回首的过去啊)。

1)选择广告平台:常用的有Google的AdMob,国内的有:有米,微云等等,至于说哪个效果最好,众说纷纭,最好还是自己亲自试试。还有一种平台是各种广告平台的集成,能根据使用者优化,动态选择。但因为某些电子市场不允许这个,我就没用,也就暂时不点名了,想试试的,百度……(我没说是第一个哈~)。

不过呢,最好固定一两个效果比较好的,因为很多平台要提款的话,必须达到一定额度,而且太分散的话,自己添加着也挺麻烦的。当然,如果这个平台效果公认的已经落后了,还是要毅然换平台的,毕竟不同的广告联盟广告主资源水平还是有差距。

2)普遍有一个说法,如果是针对国外的应用,最好还是Google的Admob,针对英文环境能够提供的广告数量也多。不过本人没用过,不多说了。至于为什么没用,见下文。

3)进入正题,如何给程序加入广告呢?通常步骤是:下载该平台的sdk包,把jar加入到你项目的buildpath,然后在主程序里加上调用广告的程序,再在界面中设置展示广告的位置,最后修改AndroidManifest.xml文件,加入广告涉及的程序、权限等。然后,欧了!

具体详细的安装方法,看广告平台提供的说明文档就行了,放心,一定会非常详细,一步一步教你,因为他们比你更希望你的应用中展示他们的广告。

2.添加最终用户许可协议

类似License授权使用之类的,可能你已经在某些程序中见过,第一次启动,显示的那一大篇文字,却几乎不看,直接点“Accept”……具体添加步骤……网上还真没有几个讲这玩意的,要不说很多东西没人告诉你呢。我还是从书上看来的,好几页,也懒得抄了。话说,其实这东西主要就是保护你的知识产权的,也不知道是咱们缺少这意识,还是太简单没人写。

找了半天找到个老外写的:

https://www.360docs.net/doc/d04222283.html,/blog/tutorial/adding-eula-to-android-app/,差不多就是这个步骤。我也只用过一次,是在给摩托罗拉电子市场提交应用时,人家明确要求要有这个东西。到时候需要的话就参考一下,不想弄这个呢,也完全不影响你程序的正常使用。

3.数字签名:你开发的Android应用必须有签名才能安装。之前调试的时候,是Android SDK 自动用默认的签名调试,发布的时候必须要重新生成一个签名;另外,同一个应用的不同版本,要使用同一个签名,这样安装程序的时候,才会自动升级,新版本代替旧版本。否则,不同的签名系统会认为是不同的应用,而且包名(之前的package)必须不一样。具体签名过程,参考这里:https://www.360docs.net/doc/d04222283.html,/feisky/archive/2010/01/17/1650076.html

还有这里:

https://www.360docs.net/doc/d04222283.html,/blog/814660

其实这里连带打包都包括了。

4.打包为可安装的apk文件:Eclipse中,右击需要签名的工程-->android tools-->export signed application package...

出现对话框,选择需要签名的工程;next,选择上面生成的android.keystore文件位置和设置的密码;next;

next,选择签名生成文件的位置和名称

finish,搞定啦...

5.发布你的应用程序

1)首先,如果应用中有广告,应先上传到对应广告平台。审核通过后,你的广告才真正启用。

2)发布到其他电子市场。这一步其实可以和上一步同时进行。但一般为了防止你没测试到的错误或者其他原因,广告平台审核未通过,还需要再次修改,而且一般的广告平台1~2个工作日就可以审核完成,稍微等一下不误事。

广告审核通过后,就可以发布到各大电子市场啦!

以安卓市场为例,先要到这里注册开发者身份,然后提交你的应用,当然一般还要提交应用截图等信息,截图可以在模拟器上用电脑截图,也可以在手机上用截图软件截图(推荐个截图软件:ScreenCapture,https://www.360docs.net/doc/d04222283.html,/thread-737845-1-1.html下载)。

上传完,填好信息,就等着审核吧。审核通过了,正式上线,然后你就可以在安卓电子市场搜索到你的应用了~

其他的电子市场类似,我常用的有:

https://www.360docs.net/doc/d04222283.html,

https://www.360docs.net/doc/d04222283.html,

https://www.360docs.net/doc/d04222283.html,

其他还有好多,木蚂蚁,爱米,机锋网等等。另外中国移动MM市场不允许广告,要注意一下。其他电信、联通也有自己的应用市场。

当然,还有个最重要的Google的Android Market,这个电子市场可是全球销售啊~不过因为你懂的原因,没有直接的中国大陆地区注册。要注册这里的开发者,必有有个支持美元的信用卡,而且需要25美元/每年(好像是)的注册费,注册地中国地区最近的只有香港,而且貌似有点麻烦,所以我也没去注册,有兴趣的试试。

其实直接把apk文件复制给别人就可以用了,只不过电子市场终究是传播最快的一种途径。如果有自己的博客、微博等等,也可以发个链接推广。

P.S.:多去论坛看看,多提问,还是会有很多同好回复的~多试验。再推荐两个常用网站:

https://www.360docs.net/doc/d04222283.html,/questions一个老外的编程论坛,继承了老外事无巨细、不厌其烦解答的风格,基本你能想到的问题大部分都有

https://www.360docs.net/doc/d04222283.html,/很棒的图标搜索网站,美化必备。

嗯,差不多就这些吧,the END. Happy Androiding~

android系统开机启动流程分析

一,系统引导bootloader 加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。还有ramdisk】 二,内核kernel bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。 内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space) 内核zImage解压缩 head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系 统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init 会调用kernel_init启动init进程(缺省是/init)。然后执行schedule开始任务调度。这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。 三,Init进程启动 【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】 init进程启动后,根据init.rc 和init. .rc脚本文件建立几个基本 服务(servicemanager zygote),然后担当property service 的功能 打开.rc文件,解析文件内容。【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。 建立service进程。【service_start(…) execve(…)】 在init.c中,完成以下工作 1、初始化log系统【解析/init.rc和init.%hardware%.rc文件,在两个 文件解析步骤2时执行“early-init”行动】 2、初始化设备【在/dev下创建所有设备节点,下载firmwares】 3、初始化属性服务器【在两个文件解析步骤2时执行“init”行动】

Android应用开发基本知识点汇总

Android应用开发基本知识点汇总 Activity 一生命周期 4种状态 running / paused / stopped / killed 生命周期 Activity启动 onCreate -> onStart -> onResume 点Home返回主界面 onPause -> onStop 再次回到原Activity onRestart -> onStart -> onResume 退出Activity onPause -> onStop -> onDestroy 进程优先级前台/可见/服务/后台/空 二任务栈 三启动模式 standard singleTop 栈顶复用 singleTask 栈内复用 singeInstance 四scheme跳转协议 服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面 Fragment 一第五大组件 为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适Fragment加载到Activity的两种方式 静态加载xml 动态加载fragmentTransaction.add(id, fragment, “name”); .commit; FragmentPagerAdapter与FragmentStatePagerAdapter

FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况FragmentPagerAdapter并没有回收内存,只是detach了Activity 二生命周期 onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach 先创建Activity后创建Fragment,先销毁Fragment后销毁Activity 三Fragment之间的通信 Fragment调用Activity getActivity Activity调用Fragment 接口回调 Fragment调用Fragment方法findFragmentById 四FragmentManager replace add remove Service 一应用场景,与Thread区别 Service是什么后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作 Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后 二开启Service的两种方式 StartService onCreate -> onStartCommand -> onBind -> onDestroy onStartCommand return START_STICKY;

(完整版)Android应用开发期末考试题

试题 一、选择题 1 android虚拟设备的缩写是(AVD) 2 Android SDK目前支持的操作系统(DOS) 3 Android开发工具插件(ADT)没有提供的开发功能(自动更新) 4Android SDK提供一些开发工具可以把应用软件打包成Android格式文件(APK) 5 Android当中基本的所有的UI都是由(view)或者其子类实现的 6以下不是Android中调试项目的正确步骤(测试用例) 7下列不是Activity的生命周期方法之一的是(OnResume) 8以下可以做EditText编辑框的提示信息是(adroid:hint) 9以下不是Activity启动的方法是(gotoActivity) 10以下不是手机操作系统的是(windows vista) 二、填空题 1 Android平台由操作系统,中间件,用户界面和应用软件组成的。 2 Android平台提供了2D,3D的图形支持,数据库支持SQLite,并且集成了浏览器 3目前已知的可以用来搭建Android开发环境的系统有windows,Linux,Mac 等4开发中推荐使用的IDE开发组合为IDE,eclipse,ADI来开发 5 Android SDK主要以java语言为基础 6创建工程时需要填写的信息名称有工程名,包的名字,Activity的名字还有应用的名字

7 Android.jar是一个标准的压缩包,其内容包含的是编译后的class,包含了全部的API 三、简答题 1 Android SDK中API的包结构的划分?至少五个 android.util,android.os,android.content,android.view,android.graphics,android.text 2 Android软件框架结构自上而下可分为哪些层? 应用程序(Application)、应用程序框架(Application Framework)、各种库(Libraries)和Android运行环境(RunTime)、操作系统层(OS) 3 Android应用程序的4大组件是什么? Activity、Broadcast Intent Receiver、Service、Content Provider 4 Android应用工程文件结构有哪些? 源文件(包含Activity),R.java文件,Android Library,assets目录res目录,drawble目录,layout目录,values目录,AndroidManifest.xml 5 Android开发应用程序最有可能使用到的应用框架部分是哪些? 一组View(UI)组件,Content Providers,Resource Manger,Notification Manger,Activiy Manger 6 Android底层库包含哪些? 系统C库,媒体库,Surface Manager,LibWebCore,SGL 四、编程 1实现点击一个按钮,结束当前Activity并将需要返回的数据放置并关闭当前窗体请编写核心代码 Bundle bundle = new Bundle ( ); Bundle.putString(“store”,”数据来自Activity1”) ;

分析Android 开机启动慢的原因

开机启动花了40多秒,正常开机只需要28秒就能开机起来。 内核的启动我没有去分析,另一个同事分析的。我主要是分析从SystemServer启来到开机动画结束显示解锁界面的这段时间,也就是开机动画的第三个动画开始到结束这段时间,这是个比较耗时阶段,一般都在17秒左右(见过牛B的手机,只需5秒)。 SystemServer分两步执行:init1和init2。init1主要是初始化native的服务,代码在sy stem_init.cpp的system_init,初始化了SurfaceFlinger和SensorService这两个native的服务。init2启动的是java的服务,比如ActivityManagerService、WindowManagerService、PackageManagerService等,在这个过程中PackageManagerService用的时间最长,因为PackageManagerService会去扫描特定目录下的jar包和apk文件。 在开机时间需要40多秒的时,从Log上可以看到,从SurfaceFlinger初始化到动画结束,要27秒左右的时间,即从SurfaceFlinger::init的LOGI("SurfaceFlinger is starting")这句Log到void SurfaceFlinger::bootFinished()的LOGI("Boot is finished (%ld ms)", long(ns 2ms(duration)) ),需要27秒左右的时间,这显然是太长了,但到底是慢在哪了呢?应该在个中间的点,二分一下,于是想到了以启动服务前后作为分隔:是服务启动慢了,还是在服务启动后的这段时间慢?以ActivityManagerService的Slog.i(TAG, "System now ready")的这句Log为分割点,对比了一下,在从SurfaceFlinger is starting到System now read y多了7秒左右的时间,这说明SystemServer在init1和init2过程中启动慢了,通过排查,发现在init1启动的时候,花了7秒多的时间,也就是system_init的LOGI("Entered system _init()")到LOGI("System server: starting Android runtime.\n")这段时间用了7秒多,而正常情况是400毫秒便可以初始化完,通过添加Log看到,在SensorService启动时,用了比较长的时间。 不断的添加Log发现,在启动SensorService时候,关闭设备文件变慢了,每次关闭一个/dev/input/下的设备文件需要100ms左右,而SensorService有60~70次的关闭文件,大概有7s左右的时间。 调用流程是: frameworks/base/cmds/system_server/library/system_init.cpp: system_init->SensorServi ce::instantiate frameworks/native/services/sensorservice/SensorService.cpp: void SensorService::onFi rstRef()->SensorDevice& dev(SensorDevice::getInstance()) hardware/libsensors/SensorDevice.cpp: SensorDevice::SensorDevice()->sensors_open hardware/libsensors/sensors.cpp: open_sensors->sensors_poll_context_t sensors_poll_context_t执行打开每个传感器设备时,遍历/dev/input/目录下的设备文件,以匹配当前需要打开的设备,遍历文件是在 hardware/libsensors/SensorBase.cpp的openInput下实现,如果打开的设备文件不是正在打开的设备文件,会执行下面语句的else部分: if (!strcmp(name, inputName)) { strcpy(input_name, filename); break;

Android 开机启动流程

Android的开机流程 1. 系统引导bootloader 1) 源码:bootable/bootloader/* 2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择 a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.i mg包含内核,基本的文件系统,用于工程模式的烧写 c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况) 2. 内核kernel 1) 源码:kernel/* 2) 说明:kernel由bootloader加载 3. 文件系统及应用init 1) 源码:system/core/init/* 2) 配置文件:system/rootdir/init.rc, 3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1)源码:frameworks/base/cmds/app_main.cpp等 2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process a)建立Java Runtime,建立虚拟机 b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序 c) 启动System Server 5. 系统服务system server 1)源码:frameworks/base/services/java/com/android/server/SystemServer.jav a 2) 说明:被zygote启动,通过SystemManager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等) 6. 桌面launcher 1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现 2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher 7. 解锁 1) 源码: frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置

基于MT6752的 android 系统启动流程分析报告

基于MT6752的Android系统启动流程分析报告 1、Bootloader引导 (2) 2、Linux内核启动 (23) 3、Android系统启动 (23) 报告人: 日期:2016.09.03

对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。但根据芯片架构和平台的不同,在启动的Bootloader阶段会有所差异。 本文以MTK的MT6752平台为例,分析一下基于该平台的Android系统启动流程。 1、Bootloader引导 1.1、Bootloader基本介绍 BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备,目的就是引导linux操作系统及Android框架(framework)。 它的主要功能包括设置处理器和内存的频率、调试信息端口、可引导的存储设备等等。在可执行环境创建好之后,接下来把software装载到内存并执行。除了装载software,一个外部工具也能和bootloader握手(handshake),可指示设备进入不同的操作模式,比如USB下载模式和META模式。就算没有外部工具的握手,通过外部任何组合或是客户自定义按键,bootloader也能够进入这些模式。 由于不同处理器芯片厂商对arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的bootloader。 下面是几个arm平台的bootloader方案: marvell(pxa935) : bootROM + OBM + BLOB informax(im9815) : bootROM + barbox + U-boot mediatek(mt6517) : bootROM + pre-loader + U-boot broadcom(bcm2157) : bootROM + boot1/boot2 + U-boot 而对MT6752平台,MTK对bootloader引导方案又进行了调整,它将bootloader分为以下两个部分: (1) 第1部分bootloader,是MTK内部(in-house)的pre-loader,这部分依赖平台。 (2) 第2部分bootloader,是LK(little kernel的缩写,作用同常见的u-boot差不多),这部分依赖操作系统,负责引导linux操作系统和Android框架。 1.2、bootloader的工作流程 1.2.1 bootloader正常的启动流程 先来看启动流程图:

《Android应用开发》课程标准

《Android应用开发》 课程标准 内蒙古电子信息职业技术学院计算机科学系

一.课程设置概述 1.1课程在相关专业中的性质与定位 Android应用开发是物联网应用技术专业(应用开发方向)的核心课程之一,是Android应用程序开发方法的主要课程,是Android应用的主要领域。为了适应高职学生的学习情况,该课程以Android应用技术为重点,逐步阐述Android应用体系结构,介绍Android应用常见的几个功能。采用项目+案例教学法,既让学生掌握Android的基本知识,同时,也让学生在潜移默化中了解一些Android 的高级开发技术,从而为今后实现Android应用开发打下基础。 本课程的任务是使学生通过学习和操作实践,了解和掌握Android的主流应用技术及其开发方法,掌握Android的sdk、Activity、高级UI、网络、多媒体体方面的编程技术。为进一步学习移动互联工程师后续课程打下良好的理论和实践基础。 1.2 本课程的基本教学理念 (一)突出学生主体,注重技能培养,回归能力本位 Android应用开发是移动互联工程师的专业核心课程,注重软件开发基本理论、基本方法和基本技能的学习及素质教育,激发学生的学习兴趣,在启发、提示下使其自主地、全面地理解软件的基本理论和基本方法,提高学生的思维能力和实际操作技能,增强他们理论联系实际的能力,培养学生的创新精神,使学生养成观察、独立分析和解决问题的习惯;以提高技能、磨砺意识、活跃思维、展现个性和拓宽视野。 (二)尊重个体差异,注重过程评价,促进学生发展 本课程在教学过程中,倡导自主学习,启发学生对设定问题积极思考、分析,鼓励多种思维方式并将其表达出来,尊重个体差异。采用项目教学法进行教学,每个项目的成绩采取自评、互评、教师综合评价相结合的方式能激励学生的学习兴趣和自主学习能力的发展。教师在给学生评价成绩时应尽量以学习过程中的评价为主,注重培养和激发学生的学习积极性和自信心。最后期末的成绩评价应注重检测学生的知识应用能力。学生的最终课程成绩应由平时的各次项目成绩和期末的评定成绩按一定比例构成,在把握比例构成时要有利于促进学生的知识应用能力。建立以过程培养促进个体发展,以学生可持续发展能力评价教学过程的双向促进机制,以激发兴趣、展现个性、发展心智和提高素质为基本理念。 (三)整合课程资源,开放创新教学,拓展学习渠道 本课程在教学过程中,提醒学生留意观察并思考生活中接触的Android系统应用,鼓励其结合生活中熟悉的操作方法提出问题或假设,在教师引导下,通过分析、推理,使学生自主学习、总结,以便增强学生对Android开发方法基本理论的理解;通过课堂讲解与讨论、案例分析等促进学生对所学理论的理解和运用,以培 养其实际操作技能。充分利用现代教学手段,不断改进教学方式,突出典型案例

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

Android应用开发基础习题

-- 任务一Android 开发环境的搭建 第一部分知识回顾与思考 1.Android 的四层架构分别包括哪几层?分别起到什么作用? 答:Linux 内核层(Linux Kernel ):基于Linux 内核,内核为上层系统提供了系统服务。 系统库层(Libraries ):系统库基于C/C++ 语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework ):为开发者提供了一系列的Java API,包括图形用户界面组件

View 、SQLite 数据库相关的API 、Service 组件等。 应用程序层(Applications ):包含了Android 平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android 四层架构中,应用框架层使用的是什么语法?(C)A .CB .C++C.Java D.Android 2.Android 四层架构中,系统库层使用的是什么语法?(B)A .VBB.C /C++C.Java D .Android 3.应用程序员编写的Android 应用程序,主要是调用(B)提供的接口进行实现。 A .应用程序层DCB.应用框架层.应用视图层.系统库层

二、填空题(请在括号内填空) 1.在Android 智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android 的(应用程 序)层。 2.为了让程序员更加方便的运行调试程序,Android 提供了(模拟器),可以方便的将程序运行其上, 而不要实际的移动终端。 程序运行,我们需要安装(Java 3.为了支持)。JDK 三、简答题 1.简述Android 开发环境安装的步骤。 答:下载并安装JDK ,配置JDK 的环境变量; 从Anroid 官网上下载Android 开发组件(包含Eclipse 和

Android开机启动流程样本

Android的开机流程 1. 系统引导bootloader 1) 源码: bootable/bootloader/* 2) 说明: 加电后, CPU将先执行bootloader程序, 此处有三种选择 a) 开机按Camera+Power启动到fastboot, 即命令或SD卡烧写模式, 不加载内核及文件系统, 此处能够进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式, 加载recovery.img, recovery.img包含内核, 基本的文件系统, 用于工程模式的烧写 c) 开机按Power, 正常启动系统, 加载boot.img, boot.img包含内核, 基本文件系统, 用于正常启动手机( 以下只分析正常启动的情况) 2. 内核kernel 1) 源码: kernel/* 2) 说明: kernel由bootloader加载 3. 文件系统及应用init 1) 源码: system/core/init/* 2) 配置文件: system/rootdir/init.rc, 3) 说明: init是一个由内核启动的用户级进程, 它按照init.rc中的设置执行: 启动服务( 这里的服务指linux底层服务, 如adbd提供adb支持, vold提供SD卡挂载等) , 执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1) 源码: frameworks/base/cmds/app_main.cpp等 2) 说明: zygote是一个在init.rc中被指定启动的服务, 该服务对应的命令是/system/bin/app_process

Android系统启动过程详解

Android系统启动过程详解 Android系统启动过程 首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。 启动的过程如下图所示:(图片来自网上,后面有地址)

下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结, 以下学习过程中代码片段中均有省略不完整,请参照源码。

一Init进程的启动 init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行, 并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。 启动过程就是代码init.c中main函数执行过程:system\core\init\init. c 在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听…… 下面看两个重要的过程:rc文件解析和服务启动。 1 rc文件解析 .rc文件是Android使用的初始化脚本文件(System/Core/Init/readm e.txt中有描述: four broad classes of statements which are Actions, Commands, Services, and Options.) 其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是linux 命令, 还有一些是android 添加的,如:class_start :启动服务,class_stop :关闭服务,等等。 其中Options是针对Service 的选项的。 系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。具体看一下启动脚本:\system\core\rootdir\init.rc 在解析rc脚本文件时,将相应的类型放入各自的List中: \system\core\init\Init_parser.c :init_parse_config_file( )存入到 action_queue、action_list、service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。 这其中包含了服务:adbd、servicemanager、vold、ril-daemon、deb uggerd、surfaceflinger、zygote、media…… 2 服务启动 文件解析完成之后将service放入到service_list中。 文件解析完成之后将service放入到service_list中。 \system\core\init\builtins.c

Android应用开发试题

Android应用开发试题 一、选择题(每题2分,共30分) 1. 下列不是手机操作系统的是?(D) A.Android B. Window Mobile C. Apple IPhone IOS D.windows vista 2.Android的VM虚拟机是哪个?A A.Dalvik B.JVM C.KVM D.framework 3. AndroidVM虚拟机中运行的文件的后缀名为(B) A.class B.apk C.dex D.xml 4. 下面关于Android DVM的进程和Liunx的进程,应用程序的进程说法正确的是 A.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Liunx中的一个进程,所以说可以认为是同一个概念。B B.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例,而每一个DVM不一定都是在Liunx 中的一个进程,所以说可以认为不是一个概念。 C.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM不一定都是在Liunx中的一个进程,所以说可以认为不是同一个概念。 D.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Liunx中的一个进程,所以说可以认为是同一个概念。 5. 下列哪个可做EditText编辑框的提示信息?(D) A. android:inputType B. android:text C. android:digits D. android:hint 6. 在AndroidManifes.xml中描述一个Activity时,该Activity的label属性是指定什么( B) A.指定Activity的图标 B.指定Activity的显示图标 C.指定Activity和类相关联的类名 D.指定该Activity的唯一标识 7. 关于ContentValues类说法正确的是( A ) A.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是String类型,而值都是基本类型。 B.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是任意类型,而值都是基本类型。 C.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名可以使空,而值都是String类型。 D.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是String类型,而值也是String类型。 8. Activity对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行( A) A.onPause() B.onCreate() C.onResume() D.onStart 9. 下列哪个不是Activity的生命周期方法之一?(B) A. onCreate B. startActivity C. onStart D. onResume 10.如果在android应用程序中需要发送短信,那么需要在AndroidManifest.xml文件中增加什么样的权限( D). A.发送短信,无需配置权限

Android SystemBar启动流程分析

Android SystemBar启动流程分析 SystemBars的服务被start时,最终会调用该类的onNoService()方法。 @Override public void start() { if (DEBUG) Log.d(TAG, "start"); ServiceMonitor mServiceMonitor = new ServiceMonitor(TAG, DEBUG, mContext, Settings.Secure.BAR_SERVICE_COMPONENT, this); mServiceMonitor.start(); // will call onNoService if no remote service is found } @Override public void onNoService() { if (DEBUG) Log.d(TAG, "onNoService"); createStatusBarFromConfig(); // fallback to using an in-process implementation } private void createStatusBarFromConfig() { … mStatusBar = (BaseStatusBar) cls.newInstance(); … mStatusBar.start(); } BaseStatusBar是一个抽象类,故调用其子类的PhoneStatusBar的start 函数。 @Override public void start() { … super.start(); … } 子类的start又调用了父类的start public void start() { … createAndAddWindows(); … }

AndroidL系统启动及加载流程分析

Android L系统启动及加载流程分析 1、概述 Android L的启动可以分为几个步骤:Linux内核启动、init进程启动、native系统服务及java系统服务启动、Home启动,主要过程如下图: 图1 整个启动流程跟4.4及之前的版本相差不多,只是有个别不同之处,本文我们主要分析Linux内核启动之后的过程。

2、启动过程分析 2.1 init进程启动 当系统内核加载完成之后,会启动init守护进程,它是内核启动的第一个用户级进程,是Android的一个进程,进程号为1,init进程启动后执行入口函数main(),主要操作为: 图2 AndroidL上将selinux的安全等级提高了,设为了enforcing模式,4.4上是permissive模式。 解析rc脚本文件,即init.rc脚本,该文件是Android初始化脚本,定义了一系列的动作和执行这些动作的时间阶段e aryl-init、init、early-boot、boot、post-fs等阶段。init进程main 函数中会根据这些阶段进行解析执行。AndroidL上为了流程更清晰,增加了charger(充电开机)、ffbm(工厂模式)、以及late-init阶段,实际上这些阶段是对其他阶段的组合执行,比如late-init:

2.2 ServiceManager的启动 servicemanager的启动就是init进程通过init.rc脚本启动的: 源码在frameworks/native/cmds/servicemanager/service_manager.c中,servicemanager是服务管理器,它本身也是一个服务(handle=0),通过binder调用,为native和Java系统服务提供注册和查询服务的,即某个服务启动后,需要将自己注册到servicemanager中,供其他服务或者应用查询使用。AndroidL上servicemanger中在处理注册和查询动作之前添加了selinux安全检测相关的处理。 2.3 SurfaceFinger、MediaServer进程启动 Android4.4以前,surfacefinger的启动根据属性system_init.startsurfaceflinger,决定是通过init.rc启动还是systemserver进程启动,之后的版本包括AndoridL都是通过init.rc启动的: 启动后会向servicemanager进程注册服务中,该服务启动时主要功能是初始化整个显

android应用技术简介

Android技术应用简介 摘要:近几年来,Android逐渐成为便携设备上的主要操作系统。2011年Android 在全球的市场份额首次超过塞班系统,跃居全球第一。本文主要通过阐述Android的主要思想、发展状况以及核心技术来使读者对Android有一个初步的认识。 关键词:Android、linux、NDK、google 这学期我们开设了《Android应用程序开发》这门课程。这么课程开始的时候同学们都很兴奋。因为Android在现在是最为流行的操作系统。同学们大部分用的手机都是Android操作系统。所以对它的名字非常熟悉,但是对它的真正意义和具体是如何实现Android应用程序却十分陌生。同学们都希望了解到自己的手机上的应用程序到底是如何实现其功能的。所以对这门课程产生了极大的兴趣。 这门课程主要给我们介绍了Android开发环境、应用程序、生命周期、用户界面、组件通信与广播信息、后台服务、数据存储与访问、位置服务与地图应用、Android NDK开发这9个方面的内容。让我们对Android有一个初步的认知。这本书上的内容仅仅是Android程序开发的一小部分,是引导我们正确看待Android。在今后的学习中还需要我们多看关于Android的书籍,关注Android 各方面的消息,多做关于Android的实验和课题。这样才能进一步了解这个当今全球最为流行的操作系统。 1、Android简介 Android是一种以linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由google 收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。 Android的系统架构和其它操作系统一样,采用了分层的架构。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。 Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android 应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。 在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:python、lua、tcl、php等等),还有其他诸如:QT(qt for android)、Mono(mono for android)等一些著名编程框架也开始

android开机启动流程简单分析

android开机启动流程简单分析 android启动 当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下: int main(int argc, char** argv) { ..... //创建文件夹,挂载 // Get the basic filesystem setup we need put together in the initramdisk // on / and then we'll let the rc file figure out the rest. if (is_first_stage) { mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); mkdir("/dev/pts", 0755); mkdir("/dev/socket", 0755); mount("devpts", "/dev/pts", "devpts", 0, NULL); #define MAKE_STR(x) __STRING(x) mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC)); mount("sysfs", "/sys", "sysfs", 0, NULL); } ..... //打印日志,设置log的级别 klog_init(); klog_set_level(KLOG_NOTICE_LEVEL); ..... Parser& parser = Parser::GetInstance(); parser.AddSectionParser("service",std::make_unique()); parser.AddSectionParser("on", std::make_unique()); parser.AddSectionParser("import", std::make_unique()); // 加载init.rc配置文件 parser.ParseConfig("/init.rc"); } 加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码: 从Android L开始,在/system/core/rootdir 目录中有4 个zygote 相关的启动脚本如下图:

相关文档
最新文档