配套系列教学视频链接:
Android 10.0 AOSP源码编译:
Android系统 10.0 AOSP源码编译--CSDN程序员研修院
Android 10.0 根文件系统和编译系统:
Android根文件系统和编译系统教学视频-百问100askhttps://www.100ask.net/video/Android
Android 10.0 根文件系统和编译系统-CSDN程序员研修院
说明
系统:AOSP Android10.0
设备:Android模拟器
前言
本文章重点讲解Android.mk如何控制编译c代码的可执行程序。
一, 可执行程序代码
在Anroid层目录新建mytest/exe_test/目录, 并创建文件名:mytest/exe_test/main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
void *my_test_thread (void *args)
{
printf("my_test_thread running...\n");
return NULL;
}
int main(void)
{
int fd = -1;
pthread_t tid;
printf("hello world!\n");
fd = open("/dev/input/event0", O_RDWR);
if(fd < 0)
{
printf("open error: %s", strerror(errno));
exit(1);
}
printf("fd = %d\n", fd);
pthread_create(&tid, NULL, my_test_thread, NULL);
pthread_join(tid, NULL);
return 0;
}
二, Android.mk编写
Android源码参考模板: system/extras/su/Android.mk
mytest/exe_test/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += \
-Wno-error \
-Wno-unused-parameter
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= hello_exe_test
include $(BUILD_EXECUTABLE)
此处添加了LOCAL_CFLAGS编译标志, 表示如果存在没有使用的参数,就不要报错。
三, 编译
source build/env_setup.sh
lunch aosp_x86_64-eng
mmm mytest/exe_test/
生成的目标文件有如下:
中间文件: out/target/product/产品名/obj/EXECUTABLES/hello_exe_test_intermediates/
目标文件:out/target/product/产品名/system/bin/hello_exe_test
此处产品名并没有特别说明是哪一个, 大家未来开发的时候, 产品可以选择不同, 这个产品名就根据自己实际的来定。
四,运行
启动emulator时需要加参数: -writable-system, 如:
emulator -no-snapshot -verbose -show-kernel -writable-system -cores 4
这样才能使用adb remount, 将system或者vendor重新挂载成可读写分区 , 执行如下命令实现运行:
cd out/target/product/产品名/
adb remount
adb push system/bin/hello_exe_test /system/bin/
adb shell
hello_exe_test
总结
对于程序运行,不一定是要放到虚机的/system/bin目录, 可以放在其他路径, 如/data/目录, 只要权限和分区读写属性允许即可。