zoukankan      html  css  js  c++  java
  • Android 系统开发学习杂记(转)

    http://blog.csdn.net/shagoo/article/details/6709430

    > 开发环境
    1、安装 Eclipse 和 android-sdk 并解压安装
    2、Eclipse 安装 AVD 插件 https://dl-ssl.google.com/android/eclipse/ 并配置 SDK Location
    3、打开 SDK Manager 安装 android packages 并配置 Virtual device(比如名为:Android_2.2)
    4、启动 Virtual device,执行:emulator.exe -avd Android_2.2,或者直接从 Eclipse 启动

    > 安装程序
    1、安装:adb install xxx.apk
    2、重装:adb install -r xxx.apk
    3、卸载:adb uninstall com.android.xxx
    程序安装位置为:/data/app/,配置文件在/data/data下

    > 系统分区
    # adb shell
    # mount
    rootfs / rootfs ro 0 0
    tmpfs /dev tmpfs rw,mode=755 0 0
    devpts /dev/pts devpts rw,mode=600 0 0
    proc /proc proc rw 0 0
    sysfs /sys sysfs rw 0 0
    none /acct cgroup rw,cpuacct 0 0
    tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
    none /dev/cpuctl cgroup rw,cpu 0 0
    /dev/block/mtdblock0 /system yaffs2 ro 0 0
    /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
    /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
    /dev/block/vold/179:0 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
    /dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
    tmpfs /mnt/sdcard/.android_secure tmpfs ro,size=0k,mode=000 0 0
    以上就是 Android 系统的分区结构,可见其挂载方式和 Linux 非常类似,熟悉 Linux 的朋友应该能很容易的看出这些分区的作用大概是什么。其中需要说明一下的可能是 /dev/block/mtdblock* 这几个核心分区(写入 ROM 的),他们都是使用 yaffs2 文件系统(基于 FLASH 存储),其中是 /system 这个分区只有特殊的 ro 只读权限,由此可见 Android 在安全性设计方面所下的一些功夫。另外 /dev/block/vold 据说是设计来替代 udev 的功能,主要用于支持一些热插拔设备。

    > 目录概览
    # ls -l
    dr-x------ root     root              2011-08-18 10:36 config
    drwxrwx--- system   cache             2011-06-21 05:32 cache
    lrwxrwxrwx root     root              2011-08-18 10:36 sdcard -> /mnt/sdcard
    drwxr-xr-x root     root              2011-08-18 10:36 acct
    drwxrwxr-x root     system            2011-08-18 10:36 mnt
    lrwxrwxrwx root     root              2011-08-18 10:36 d -> /sys/kernel/debug
    lrwxrwxrwx root     root              2011-08-18 10:36 etc -> /system/etc
    drwxr-xr-x root     root              2010-06-30 21:06 system
    drwxr-xr-x root     root              1970-01-01 00:00 sys
    drwxr-x--- root     root              1970-01-01 00:00 sbin
    dr-xr-xr-x root     root              1970-01-01 00:00 proc
    -rwxr-x--- root     root        12995 1970-01-01 00:00 init.rc
    -rwxr-x--- root     root         1677 1970-01-01 00:00 init.goldfish.rc
    -rwxr-x--- root     root       107412 1970-01-01 00:00 init
    -rw-r--r-- root     root          118 1970-01-01 00:00 default.prop
    drwxrwx--x system   system            2011-08-12 06:54 data
    drwx------ root     root              2010-01-28 00:59 root
    drwxr-xr-x root     root              2011-08-18 10:36 dev
    以上是 Android 根目录下文件目录,根据之前的分区结构可以大致看出每个目录的所处位置和大致功能,以下是几个重要目录/文件的说明:
    1、mnt                挂载点目录
    2、etc                系统主要配置文件
    3、system            Android 系统文件
    4、sys                Linux 内核文件
    5、proc                运行时文件
    6、init.rc            启动脚本
    7、default.prop        系统属性配置文件
    8、data                用户程序目录
    9、dev                设备文件

    # ls -l /system
    drwxr-xr-x root     root              2010-06-30 21:03 usr
    drwxr-xr-x root     root              2010-06-30 21:07 app
    drwxr-xr-x root     root              2010-06-30 21:05 lib
    drwxr-xr-x root     root              2010-06-30 21:07 etc
    drwxr-xr-x root     root              2010-06-30 21:06 framework
    -rw-r--r-- root     root         1532 2010-06-30 20:58 build.prop
    drwxr-xr-x root     shell             2010-06-30 21:04 xbin
    drwxr-xr-x root     root              2010-06-30 21:00 tts
    drwxr-xr-x root     root              2010-06-30 21:00 media
    drwxr-xr-x root     root              2010-06-30 21:00 fonts
    drwxr-xr-x root     shell             2010-06-30 21:04 bin
    drw-rw-rw- root     root              2011-08-18 10:36 lost+found
    以上是 system 目录下面的主要文件目录下面也简单介绍一下:
    1、usr            用户文件夹,包含共享、键盘布局、时间区域文件等
    2、app            常规下载的应用程序,这些 apk 包都是受保护的哦
    3、lib            系统底层库,如平台运行时库等
    4、etc            系统的配置文件,比如APN接入点设置等核心配置等
    5、framework    Android 系统平台核心 framework 的文件
    6、build.prop    Android 系统属性配置文件
    7、xbin            常用开发工具,比如 tcpdump/sqlite3 等
    8、bin            系统工具,比如 ps/cp/pm 等

    # ls -l /data
    drwx------ root     root              2011-06-22 02:32 property
    drwxrwx--t system   misc              2011-06-21 05:32 misc
    drwxrwx--x shell    shell             2011-06-21 05:32 local
    drwxrwx--x system   system            2011-06-21 05:32 app-private
    drwx------ system   system            2011-06-21 05:33 backup
    drwxrwxr-x system   system            2011-08-12 06:54 anr
    drwxrwx--x system   system            2011-08-20 06:50 app
    drwxrwx--x system   system            2011-08-20 06:50 data
    drwxr-x--- root     log               2011-06-21 05:32 dontpanic
    drwxrwx--x system   system            2011-08-20 06:50 dalvik-cache
    drwxrwxr-x system   system            2011-08-22 06:40 system
    drwxrwx--- root     root              2011-06-21 05:32 lost+found
    可以看到 /data 目录下结构都和应用有关,这里我们不做细究了,大家知道一下我们平时安装的用户应用/游戏程序都被安装在 /data/app 下就可以了。

    # set
    ANDROID_ASSETS=/system/app
    ANDROID_BOOTLOGO=1
    ANDROID_DATA=/data
    ANDROID_PROPERTY_WORKSPACE=9,32768
    ANDROID_ROOT=/system
    ASEC_MOUNTPOINT=/mnt/asec
    BOOTCLASSPATH=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar
    EXTERNAL_STORAGE=/mnt/sdcard
    IFS='
    '
    LD_LIBRARY_PATH=/system/lib
    OPTIND=1
    PATH=/sbin:/system/sbin:/system/bin:/system/xbin
    PS1='# '
    PS2='> '
    PS4='+ '
    PWD=/
    _=/system/xbin
    从系统变量我们也可以看到一些系统使用中的重要目录。

    > 进程分析
    # ps
    USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
    root      1     0     312    220   c009b74c 0000ca4c S /init
    root      2     0     0      0     c004e72c 00000000 S kthreadd
    root      3     2     0      0     c003fdc8 00000000 S ksoftirqd/0
    root      4     2     0      0     c004b2c4 00000000 S events/0
    ... ...
    root      27    1     740    196   c0158eb0 afd0d8ac S /system/bin/sh
    system    28    1     808    204   c01a94a4 afd0db4c S /system/bin/servicemanager
    root      29    1     3736   372   ffffffff afd0e1bc S /system/bin/vold
    root      30    1     3716   336   ffffffff afd0e1bc S /system/bin/netd
    ... ...
    system    59    33    183396 25580 ffffffff afd0db4c S system_server
    app_0     108   33    134184 14876 ffffffff afd0eb08 S com.android.inputmethod.pinyin
    radio     112   33    147300 15804 ffffffff afd0eb08 S com.android.phone
    app_25    122   33    149408 19932 ffffffff afd0eb08 S com.android.launcher
    system    124   33    136708 13172 ffffffff afd0eb08 S com.android.settings
    app_0     148   33    148892 18044 ffffffff afd0eb08 S android.process.acore
    ... ...
    从这里我们可以看出和 Linux 一样所有进程的入口都是 init,接下来的系统进程也和 Linux 类似,再接下来就是一些系统的守护程序(Native Service),最后是系统重要的应用程序。通过这个列表大家也可以看出 Android 启动过程的一些端倪。

    > 内核对比
    Android 内核和标准的 Linux 内核一样,主要实现内存管理、进程调度、进程间通信等功能。就最新的 Android 内核代码版本 cupcake(其中Linux内核版本为2.6.27)的内核源码树的根目录结构看,Android 内核源码与标准 Linux 内核并无不同,但是经过与标准 Linux 内核源代码进行详细对比,可以发现,Android内核与标准Linux内核在文件系统、进程间通信机制、内存管理等方面存在不同。
    1、文件系统:
    不同于桌面系统与服务器,移动设备大多采用的不是硬盘而是采用 Flash 作为存储介质。因此,Android 内核中增加了标准 Linux 专用于 Flash 的文件系统 YAFFS2。对 NAND/Flash 芯片有着良好的支持。YAFFS2 是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外断电对文件系统一致性和完整性的影响。YAFFS2按层次结构设计,分为文件管理接口、内部实现层和NAND,简化了其本身与系统的接 EI 设计,能更方便地集成到系统当中。经过测试证明,YAFFS2 性能比支持 NOR 型闪存的 JFFS2 文件系统更加优秀。
    2、进程间通信机制:
    Android 增加了一种进程间的通信机制 IPC Binder。Binder 通过守护进程 Service Manager 管理系统中的服务,负责进程问的数据交换。各进程通过 Binder 访问同一块共享内存,以达到数据通信的机制。从应用层的角度看,进程通过访问数据守护进程获取用于数据交换的程序框架接口,调用并通过接口共享数据,而其他进程要访问数据,也只需与程序框架接口进行交互,方便了程序员开发需要交互数据的应用程序。
    3、内存管理:
    在内存管理模块,Android 内核采用了一种不同于标准 Linux 内核的低内存管理策略。在标准Linux内核当中,使用一种叫做 OOM(Out of Memory) 的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分,获得最高分的进程将被关闭(内核进程除外),而 Android 系统采用的则是一种叫作 LMK(Low Memory Killer) 的机制,这种机制将进程按照重要性进行分级、分组,内存不足时,将处于最低级别组的进程关闭。例如,在移动设备当中,UI界面处于最高级别,所以该进程永远不会被中止。这样,在终端用户看来,系统是稳定运行的。同时,Android 新增加了一种内存共享的处理方式 Ashmem(Anonymous Shared Memory 匿名共享内存)。通过Ashmem,进程间可以匿名自由共享具名的内存块,这种共享方式在标准 Linux 当中也是不被支持的。
    4、电源管理:
    由于 Android 主要用于移动设备,电源管理就显得尤为重要。因此,在Android内核当中增加了一种新的电源管理策略。目前,Android 采用的是一种较为简单的电源管理策略,通过开关屏幕、开关屏幕背光、开关键盘背光、开关按钮背光和调整屏幕亮度来实现电源管理,并没有实现休眠和待机功能。目前有三种途径判断调整电源管理策略:RPC调用、电池状态改变和电源设置。它通过广播 Intent 或直接调用 API 的方式来与其他模块进行联系,电源管理策略同时还有自动关机机制,当电力低于最低可接受程度时,系统将自动关机。另外,Android 的电源管理模块还会根据用户行为,自动调整屏幕亮度。
    5、驱动及其他:
    相对于标准内核,Android 内核还添加了字符输出设备、图像显示设备、键盘输入设备、RTC 设备、USBDevice 设备等相关设备驱动,增加了日志(Logger)系统,使应用程序可以访问日志消息,使开发人员获得更大的自由。

  • 相关阅读:
    Study Plan The TwentySecond Day
    Study Plan The Nineteenth Day
    Study Plan The TwentySeventh Day
    Study Plan The Twentieth Day
    Study Plan The TwentyFirst Day
    python实现进程的三种方式及其区别
    yum makecache
    JSONPath 表达式的使用
    oracle执行cmd的实现方法
    php daodb插入、更新与删除数据
  • 原文地址:https://www.cnblogs.com/hubing/p/4612870.html
Copyright © 2011-2022 走看看