1.init.c是android启动的第一个进程,init.rc是init.c启动的时候加载的服务配置,init.rc最关键的地方是挂载系统分区,启动zygote虚拟机。

2.init.c的源码如下:

源码路径:system/core/init/init.c

int main(int argc, char **argv){    int fd_count = 0;    struct pollfd ufds[4];    char *tmpdev;    char* debuggable;    char tmp[32];    int property_set_fd_init = 0;    int signal_fd_init = 0;    int keychord_fd_init = 0;    if (!strcmp(basename(argv[0]), "ueventd"))        return ueventd_main(argc, argv);    /* clear the umask */    umask(0);        /* 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.         */    mkdir("/dev", 0755);    mkdir("/proc", 0755);    mkdir("/sys", 0755);    mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");    mkdir("/dev/pts", 0755);    mkdir("/dev/socket", 0755);    mount("devpts", "/dev/pts", "devpts", 0, NULL);    mount("proc", "/proc", "proc", 0, NULL);    mount("sysfs", "/sys", "sysfs", 0, NULL);        /* indicate that booting is in progress to background fw loaders, etc */    close(open("/dev/.booting", O_WRONLY | O_CREAT, 0000));        /* We must have some place other than / to create the         * device nodes for kmsg and null, otherwise we won't         * be able to remount / read-only later on.         * Now that tmpfs is mounted on /dev, we can actually         * talk to the outside world.         */    open_devnull_stdio();    klog_init();    INFO("reading config file\n");    init_parse_config_file("/init.rc");    /* pull the kernel commandline and ramdisk properties file in */    import_kernel_cmdline(0, import_kernel_nv);    /* don't expose the raw commandline to nonpriv processes */    chmod("/proc/cmdline", 0440);    get_hardware_name(hardware, &revision);    snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);    init_parse_config_file(tmp);    action_for_each_trigger("early-init", action_add_queue_tail);    queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");    queue_builtin_action(property_init_action, "property_init");    queue_builtin_action(keychord_init_action, "keychord_init");    queue_builtin_action(console_init_action, "console_init");    queue_builtin_action(set_init_properties_action, "set_init_properties");    /* execute all the boot actions to get us started */    action_for_each_trigger("init", action_add_queue_tail);    /* skip mounting filesystems in charger mode */    if (strcmp(bootmode, "charger") != 0) {        action_for_each_trigger("early-fs", action_add_queue_tail);        action_for_each_trigger("fs", action_add_queue_tail);        action_for_each_trigger("post-fs", action_add_queue_tail);        action_for_each_trigger("post-fs-data", action_add_queue_tail);    }    queue_builtin_action(property_service_init_action, "property_service_init");    queue_builtin_action(signal_init_action, "signal_init");    queue_builtin_action(check_startup_action, "check_startup");    if (!strcmp(bootmode, "charger")) {        action_for_each_trigger("charger", action_add_queue_tail);    } else {        action_for_each_trigger("early-boot", action_add_queue_tail);        action_for_each_trigger("boot", action_add_queue_tail);    }        /* run all property triggers based on current state of the properties */    queue_builtin_action(queue_property_triggers_action, "queue_propety_triggers");#if BOOTCHART    queue_builtin_action(bootchart_init_action, "bootchart_init");#endif    for(;;) {        int nr, i, timeout = -1;        execute_one_command();        restart_processes();        if (!property_set_fd_init && get_property_set_fd() > 0) {            ufds[fd_count].fd = get_property_set_fd();            ufds[fd_count].events = POLLIN;            ufds[fd_count].revents = 0;            fd_count++;            property_set_fd_init = 1;        }        if (!signal_fd_init && get_signal_fd() > 0) {            ufds[fd_count].fd = get_signal_fd();            ufds[fd_count].events = POLLIN;            ufds[fd_count].revents = 0;            fd_count++;            signal_fd_init = 1;        }        if (!keychord_fd_init && get_keychord_fd() > 0) {            ufds[fd_count].fd = get_keychord_fd();            ufds[fd_count].events = POLLIN;            ufds[fd_count].revents = 0;            fd_count++;            keychord_fd_init = 1;        }        if (process_needs_restart) {            timeout = (process_needs_restart - gettime()) * 1000;            if (timeout < 0)                timeout = 0;        }        if (!action_queue_empty() || cur_action)            timeout = 0;#if BOOTCHART        if (bootchart_count > 0) {            if (timeout < 0 || timeout > BOOTCHART_POLLING_MS)                timeout = BOOTCHART_POLLING_MS;            if (bootchart_step() < 0 || --bootchart_count == 0) {                bootchart_finish();                bootchart_count = 0;            }        }#endif        nr = poll(ufds, fd_count, timeout);        if (nr <= 0)            continue;        for (i = 0; i < fd_count; i++) {            if (ufds[i].revents == POLLIN) {                if (ufds[i].fd == get_property_set_fd())                    handle_property_set_fd();                else if (ufds[i].fd == get_keychord_fd())                    handle_keychord();                else if (ufds[i].fd == get_signal_fd())                    handle_signal();            }        }    }    return 0;}

