背景
- 有些时候我们需要定制一些功能来debug,而/system/bin下没有我们想要的可执行程序,这个时候就需要我们自己来封装一个
- 此demo主要功能是循环读取proc/目录下某个文件,然后在控制台show出来
环境
- 编译环境(ubuntu),开发板源码(我自己的qcom,mtk都可)
步骤
1.在vendor/rockchip目录下创建工程目录loopread
2.目录结构如下:
|--loopread.mk
|--sepolicy/
|--file_contexts
|--loopread.te
|--src/
|--Android.mk
|--etc/
|--init.loopread.rc
|--loopread.c
3.下面逐步解读工程文件(mk,te,rc,file_contex文件不做介绍,这里专注与loopread.c,但每个文件内容全部列出,虽然有的只有一行代码,如下:)
3.1.loopread.mk
BOARD_SEPOLICY_DIRS += vendor/qcom/loopread/sepolicy
BOARD_SEPOLICY_UNION += loopread.te
PRODUCT_PACKAGES += loopread
PRODUCT_PACKAGES += init.loopread.rc
3.2.file_contexts
/(vendor|system/vendor)/bin/loopread u:object_r:loopread_exec:s0
3.3.loopread.te
type loopread_exec, exec_type, vendor_file_type, file_type;
3.4.Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=loopread.c
LOCAL_MODULE:=loopread
LOCAL_MODULE_TAGS:=optional
LOCAL_CFLAGS += -Wno-ignored-attributes\
-Wno-unused-parameter\
-Wno-sign-compare\
-Wno-pointer-sign\
-Wno-pointer-arith
LOCAL_MODULE_OWNER:=qcom
include $(BUILD_EXECUTABLE)
3.5.loopread.c 此main函数接收两个参数,一个是文件路径,一个是delay时间,单位us
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char * argv[])
{
FILE *f;
int32_t *buf;
int flag = 1;
int i = 0, j = 0;
int rx = 48;
int tx = 32;
buf = (int32_t*)malloc(rx * tx * sizeof(int32_t));
if (buf == NULL) {
printf("malloc buf failed\n");
return 0;
}
//循环读取
do {
//argv[1]:接收的第一个参数;
f = fopen(argv[1], "rb");
if (NULL == f) {
printf("open %s failed!\n", argv[1]);
return 0;
}
//这里有length限制,最大好像是4096,请注意不要超过,如果超过会运行报错
fread(buf, sizeof(int32_t), rx * tx, f);
fclose(f);
for (i = 0; i < 48; i++) {
for (j = 0; j < 32; j++) {
printf("%5d", buf[i * 48 + j]);
}
printf("\n");
}
printf("\n");
//argv[2]:接收的第一个参数
usleep(atoi(argv[2]));
} while (flag);
return 0;
}
3.6.init.loopread.rc
# for touch
service loopread/vendor/bin/loopread
class main
seclabel u:r:dm:s0
group system diag oem_2901 usb root shell bluetooth wifi sdcard_rw sdcard_r media
4.编译命令:make loopread
编译过程中有看到把loopread里面的Android.mk link进来
including ./vendor/rockchip/loopread/src/Android.mk ...
编译完成后log:
target Executable: loopread(out/target/product/rk3288_box/obj/EXECUTABLES/loopread_intermediates/LINKED/loopread)
target Symbolic: loopread(out/target/product/rk3288_box/symbols/system/bin/loopread)
5.进入到out/target/product/rk3288_box/symbols/system/bin/目录可以看到有loopread生成
6.运行
a).将此push到设备中的/data/目录下
b).修改权限:chmod 777 /data/loopread
c).运行命令:./data/loopread/proc/meminfo 1000000,此条命令会每隔1s读取一次meminfo文件
以上记录之