Android官网文档学习: Application Fundamentals
Android应用使用Java语言编写。Android SDK工具用来编译Android包(后缀.apk文件的压缩文件)中的代码,以及数据和资源。.apk文件就是一个应用程序。
一旦安装到设备上,每个Android应用程序都会运行在自己的安全沙盒中(即JVM中):
· Android系统是一个多用户Linux系统,里面的每一个应用都是一个不同的用户。
· 默认情况下,系统会为每个应用分配一个唯一的用户ID(这个ID仅仅被系统使用,App并不知道)。系统设置了应用里的每个文件的权限,仅仅分配的用户ID能够访问它们。
root@android:/system/app # ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 580 392 c01573c4 00019cfc S /init root 2 0 0 0 c00b59a8 00000000 S kthreadd root 3 2 0 0 c009ea24 00000000 S ksoftirqd/0 root 4 2 0 0 c00b186c 00000000 S kworker/0:0 root 5 2 0 0 c00b186c 00000000 S kworker/u:0 root 6 2 0 0 c00e8aec 00000000 S migration/0 root 10 2 0 0 c00b1a4c 00000000 S khelper root 11 2 0 0 c00b1a4c 00000000 S suspend_sys_syn root 12 2 0 0 c00b1a4c 00000000 S suspend root 13 2 0 0 c00eab34 00000000 S irq/53-msmdatam root 14 2 0 0 c012ab6c 00000000 S sync_supers root 15 2 0 0 c012bcdc 00000000 S bdi-default root 16 2 0 0 c00b1a4c 00000000 S kblockd root 17 2 0 0 c03585e4 00000000 S khubd root 18 2 0 0 c00b1a4c 00000000 S l2cap root 19 2 0 0 c00b1a4c 00000000 S a2mp root 20 2 0 0 c00b1a4c 00000000 S modem_notifier root 21 2 0 0 c00b1a4c 00000000 S smd_channel_clo root 22 2 0 0 c00b1a4c 00000000 S smsm_cb_wq root 23 2 0 0 c00b186c 00000000 S kworker/u:1 root 24 2 0 0 c00b186c 00000000 S kworker/0:1 root 25 2 0 0 c0035634 00000000 D kworker/u:2 root 26 2 0 0 c00b1a4c 00000000 S rpcrouter root 27 2 0 0 c00b1a4c 00000000 S msm_ipc_router root 28 2 0 0 c00b1a4c 00000000 S msm_adsp_probe root 29 2 0 0 c00b1a4c 00000000 S rpcrotuer_smd_x root 30 2 0 0 c003d190 00000000 S krpcserversd root 32 2 0 0 c00371b8 00000000 D voicememo_rpc root 33 2 0 0 c00b1a4c 00000000 S rmt_storage root 34 2 0 0 c00371b8 00000000 D krmt_storagecln root 35 2 0 0 c003e068 00000000 D krmt_storagecln root 37 2 0 0 c0037394 00000000 S kadspd root 38 2 0 0 c0123af8 00000000 S kswapd0 root 39 2 0 0 c017d044 00000000 S fsnotify_mark root 40 2 0 0 c00b1a4c 00000000 S crypto root 53 2 0 0 c00b1a4c 00000000 S mdp_dma_wq root 54 2 0 0 c00b1a4c 00000000 S mdp_vsync_wq root 55 2 0 0 c00b1a4c 00000000 S mdp_pipe_ctrl_w root 57 2 0 0 c00b1a4c 00000000 S k_hsuart root 58 2 0 0 c00b1a4c 00000000 S diag_wq root 59 2 0 0 c00b1a4c 00000000 S diag_cntl_wq root 61 2 0 0 c00b1a4c 00000000 S kgsl-3d0 root 68 2 0 0 c00b1a4c 00000000 S k_rmnet_mux_wor root 69 2 0 0 c00b1a4c 00000000 S f_mtp root 70 2 0 0 c0393e04 00000000 S file-storage root 71 2 0 0 c00b1a4c 00000000 S uether root 72 2 0 0 c00b1a4c 00000000 S goodix_wq root 73 2 0 0 c00371b8 00000000 D krtcclntd root 74 2 0 0 c003e068 00000000 D krtcclntcbd root 75 2 0 0 c00b1a4c 00000000 S kfmradio root 76 2 0 0 c00371b8 00000000 D kbatteryclntd root 77 2 0 0 c003e068 00000000 D kbatteryclntcbd root 78 2 0 0 c00b1a4c 00000000 S battery_queue root 79 2 0 0 c00b1a4c 00000000 S msm_adc root 80 2 0 0 c00b1a4c 00000000 S dalrpc_rcv_DAL0 root 81 2 0 0 c00b1a4c 00000000 S iewq root 82 2 0 0 c00b5620 00000000 D kinteractiveup root 83 2 0 0 c00b1a4c 00000000 S binder root 84 2 0 0 c00371b8 00000000 D koemrapiclientc root 85 2 0 0 c00b186c 00000000 S kworker/u:3 root 86 2 0 0 c05b2260 00000000 S krfcommd root 87 2 0 0 c00b1a4c 00000000 S msm-cpufreq root 88 2 0 0 c007fc48 00000000 S acdb_cb_thread root 89 2 0 0 c00371b8 00000000 D khsclntd root 90 2 0 0 c00b1a4c 00000000 S rq_stats root 91 2 0 0 c00b1a4c 00000000 S deferwq root 92 2 0 0 c0443794 00000000 S mmcqd/0 root 93 2 0 0 c00b1a4c 00000000 S 1-0026 root 94 1 460 212 c01573c4 00019cfc S /sbin/ueventd root 95 2 0 0 c0209f7c 00000000 S jbd2/mmcblk0p12 root 96 2 0 0 c00b1a4c 00000000 S ext4-dio-unwrit root 98 2 0 0 c0209f7c 00000000 S jbd2/mmcblk0p11 root 99 2 0 0 c00b1a4c 00000000 S ext4-dio-unwrit root 100 2 0 0 c0209f7c 00000000 S jbd2/mmcblk0p10 root 101 2 0 0 c00b1a4c 00000000 S ext4-dio-unwrit root 103 2 0 0 c0209f7c 00000000 S jbd2/mmcblk0p13 root 104 2 0 0 c00b1a4c 00000000 S ext4-dio-unwrit root 115 2 0 0 c016a71c 00000000 S flush-179:0 system 135 1 936 376 c0463ee0 4021dbd4 S /system/bin/servicemanager root 137 1 4152 928 ffffffff 401e5360 S /system/bin/vold root 142 1 10096 1540 ffffffff ffff0520 S /system/bin/netd root 143 1 980 416 c049aee8 4014b664 S /system/bin/debuggerd system 145 1 41936 9120 ffffffff 4025abd4 S /system/bin/surfaceflinger root 146 1 272992 38868 ffffffff 4020dcf8 S zygote drm 147 1 8892 3164 ffffffff 40226bd4 S /system/bin/drmserver media 148 1 34984 9328 ffffffff 40265bd4 S /system/bin/mediaserver bluetooth 149 1 1452 880 c01573c4 40230b28 S /system/bin/dbus-daemon root 150 1 940 404 c0539a48 400c199c S /system/bin/installd keystore 151 1 1864 876 c049aee8 4027f664 S /system/bin/keystore root 153 1 4588 1672 ffffffff 40098540 S /system/xbin/alljoyn-daemon camera 186 1 3228 884 c01573c4 401f8b28 S /system/bin/mm-qcamera-daemon root 187 1 1224 568 c01573c4 401bfb28 S /system/bin/gpu_dcvsd radio 190 1 7788 2596 ffffffff 4021cab0 S /system/bin/cnd gps 191 1 4568 816 ffffffff 400ff99c S /system/bin/wiperiface system 194 1 5404 1044 ffffffff 4015ed30 S /system/bin/ATFWD-daemon system 195 1 2012 468 ffffffff 401e5594 S /system/bin/mm-pp-daemon shell 197 1 860 484 c02b381c 4021e99c S /system/bin/sh nobody 199 1 6044 420 ffffffff 401aebd4 S /system/bin/rmt_storage system 200 1 5500 792 ffffffff 401a599c S /system/bin/port-bridge root 242 1 4508 248 ffffffff 0001363c R /sbin/adbd radio 245 1 6116 736 ffffffff 401f9cf8 S /system/bin/qmuxd radio 251 1 7320 1028 ffffffff 402a1d30 S /system/bin/netmgrd root 256 2 0 0 c00b1a4c 00000000 S k_gserial root 257 2 0 0 c00b1a4c 00000000 S k_gsmd root 258 2 0 0 c00b1a4c 00000000 S k_rmnet_work radio 267 1 16488 3936 ffffffff 401af360 S /system/bin/rild radio 271 1 15508 3640 ffffffff 40119360 S /system/bin/rild root 377 2 0 0 c00b186c 00000000 S kworker/0:2 root 378 2 0 0 c00b186c 00000000 S kworker/0:3 system 503 146 371880 53216 ffffffff 4020dbd4 S system_server u0_a52 617 146 305856 46444 ffffffff 4020eab0 S com.android.systemui u0_a18 663 146 286152 34872 ffffffff 4020eab0 S android.process.media u0_a57 685 146 290508 42136 ffffffff 4020eab0 S com.huawei.inputmethod.hwpal radio 712 146 315472 42640 ffffffff 4020eab0 S com.android.phone u0_a19 724 146 282492 33144 ffffffff 4020eab0 S android.process.acore u0_a3 740 146 311864 51044 ffffffff 4020eab0 S com.android.launcher u0_a55 800 146 281500 30268 ffffffff 4020eab0 S com.android.smspush u0_a50 812 146 282396 31784 ffffffff 4020eab0 S com.qrd.simcontacts u0_a0 861 146 302668 36880 ffffffff 4020eab0 S android.process.acore system 913 1 1376 640 c01573c4 400fdb28 S /system/bin/qosmgr root 916 1 5280 592 ffffffff 40214d30 S /system/bin/mpdecision root 918 1 12048 1356 ffffffff 4027bd30 S /system/bin/thermald u0_a68 1014 146 293500 36900 ffffffff 4020eab0 S telecom.mdesk:remote u0_a0 1089 146 330700 52860 ffffffff 4020eab0 S com.android.contacts u0_a56 1146 146 282412 31252 ffffffff 4020eab0 S com.qualcomm.wiper u0_a29 1357 146 283172 35368 ffffffff 4020eab0 S com.huawei.android.hwouc root 1455 1 3664 396 ffffffff 00008db8 S /system/bin/logserver system 1456 146 281668 31376 ffffffff 4020eab0 S com.android.qualcomm u0_a66 1487 146 286296 34052 ffffffff 4020eab0 S com.besttone.hall u0_a74 1529 146 291144 35732 ffffffff 4020eab0 S com.chinatelecom.pim u0_a87 1547 146 283096 31072 ffffffff 4020eab0 S com.ct.client u0_a89 1566 146 292160 36136 ffffffff 4020eab0 S com.eshore.ezone u0_a31 1621 146 283436 33984 ffffffff 4020eab0 S com.huawei.android.totemweather u0_a68 1653 146 288320 35896 ffffffff 4020eab0 S android.process.acore u0_a17 1731 146 282980 32212 ffffffff 4020eab0 S com.android.deskclock u0_a9 1750 146 291676 32540 ffffffff 4020eab0 S com.android.calendar u0_a10 1771 146 285664 33256 ffffffff 4020eab0 S com.android.providers.calendar u0_a11 1834 146 285572 31608 ffffffff 4020eab0 S com.qualcomm.calendarwidget root 1932 2 0 0 c00371b8 00000000 D audmgr_rpc u0_a60 2088 146 294644 37616 ffffffff 4020eab0 S com.wuba u0_a60 2121 146 294396 37424 ffffffff 4020eab0 S com.wuba:downapkservice u0_a92 2174 146 286124 37696 ffffffff 4020eab0 S com.lasun.mobile.client.activity u0_a94 2193 146 285100 32096 ffffffff 4020eab0 S com.gwsoft.imusic.controller u0_a96 2207 146 288348 34328 ffffffff 4020eab0 S com.corp21cn.mail189 u0_a23 2280 146 283320 32568 ffffffff 4020eab0 S com.android.gallery3d u0_a47 2298 146 284524 31588 ffffffff 4020eab0 S com.android.quicksearchbox u0_a19 2314 146 281508 30932 ffffffff 4020eab0 S com.ctc.epush:remote root 2407 242 864 508 c00112c0 401e3540 S /system/bin/sh root 2515 2407 1056 448 00000000 4025299c R ps
其中 PID表示进程ID,PPID表示父进程ID,RSS表示 Resident Set Size 实际使用物理内存(包含共享库占用的内存)。关于RSS详细相关知识,请参考:
《Android内存之VSS/RSS/PSS/USS》地址: http://hi.baidu.com/donghaozheng/item/6133dcc5eeaf6bbb0c0a7bfa
可以看到每个应用都有一个ID,可以看到父进程PPID=146的PID为zygote。
·每个进程都有自己的虚拟机,所以应用程序能独立其他应用运行。
·默认每个应用在它自己的Linux进程运行。Android在该应用任何组件被执行时启动它的进程。然后当它不在需要时关闭或系统必须为其他应用恢复内存时关闭。
通过这种方式,Android系统实现了最小权限原则(Principle of Least Privilege)。即,每个应用,默认情况下只能访问它申请的组件。这样创造了一个非常安全的环境,应用不能访问没授权的部分。
然而,有如下方法可与其他应用分享自己的数据和访问系统服务:
·为配置两个应用共享相同的Linux用户ID是可能的,在这种情况下,他们可以访问各自的文件。保存系统资源,相同的用户ID应用程序也能通过配置运行在相同的Linux进程并共享相同的VM(该应用必须拥有相同的签名)
·一个应用可以申请权限来访问设备的数据,比如用户的联系人,短彩信消息,可挂载的SD卡,照相机,蓝牙,还有更多。
这些覆盖一个Android应用存在一个系统内的基本因素。其余的文档将会介绍:
·核心的framework组件来定义你的应用。
·manifest文件来为你的应用定义组件和需求特征。
·资源与应用代码的分离,并且允许你的应用为一系列设备配置可以优美的优化它的行为。
应用组件
应用组件是一个Android应用的必要编译块。每个组件有不同的点来让系统进入你应用。不是所有的组件都有进入点来供用户访问并且有一些依赖于各自,但是每个存在它自己的实体并扮演一个特别的角色。——每个都是唯一的编译块来帮助应用定义如下行为:
有四种不同的应用组件。每类都有一个清晰的目标和确切的生命周期来定义组件是如何创建和销毁的。
有如下四种应用组件:
Activity:
一个应用存在一个单独的屏幕。比如,一个email应用可以有个activity来显示新邮件的列表,另一个activity来创建一个邮件,另一个来阅读邮件。尽管activities在一个email应用里一起工作来形成一个内在的用户经验,但每个activity相较于其他activity都是独立的。这样一来,不同的应用可以启动任何一个activity(当然,前提是email应用允许)。比如,一个camera应用能启动email应用里的一个activity来创建一个邮件,从而可以分享一张照片。
一个activity继承Activity成为其子类,并且你可以学到更多的Actitiies相关知识,请见相应文档。
Services
一个服务是一个运行于后台的可以执行耗时的操作或为远程进程工作。服务不提供UI接口。比如,一个服务可以在用户在其他应用时在后台播放音乐。或者用户在界面与其他activity交互时在后台获取网络数据。其他组件,比如activity,可以启动一个服务并且让它运行或绑定来与它进行交互。
一个service集成Seivice成为其子类。有关更多的Services只是请见相应文档。
Content providers
一个content provider管理一系列共享的应用数据。你可以存储数据到文件系统,SQLite数据库,网络,或其他可持续的存储地点供你的应用访问。通过content provider,其他应用可以查询甚至修改数据(前提是content provider允许)。比如,Android系统提供content provider来管理用户联系人信息。像这样,任何应用拥有合适的权限就能查询content provider部分(比如 ContactsContract.Data)来读取和写入信息到某一个人的信息。
Content prividers同样可以读写私有数据并且不共享。比如,Note Pad例子程序使用content provider来保存便条。
一个content provider继承ContentProvider成为其子类。并且必须继承标准的API来确保其他应用执行交互。想要查看更多的信息,请见Content Providers相关文档。
Broadcast receivers
一个braodcast receiver是一个响应系统级广播的组件。许多广播来自系统。比如,一个广播通知灭屏,电池低电量,或抓屏。应用也能初始化广播,比如,让其他应用知道有些数据已经下载到设备并且可以使用它们了。尽管广播接受者不能显示UI,它们可以在广播事件发生时创建一个状态栏通知来警告用户。更一般地,一个广播接收者仅仅对其他组件来说只是一个“大门”并且只是做很小的一部分工作。举个例子,初始化一个服务来执行基于事件的工作。
一个broadcast receiver继承BroadcastReceiver成为其子类。每个通知通过Intent对象传递。查看更多信息,请参考 BroadcastReceiver相关文档。
Activating Components
三类组件——activitie,services,broadcast receiver通过Intent来激活。Intents在运行时绑定在独立的组件(你可以认为他们是一个消息载体来请求action或其他组件)。要么这个组件属于你的应用或者其他应用。
另一个组件,content provider,不是由intents来激活。通过 ContentResolver实例来访问。content resolver处理所有直接与content provider的交互。
有不同方法来激活不同的组件:
·你可以通过一个Intent来启动一个activity(或给一个新的事来做) startActivity()或者startActivityForResult()
·你可以通过一个Intent来启动一个服务startService()。或者通过Intent来绑定一个服务 bindService().
·你可以通过一个Intent来初始化一个广播 sendBroadcast(),sendOrderedBroadcast()或 sendStickyBroadcast()。
·你可以通过 ContentResolver的query()方法来查询content provider.
The Manifest File
在一个Android系统启动一个App组件之前,系统必须知道组件存在 AndroidManifest.xml 文件(我们成为 manifest文件)。你的应用必须在这个文件里声明所有它的组件,该文件必须位于该应用工程目录的根目录。
manifest文件通过做一系列事来声明应用的组件,比如:
·标识用户访问权限,比如Internet访问权限或者读取联系人的权限。
·声明最小的API Level,来标记应用使用的最低版本API。
·声明硬件和软件使用特征。比如照相机,蓝牙服务或多点触摸。
·应用所需链接的API库,比如Google Maps library。
·其他
Declaring components
声明组件方法。比如,manifest文件定义一个activity如下:
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:icon="@drawable/app_icon.png" ... > <activity android:name="com.example.project.ExampleActivity" android:label="@string/example_label" ... > </activity> ... </application> </manifest>