3.init.rc的源码如下

源码路径:core/rootdir/init.rc

on early-init    # Set init and its forked children's oom_adj.    write /proc/1/oom_adj -16    start ueventd# create mountpoints    mkdir /mnt 0775 root systemon initsysclktz 0loglevel 3# setup the global environment    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin    export LD_LIBRARY_PATH /vendor/lib:/system/lib    export ANDROID_BOOTLOGO 1    export ANDROID_ROOT /system    export ANDROID_ASSETS /system/app    export ANDROID_DATA /data    export ASEC_MOUNTPOINT /mnt/asec    export LOOP_MOUNTPOINT /mnt/obb    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/filterfw.jar# Backward compatibility    symlink /system/etc /etc    symlink /sys/kernel/debug /d# Right now vendor lives on the same filesystem as system,# but someday that may change.    symlink /system/vendor /vendor# Create cgroup mount point for cpu accounting    mkdir /acct    mount cgroup none /acct cpuacct    mkdir /acct/uid    mkdir /system    mkdir /data 0771 system system    mkdir /cache 0770 system cache    mkdir /config 0500 root root    # Directory for putting things only root should see.    mkdir /mnt/secure 0700 root root    # Directory for staging bindmounts    mkdir /mnt/secure/staging 0700 root root    # Directory-target for where the secure container    # imagefile directory will be bind-mounted    mkdir /mnt/secure/asec  0700 root root    # Secure container public mount points.    mkdir /mnt/asec  0700 root system    mount tmpfs tmpfs /mnt/asec mode=0755,gid=1000    # Filesystem image public mount points.    mkdir /mnt/obb 0700 root system    mount tmpfs tmpfs /mnt/obb mode=0755,gid=1000    write /proc/sys/kernel/panic_on_oops 1    write /proc/sys/kernel/hung_task_timeout_secs 0    write /proc/cpu/alignment 4    write /proc/sys/kernel/sched_latency_ns 10000000    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000    write /proc/sys/kernel/sched_compat_yield 1    write /proc/sys/kernel/sched_child_runs_first 0    write /proc/sys/kernel/randomize_va_space 2# Create cgroup mount points for process groups    mkdir /dev/cpuctl    mount cgroup none /dev/cpuctl cpu    chown system system /dev/cpuctl    chown system system /dev/cpuctl/tasks    chmod 0777 /dev/cpuctl/tasks    write /dev/cpuctl/cpu.shares 1024    mkdir /dev/cpuctl/fg_boost    chown system system /dev/cpuctl/fg_boost/tasks    chmod 0777 /dev/cpuctl/fg_boost/tasks    write /dev/cpuctl/fg_boost/cpu.shares 1024    mkdir /dev/cpuctl/bg_non_interactive    chown system system /dev/cpuctl/bg_non_interactive/tasks    chmod 0777 /dev/cpuctl/bg_non_interactive/tasks    # 5.0 %    write /dev/cpuctl/bg_non_interactive/cpu.shares 52# Allow everybody to read the xt_qtaguid resource tracking misc dev.# This is needed by any process that uses socket tagging.    chmod 0644 /dev/xt_qtaguidon fs# mount mtd partitions    # Mount /system rw first to give the filesystem a chance to save a checkpoint    mount yaffs2 mtd@system /system    mount yaffs2 mtd@system /system rw remount    mount yaffs2 mtd@userdata /data nosuid nodev    mount yaffs2 mtd@cache /cache nosuid nodevon post-fs    # once everything is setup, no need to modify /    mount rootfs rootfs / rw remount    # We chown/chmod /cache again so because mount is run as root + defaults    chown system cache /cache    chmod 0770 /cache    # This may have been created by the recovery system with odd permissions    chown system cache /cache/recovery    chmod 0770 /cache/recovery    #change permissions on vmallocinfo so we can grab it from bugreports    chown root log /proc/vmallocinfo    chmod 0440 /proc/vmallocinfo    #change permissions on kmsg & sysrq-trigger so bugreports can grab kthread stacks    chown root system /proc/kmsg    chmod 0440 /proc/kmsg    chown root system /proc/sysrq-trigger    chmod 0220 /proc/sysrq-trigger    # create the lost+found directories, so as to enforce our permissions    mkdir /cache/lost+found 0770 root rooton post-fs-data    # We chown/chmod /data again so because mount is run as root + defaults    chown system system /data    chmod 0771 /data    # Create dump dir and collect dumps.    # Do this before we mount cache so eventually we can use cache for    # storing dumps on platforms which do not have a dedicated dump partition.    mkdir /data/dontpanic 0750 root log    # Collect apanic data, free resources and re-arm trigger    copy /proc/apanic_console /data/dontpanic/apanic_console    chown root log /data/dontpanic/apanic_console    chmod 0640 /data/dontpanic/apanic_console    copy /proc/apanic_threads /data/dontpanic/apanic_threads    chown root log /data/dontpanic/apanic_threads    chmod 0640 /data/dontpanic/apanic_threads    write /proc/apanic_console 1    # create basic filesystem structure    mkdir /data/misc 01771 system misc    ###cym mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth    ###cym mkdir /data/misc/bluetooth 0770 system system    mkdir /data/misc/keystore 0700 keystore keystore    mkdir /data/misc/keychain 0771 system system    mkdir /data/misc/ 0770 system     mkdir /data/misc/systemkeys 0700 system system    # give system access to wpa_supplicant.conf for backup and restore    ###cym mkdir /data/misc/wifi 0770 wifi wifi    # chmod 0660 /data/misc/wifi/wpa_supplicant.conf    ###cym chmod 0660 /system/etc/wifi/wpa_supplicant.conf    ###cym chown wifi wifi /system/etc/wifi/wpa_supplicant.conf    ###cym mkdir /data/misc/dhcp 0775 dhcp dhcp    ###cym mkdir /data/misc/wifi/sockets 0777 wifi wifi    #mkdir /data/system 0775 wifi wifi    ###cym mkdir /data/system 0775 system system     ###cym mkdir /data/system/wpa_supplicant 0777 wifi wifi     mkdir /data/misc/wifi/hostapd 0777 wifi wifi    chown bluetooth bluetooth /dev/ttySAC0    chmod 0660 /dev/ttySAC0    mkdir /data/local 0771 shell shell    mkdir /data/local/tmp 0771 shell shell    mkdir /data/data 0771 system system    mkdir /data/app-private 0771 system system    mkdir /data/app 0771 system system    mkdir /data/property 0700 root root    # create dalvik-cache, so as to enforce our permissions    mkdir /data/dalvik-cache 0771 system system    # create resource-cache and double-check the perms    mkdir /data/resource-cache 0771 system system    chown system system /data/resource-cache    chmod 0771 /data/resource-cache    # create the lost+found directories, so as to enforce our permissions    mkdir /data/lost+found 0770 root root    # create directory for DRM plug-ins    mkdir /data/drm 0774 drm drm    # If there is no fs-post-data action in the init..rc file, you    # must uncomment this line, otherwise encrypted filesystems    # won't work.    # Set indication (checked by vold) that we have finished this action    #setprop vold.post_fs_data_done 1    chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file    chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file    chown system system /sys/class/android_usb/android0/f_rndis/ethaddr    chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddron boot# basic network init    ifup lo    hostname localhost    domainname localdomain# set RLIMIT_NICE to allow priorities from 19 to -20    setrlimit 13 40 40# Memory management.  Basic kernel parameters, and allow the high# level system server to be able to adjust the kernel OOM driver# paramters to match how it is managing things.    write /proc/sys/vm/overcommit_memory 1    write /proc/sys/vm/min_free_order_shift 4    chown root system /sys/module/lowmemorykiller/parameters/adj    chmod 0664 /sys/module/lowmemorykiller/parameters/adj    chown root system /sys/module/lowmemorykiller/parameters/minfree    chmod 0664 /sys/module/lowmemorykiller/parameters/minfree    # Tweak background writeout    write /proc/sys/vm/dirty_expire_centisecs 200    write /proc/sys/vm/dirty_background_ratio  5    # Permissions for System Server and daemons.    chown radio system /sys/android_power/state    chown radio system /sys/android_power/request_state    chown radio system /sys/android_power/acquire_full_wake_lock    chown radio system /sys/android_power/acquire_partial_wake_lock    chown radio system /sys/android_power/release_wake_lock    chown radio system /sys/power/state    chown radio system /sys/power/wake_lock    chown radio system /sys/power/wake_unlock    chmod 0660 /sys/power/state    chmod 0660 /sys/power/wake_lock    chmod 0660 /sys/power/wake_unlock        #chy add for reset modem    chown root  radio /sys/devices/platform/smm_modem/control    chmod 0666 /sys/devices/platform/smm_modem/control    chmod 0777 /dev/modemctl    chown system system /sys/class/timed_output/vibrator/enable    chown system system /sys/class/leds/keyboard-backlight/brightness    chown system system /sys/class/leds/lcd-backlight/brightness    chown system system /sys/class/leds/button-backlight/brightness    chown system system /sys/class/leds/jogball-backlight/brightness    chown system system /sys/class/leds/red/brightness    chown system system /sys/class/leds/green/brightness    chown system system /sys/class/leds/blue/brightness    chown system system /sys/class/leds/red/device/grpfreq    chown system system /sys/class/leds/red/device/grppwm    chown system system /sys/class/leds/red/device/blink    chown system system /sys/class/leds/red/brightness    chown system system /sys/class/leds/green/brightness    chown system system /sys/class/leds/blue/brightness    chown system system /sys/class/leds/red/device/grpfreq    chown system system /sys/class/leds/red/device/grppwm    chown system system /sys/class/leds/red/device/blink    chown system system /sys/class/timed_output/vibrator/enable    chown system system /sys/module/sco/parameters/disable_esco    chown system system /sys/kernel/ipv4/tcp_wmem_min    chown system system /sys/kernel/ipv4/tcp_wmem_def    chown system system /sys/kernel/ipv4/tcp_wmem_max    chown system system /sys/kernel/ipv4/tcp_rmem_min    chown system system /sys/kernel/ipv4/tcp_rmem_def    chown system system /sys/kernel/ipv4/tcp_rmem_max    chown root radio /proc/cmdline# Define TCP buffer sizes for various networks#   ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax,    setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208    setprop net.tcp.buffersize.wifi    524288,1048576,2097152,262144,524288,1048576    setprop net.tcp.buffersize.lte     524288,1048576,2097152,262144,524288,1048576    setprop net.tcp.buffersize.umts    4094,87380,110208,4096,16384,110208    setprop net.tcp.buffersize.hspa    4094,87380,262144,4096,16384,262144    setprop net.tcp.buffersize.edge    4093,26280,35040,4096,16384,35040    setprop net.tcp.buffersize.gprs    4092,8760,11680,4096,8760,11680setprop ro.nfc.port "I2C"chmod 0666 /dev/snfc-n2# Set this property so surfaceflinger is not started by system_init    setprop system_init.startsurfaceflinger 0    class_start core    class_start mainon nonencrypted    class_start late_starton charger    class_start chargeron property:vold.decrypt=trigger_reset_main    class_reset mainon property:vold.decrypt=trigger_load_persist_props    load_persist_propson property:vold.decrypt=trigger_post_fs_data    trigger post-fs-dataon property:vold.decrypt=trigger_restart_min_framework    class_start mainon property:vold.decrypt=trigger_restart_framework    class_start main    class_start late_starton property:vold.decrypt=trigger_shutdown_framework    class_reset late_start    class_reset main# Used to disable USB when switching stateson property:sys.usb.config=none    stop adbd    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/bDeviceClass 0    setprop sys.usb.state $sys.usb.config# adb only USB configuration# This should only be used during device bringup# and as a fallback if the USB manager fails to set a standard configurationon property:sys.usb.config=adb    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 18d1    write /sys/class/android_usb/android0/idProduct D002    write /sys/class/android_usb/android0/functions $sys.usb.config    write /sys/class/android_usb/android0/enable 1    start adbd    setprop sys.usb.state $sys.usb.config# USB accessory configurationon property:sys.usb.config=accessory    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 18d1    write /sys/class/android_usb/android0/idProduct 2d00    write /sys/class/android_usb/android0/functions $sys.usb.config    write /sys/class/android_usb/android0/enable 1    setprop sys.usb.state $sys.usb.config# USB accessory configuration, with adbon property:sys.usb.config=accessory,adb    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 18d1    write /sys/class/android_usb/android0/idProduct 2d01    write /sys/class/android_usb/android0/functions $sys.usb.config    write /sys/class/android_usb/android0/enable 1    start adbd    setprop sys.usb.state $sys.usb.config# Used to set USB configuration at boot and to switch the configuration# when changing the default configurationon property:persist.sys.usb.config=*    setprop sys.usb.config $persist.sys.usb.config## Daemon processes to be run by init.##service ueventd /sbin/ueventd    class core    criticalservice console /system/bin/sh    class core    console    disabled #   user shell    group logon property:ro.debuggable=1    start console# adbd is controlled via property triggers in init..usb.rcservice adbd /sbin/adbd    class core    disabled# adbd on at boot in emulatoron property:ro.kernel.qemu=1    start adbd# This property trigger has added to imitiate the previous behavior of "adb root".# The adb gadget driver used to reset the USB bus when the adbd daemon exited,# and the host side adb relied on this behavior to force it to reconnect with the# new adbd instance after init relaunches it. So now we force the USB bus to reset# here when adbd sets the service.adb.root property to 1.  We also restart adbd here# rather than waiting for init to notice its death and restarting it so the timing# of USB resetting and adb restarting more closely matches the previous behavior.on property:service.adb.root=1    write /sys/class/android_usb/android0/enable 0    restart adbd    write /sys/class/android_usb/android0/enable 1service servicemanager /system/bin/servicemanager    class core    user system    group system    critical    onrestart restart zygote    onrestart restart media    onrestart restart surfaceflinger    onrestart restart drmservice vold /system/bin/vold    class core    socket vold stream 0660 root mount    ioprio be 2service netd /system/bin/netd    class main    socket netd stream 0660 root system    socket dnsproxyd stream 0660 root inetservice debuggerd /system/bin/debuggerd    class main#service ril-daemon /system/bin/rild#    class main##    socket rild stream 660 root radio## chy modify @20120312#    socket rild stream 666 root radio#    socket rild-debug stream 660 radio system#    user root#    group radio cache inet misc audio sdcard_rw log#add by cym for UNAPLUSservice ril-daemon /system/bin/rild -l /system/lib/usiuna-ril.so -- -d /dev/ttyUSB1     class main     socket rild stream 660 root radio     socket rild-debug stream 660 radio system     user root     group radio cache inet misc audio sdcard_rw logservice pppd_gprs /system/bin/logwrapper /etc/ppp/call-pppd     class main     user root     group radio cache inet misc     disabled     oneshotservice dhcpd_start /system/bin/logwrapper /etc/ppp/dhcpd_start     class main     user root     group radio dhcp     disabled     oneshotservice dhcp_stop /system/bin/logwrapper /etc/ppp/dhcpd_stop     class main     user root     group radio dhcp     disabled     oneshot#on property:ril.unap_state=*#     write /sys/bus/usb/devices/1-2.1/power/control $ril.unap_state#on property:ril.unap_state=*#     write /sys/bus/usb/devices/1-2.1/power/control ${ril.unap_state}#end addservice surfaceflinger /system/bin/surfaceflinger    class main    user system    group graphics    onrestart restart zygoteservice zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server    class main    socket zygote stream 666    onrestart write /sys/android_power/request_state wake    onrestart write /sys/power/state on    onrestart restart media    onrestart restart netdservice drm /system/bin/drmserver    class main    user drm    group system inet drmrpcservice media /system/bin/mediaserver    class main    user media    group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc    ioprio rt 4service bootanim /system/bin/bootanimation    class main    user graphics    group graphics    disabled    oneshotservice dbus /system/bin/dbus-daemon --system --nofork    class main    socket dbus stream 660 bluetooth bluetooth    user bluetooth    group bluetooth net_bt_adminservice bluetoothd /system/bin/bluetoothd -n    class main    socket bluetooth stream 660 bluetooth bluetooth    socket dbus_bluetooth stream 660 bluetooth bluetooth    # init.rc does not yet support applying capabilities, so run as root and    # let bluetoothd drop uid to bluetooth with the right linux capabilities    group bluetooth net_bt_admin misc    disabledservice hfag /system/bin/sdptool add --channel=10 HFAG    class main    user bluetooth    group bluetooth net_bt_admin    disabled    oneshotservice hsag /system/bin/sdptool add --channel=11 HSAG    class main    user bluetooth    group bluetooth net_bt_admin    disabled    oneshotservice opush /system/bin/sdptool add --channel=12 OPUSH    class main    user bluetooth    group bluetooth net_bt_admin    disabled    oneshotservice pbap /system/bin/sdptool add --channel=19 PBAP    class main    user bluetooth    group bluetooth net_bt_admin    disabled    oneshotservice installd /system/bin/installd    class main    socket installd stream 600 system systemservice flash_recovery /system/etc/install-recovery.sh    class main    oneshotservice abtfilt /system/bin/wlan_tool abtfiltclass main    user bluetooth    group system bluetooth net_bt_admin inet    disabled    oneshotservice racoon /system/bin/racoon    class main    socket racoon stream 600 system system    # IKE uses UDP port 500. Racoon will setuid to  after binding the port.    group  net_admin inet    disabled    oneshotservice mtpd /system/bin/mtpd    class main    socket mtpd stream 600 system system    user     group  net_admin inet net_raw    disabled    oneshotservice keystore /system/bin/keystore /data/misc/keystore    class main    user keystore    group keystore    socket keystore stream 666service dumpstate /system/bin/dumpstate -s    class main    socket dumpstate stream 0660 shell log    disabled    oneshot#remove by cym 20130408#service bccmd /system/bin/bccmd -t bcsp -b 115200 -d /dev/ttySAC0 psload -r /system/bluetooth/A31_Script_20110215.psr#    class main#disabled#oneshot#service hciattach /system/bin/hciattach -s 921600 /dev/ttySAC0 bcsp 921600 flow#    class main#    disabled#    oneshot     ###cym service dhcpcd_bnep0 /system/bin/dhcpcd -ABKL#class main#disabled#oneshot#service iprenew_p2p /system/bin/dhcpcd -n#class main#disabled#oneshot#service iprenew_bnep0 /system/bin/dhcpcd -n#class main#disabled#oneshot 


更多相关文章

  1. Android(安卓)4.4 KitKat NotificationManagerService使用详解与
  2. Android之INSTALL_FAILED_INSUFFICIENT_STORAG解决办法
  3. Android源码解析之(三)Android异步任务AsyncTask
  4. eclipse中绑定android源码
  5. Android(安卓)定时重复启动弹出窗口。
  6. Android(安卓)Launcher源码研究(一) 基本结构
  7. android adb 无法启动
  8. 【Android(安卓)Developers Training】 15. 启动一个Activity
  9. ejoy2d源代码阅读之一(启动流程)

随机推荐

  1. Android(安卓)ListView实现任意layout
  2. AndroidFragment切换
  3. Android中JNI开发(二)Android.mk写法
  4. Unable to execute dex: java.nio.Buffer
  5. Android(安卓)文件选择器,单选,多选
  6. 转:Android(安卓)获取Root权限
  7. 简单布局收缩动画
  8. android 网络读取图片 带进度条
  9. Android代码实现APK文件的安装与卸载
  10. Android(安卓)Socket网络通信