Android官网文档学习: Application Fundamentals

时间:2022-07-16 05:45:40

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>