创建linux可执行程序

背景

  • 有些时候我们需要定制一些功能来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.运行

扫描二维码关注公众号,回复: 11367586 查看本文章

a).将此push到设备中的/data/目录下
b).修改权限:chmod 777 /data/loopread
c).运行命令:./data/loopread/proc/meminfo 1000000,此条命令会每隔1s读取一次meminfo文件

以上记录之

猜你喜欢

转载自blog.csdn.net/qq_26848623/article/details/106938563