META实现执行Shell命令功能
- 背景描述
TPStester工具datacheck脚本需要获取手机内存等信息,通过发送shell命令获得。
- 原理实现
TPStester工具发送FT_CUSTOMER_CMD_SHELL命令和参数,软件识别该命令并解析参数。参数即为要执行的shell命令。调用popen(参数),最后将结果返回给工具端。
- 软件端实现
3.1 tran_projects\projectname\device\transsion\projectname\ProjectConfig_BSP.mk打开宏控
TRAN_FT_CUSTOM_SHELL = yes
3.2 vendor/mediatek/proprietary/hardware/meta/common/Android.mk增加宏控
ifeq ($(strip $(TRAN_FT_CUSTOM_SHELL)), yes)
LOCAL_CFLAGS += -DTRAN_FT_CUSTOM_SHELL
endif
3.3 修改vendor/mediatek/proprietary/hardware/meta/common/FtModule.cpp
添加头文件
#if defined(TRAN_FT_CUSTOM_SHELL)
#include <sys/wait.h>
#endif
在FtCustomerCmd结构体中
typedef enum FT_CUSTOMER_CMD {
//………………………//省略
#if defined(TRAN_FT_CUSTOM_SHELL)
FT_CUSTOMER_CMD_SHELL = 3,
#endif
FT_CUSTOMER_CMD_MAX,
} FtCustomerCmd;
void FtModCustomer::exec(Frame *pFrm)
//………………………//省略
switch(req->cmd.m_u1Dummy)
{
#if defined(TRAN_FT_CUSTOM_SHELL)
case FT_CUSTOMER_CMD_SHELL:
{
char out_buf[1025] = {0};
ft_cnf.result.m_u1Dummy = FT_CUSTOMER_SUCCESS;
if (peer_buff_size <= 0) {
ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;
META_LOG(“Shell command is null string”);
break;
}
META_LOG(“input shell command is:%s”, peer_buf);
FILE *file = popen(peer_buf, “r”);
if (NULL == file) {
META_LOG(“popen failed:0x%x, in %s file at %d line \n”, file, FILE, LINE);
ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;
break;
}
int size = fread(out_buf, sizeof(char), sizeof(out_buf) - 1, file);
if (ferror(file)) {
META_LOG(“fread failed:0x%x, in %s file at %d line \n”, file, FILE, LINE);
ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;
break;
}
out_buf[size] = ‘\0’;
int status = pclose(file);
if (WIFEXITED(status)) {
if (WEXITSTATUS(status) != 0) {
META_LOG(“WEXITSTATUS: %i”, WEXITSTATUS(status));
ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;
break;
}
} else if (WIFSIGNALED(status)) {
META_LOG(“WTERMSIG: %i”, WTERMSIG(status));
ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;
break;
}
META_LOG(“out size:0x%x, out buf:%s\n”, strlen(out_buf), out_buf);
ft_cnf.status = META_SUCCESS;
WriteDataToPC(&ft_cnf, sizeof(ft_cnf), out_buf, strlen(out_buf));
break;
}
#endif
default:
//………………………//省略
- 配置权限
修改device/mediatek/sepolicy/custom/module/ft_module/meta_tst.te 添加:
========================
this file is for FtModule custom command
#Purpose for meta executing shell command
allow meta_tst proc_meminfo:file r_file_perms;
allow meta_tst sysfs_batteryinfo:dir { search };
allow meta_tst sysfs_batteryinfo:file r_file_perms;
allow meta_tst proc:file { open read };
allow meta_tst sysfs_mmcblk:file r_file_perms;
allow meta_tst sysfs_mmcblk:dir { search };
device\mediatek\common\BoardConfig.mk
BOARD_SEPOLICY_DIRS += device/mediatek/sepolicy/custom/module/ft_module
- 提交链接
http://192.168.10.48/#/c/tran_projects/+/13592/
http://192.168.10.48/#/c/MTK_CODE/alps/vendor/mediatek/proprietary/hardware/meta/+/13593/
http://192.168.10.48/#/c/MTK_CODE/alps/device/mediatek/sepolicy/custom/+/12003/
- 测试方式
运行TPStester,选择测试脚本PSN或者datacheck;
点击start开始测试,手机关机状态下USB连接电脑;
脚本执行shell命令的测试项PASS,如PSN的Read_Ram、Read_Rom、或者Datacheck脚本中的Read_Battery、Read_Battery_Voltage等。