背景介绍
在学习Android源码过程中,需要经常写入文件,来验证代码是否正确,但是,默认的Android模拟器是只读状态(只有少数几个文件夹是可以读写的),不能读写。
步骤
(1)使用 “emulator -writable-system” 命令设置可写
gs@aigo:~/nvme_1T/android9.0.0_35$ emulator -kernel kernel/goldfish/arch/x86_64/boot/bzImage -system system.img -writable-system
emulator: WARNING: Couldn't find crash service executable /home/gs/nvme_1T/android9.0.0_35/prebuilts/android-emulator/linux-x86_64/emulator64-crash-service
emulator: WARNING: system partition size adjusted to match image file (2560 MB > 800 MB)
emulator: WARNING: System image is writable
emulator: INFO: boot completed
(2)在pc终端上输入“ adb remount
”命令。让模拟器以读/写方式重新装载 system/
(默认情况下,它以只读方式装载)。
gs@aigo:~/nvme_1T/android9.0.0_35/out/host/linux-x86/bin$ ./adb remount
remount succeeded
gs@aigo:~/nvme_1T/android9.0.0_35/out/host/linux-x86/bin$
备注:如果不成功,请输入“adb root”再次尝试。
(3)输入“adb shell”进入模拟器的终端,此时就可以在system目录下创建新的文件夹。
generic_x86_64:/system # mkdir 01_test
generic_x86_64:/system #
generic_x86_64:/system # ls | grep 01
01_test
generic_x86_64:/system #
(4)编写demo,在模拟器上测试;
在Android源码的目录下,android9.0.0_35/external/hello,创建两个文件,分别是:Android.mk hello.c
// Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := hello
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
// hello.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char *prog = argv[0];
(void)argc;
printf("hello word! %c.\n", *prog);
return 0;
}
(4.1)在pc上编译“external/hello”目录下的 hello.c 文件,使用mmm命令。
gs@aigo:~/nvme_1T/android9.0.0_35$ mmm ./external/hello/
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=9
TARGET_PRODUCT=aosp_x86_64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=x86_64
TARGET_2ND_ARCH=x86
TARGET_2ND_ARCH_VARIANT=x86_64
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.4.0-72-generic-x86_64-Ubuntu-18.04.5-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=PQ2A.190405.003
OUT_DIR=out
============================================
ninja: no work to do.
ninja: no work to do.
No need to regenerate ninja file
No need to regenerate ninja file
[100% 6/6] Install: out/target/product/generic_x86_64/system/bin/hello
#### build completed successfully (4 seconds) ####
gs@aigo:~/nvme_1T/android9.0.0_35$
生成的 hello 文件在 “out/target/product/generic_x86_64/system/bin/” 目录下。
(5)将步骤(4)中的hello文件,拷贝到模拟器的 system/01_test 目录下,运行 hello,如下:
generic_x86_64:/system/01_test # ls
hello
generic_x86_64:/system/01_test #
generic_x86_64:/system/01_test # ./hello
hello word! ..
generic_x86_64:/system/01_test #
备注,如果执行命令,报权限的错误,请使用命令“ chmod 777 hello”修改权限。
到此,结束!
参考
其中:有几个非常好用的命令:
(1) -kernel filepath
使用特定的linux内核,当自己编译内核的时候,指定指定的内核,就使用这个命令,如:
emulator -kernel kernel/goldfish/arch/x86_64/boot/bzImage
(2) -show-kernel
在终端窗口中显示内核调试消息
emulator -kernel kernel/goldfish/arch/x86_64/boot/bzImage -show-kernel
(3) -verbose
将模拟器初始化消息输出到终端窗口。此命令,可以查看emulator的默认配置参数,例如默认使用的linux内核文件;
gs@aigo:~/nvme_1T/android9.0.0_35$ emulator -verbose | grep kernel
emulator: autoconfig: -kernel /home/gs/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/kernel-ranchu
kernel.path = /home/gs/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/kernel-ranchu
由上面的命令,可以知道使用的linux内核的路径。