android4.0.3关于init.c和init.rc
来源:互联网 发布:金蝶软件数据库职位 编辑:程序博客网 时间:2024/06/05 15:56
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/vpn 0770 system vpn 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.<device>.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.<platform>.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 vpn after binding the port. group vpn net_admin inet disabled oneshotservice mtpd /system/bin/mtpd class main socket mtpd stream 600 system system user vpn group vpn 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
0 0
- android4.0.3关于init.c和init.rc
- android init.c init.rc
- Android系统启动流程分析init.c和init.rc文件
- s5pv210 android4.0.4 init.rc说明
- init.c 解析 哪些rc
- init.rc
- init.rc
- init.rc
- Android修改init.rc和init.xx.rc文件
- Android修改init.rc和init.xx.rc文件
- 关于/etc/init.d和/etc/rc.local
- Android init 进程 init.rc init.*.rc
- Android init 进程 init.rc init.*.rc
- Android init 进程 init.rc init.*.rc
- android init进程 init.rc
- 第1个用户进程init和init.rc脚本
- android系統启動流程启動畫面學習之init和init.rc分析
- Android init.rc init.vendor.rc 介绍
- 最常用的15大Eclipse开发快捷键技巧
- 删数问题(贪心问题)
- 4.变量
- Codeforces 801C Voltage Keepsake 二分+精度
- 问题:absolute
- android4.0.3关于init.c和init.rc
- SDK:对话框,光标,字符串,位图,应用图标,语言
- HTML写诗
- 设计模式之中介者模式
- Leetcode 255. Verify Preorder Sequence in Binary Search Tree
- CSS——“凸排列表”
- 《精彩绝伦的CSS》——布局(一)用轮廓代替边框
- android设备的编译规则
- DAY_02 HTML小白学习笔记