[Android] Emulator起動時のkernel cmdline parameterを変更する

# 結論

Android SDK付属の`emulator`コマンドに対し、
`-qemu`オプションに続けて`-append`オプションを指定することで
Linux kernel cmdline parameterを変更することができる。

```shell-session
$ ~/Android/Sdk/emulator/emulator -avd Nexus_6_API_27 -qemu -append "trace_buf_size=64M trace_event=sched_wakeup,sched_switch,sched_blocked_reason,sched_cpu_hotplug"
```

```shell-session
$ adb shell cat /proc/cmdline
qemu=1 no_timer_check androidboot.hardware=ranchu androidboot.serialno=EMULATOR29X1X12X0 clocksource=pit no-kvmclock android.qemud=1 console=0 android.checkjni=1 qemu.gles=1 qemu.settings.system.screen_off_timeout=2147483647 qemu.encrypt=1 qemu.opengles.version=131072 cma=314M@0-4G qemu.wifi=1 mac80211_hwsim.channels=2 androidboot.android_dt_dir=/sys/bus/platform/devices/ANDR0001:00/properties/android/ loop.max_part=7 ramoops.mem_address=0xff018000 ramoops.mem_size=0x10000 memmap=0x10000$0xff018000 qemu.dalvik.vm.heapsize=384m trace_buf_size=64M trace_event=sched_wakeup,sched_switch,sched_blocked_reason,sched_cpu_hotplug mac80211_hwsim.mac_prefix=5554
```

すでに該当のavdが起動状態のスナップショットを保持している場合、
cmdline parameterの変更を反映するために`adb reboot`する。

ちなみに、`-qemu`以降の引数はすべてQEMUに渡される。
そのため`emulator`コマンドへの引数は`-qemu`より前にすべて指定しなければならない。
`-qemu`を介してQEMUに渡すことができるオプションは`-qemu -h`で確認可能。

なおAndroid Studio 3.5で確認したところ、
AVD Manager(GUI)からEmulatorを起動する場合はkernel cmdline parameterの指定はできないっぽい。

# おまけ

Androidで使われているLinux Kernelではftraceがデフォルト有効になっていることが多い。
実際上記の引数で`emulator`を起動したら、以下のように起動直後からのscheduling eventが取れる。


```
$ adb shell cat /d/tracing/trace
# tracer: nop
#
# entries-in-buffer/entries-written: 12161/12161   #P:2
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
          <idle>-0     [000] d..3     0.012470: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=swapper/0 next_pid=2 next_prio=120
        kthreadd-2     [000] d..3     0.012476: sched_switch: prev_comm=kthreadd prev_pid=2 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=1 next_prio=120
            init-1     [000] dN.3     0.133493: sched_wakeup: comm=kthreadd pid=2 prio=120 success=1 target_cpu=000
            init-1     [000] d..3     0.133497: sched_switch: prev_comm=swapper/0 prev_pid=1 prev_prio=120 prev_state=R+ ==> next_comm=kthreadd next_pid=2 next_prio=120
        kthreadd-2     [000] d..3     0.133511: sched_switch: prev_comm=kthreadd prev_pid=2 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=1 next_prio=120
            init-1     [000] d..3     0.133512: sched_switch: prev_comm=swapper/0 prev_pid=1 prev_prio=120 prev_state=D|K ==> next_comm=kthreadd next_pid=3 next_prio=120
           <...>-3     [000] d..4     0.133513: sched_blocked_reason: pid=1 iowait=0 caller=kthread_create_on_node+0xd0/0x17c
           <...>-3     [000] dN.4     0.133514: sched_wakeup: comm=swapper/0 pid=1 prio=120 success=1 target_cpu=000
           <...>-3     [000] d..3     0.133514: sched_switch: prev_comm=kthreadd prev_pid=3 prev_prio=120 prev_state=R+ ==> next_comm=swapper/0 next_pid=1 next_prio=120
            init-1     [000] d..3     0.133516: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
            init-1     [000] d..3     0.133517: sched_switch: prev_comm=swapper/0 prev_pid=1 prev_prio=120 prev_state=D ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
           <...>-3     [000] d..4     0.133518: sched_blocked_reason: pid=1 iowait=0 caller=kthread_park+0x49/0x4f
           <...>-3     [000] dN.4     0.133518: sched_wakeup: comm=swapper/0 pid=1 prio=120 success=1 target_cpu=000
           <...>-3     [000] d..3     0.133518: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=R+ ==> next_comm=swapper/0 next_pid=1 next_prio=120
            init-1     [000] d..3     0.133521: sched_switch: prev_comm=swapper/0 prev_pid=1 prev_prio=120 prev_state=D ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
           <...>-3     [000] d..3     0.133522: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=P ==> next_comm=swapper/0 next_pid=0 next_prio=120
```

# 参考
[Start the emulator from the command line - Android Developers](https://developer.android.com/studio/run/emulator-commandline.html)
[Android Emulator source code](https://android.googlesource.com/platform/external/qemu/+/1a15692cded92d66dea1a51389a3c4b9e3b3631a/android/emulator/main-emulator.cpp)
[Optimizing Boot Times - AOSP](https://source.android.com/devices/tech/perf/boot-times#systrace)