在android系统的源码有很多工具的源码。存放路径如下
android/system 底层文件系统库、应用及组件,linux自带的
android/external android 使用的一些开源的模组
android/frameworks/base/cmds 一些android重要命令:am、app_proce等
screenrecord:录屏
目标设备的system/bin和system/xbin有android添加的一些工具和linux自带的工具,这些工具可能是java、c、c++或shell指令写的。上面提到的几个工具都挺好玩的,具体使用方法可以输入参数--help查看帮助或者网上搜索。
欢迎来到我的网站wzjdy.cc
这里介绍如何自己用c或者c++编写一个工具并且在android编译的时候加入到系统当中
创建文件夹frameworks/base/cmds/dytest
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
test.c \
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
LOCAL_LDLIBS :=-llog
LOCAL_MODULE:= dytest
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
#include
#include
#include
#ifndef IO_BASIC_H_
#define IO_BASIC_H_
#define RD_UNIT_SIZE 1024
#define WR_UNIT_SIZE 1024
#define RDWR_UNIT_SIZE 1024
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
#define SI4754_CMDMAGIC 0X81
#define usrdatatype unsigned long
enum FM_CMD_TYPE{
FM_START = _IOWR(SI4754_CMDMAGIC, 1, unsigned long),
FM_STOP,
FM_SEEKUP,
FM_SEEKDOWN,
FM_SETFREQ,
FM_SETVOL,
FM_GETFREQ,
FM_GETVOL,
FM_TEST
};
/*
============================================================================
Name : IO_Operation.c
Author : DongYi
Version :
============================================================================
*/
//以O_RDWR | O_CREAT | O_TRUNC,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
int open_file(const char* filename);
//以O_RDWR | O_CREAT | O_TRUNC,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
int open_file_create(const char* filename) ;
//以O_RDONLY,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
#include
#include
#include
#include
#include
#include
#include
#include
#include "test.h"
unsigned long qndData;
const char* filename = "/dev/fmsi4754";
int open_file(const char* filename) {
return open_file_create(filename);
}
int open_file_create(const char* filename) {
int fd; //文件描述符
fd = open(filename, O_RDWR | O_CREAT | O_TRUNC,
S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH);
if (fd == -1) {
printf("\nopen_file:文件操作失败");
return -1;
}
printf("\nopen_file:文件操作成功");
return fd;
}
int main(void) {
int fp;
int ret;
char buf[1024]={0};
long len;
puts("~~~~~~~~~~test.c测试程序 Linux I/O操作~~~~~~~~~~~~\n\n"); /* prints Linux I/O操作 */
// for(len=64000;len>0;len--);
sleep(1);
fp = open_file_create(filename);
if (fp < 0) {
printf("open_file:faild!\n");
return -1;
}else{
printf("open_file:success!\n");
}
qndData=0x12345678;
do{
ret=ioctl(fp, FM_START, &qndData);
printf("ioctl_file:qndData:0x%x\n ",qndData);
if (ret < 0) {
printf("ioctl_file:faild!\n");
close(fp);
return -1;
}else{
printf("ioctl_file:success\n");
}
}while(qndData==0x12345678); //开机
return 1;
}
这个工具还可以使用arm-linux-androideabi-gcc工具编译
arm-linux-androideabi-gcc -o dytest --sysroot=/home/android/SambShare/dyT3-v1.0/android/prebuilts/ndk/current/platforms/android-18/arch-arm/ test.c
用这个方式编译的话就要把dytest工具push到android系统,然后修改权限。当然你也可以用android.mk文件拷贝dytest到system/bin目录下。
这个工具是在网上下载的,不方便公布代码,博客android新版本中如何解决厂商应用的su权限,实际使用socket实现在控制台输入指令。
获取seustub压缩包后解压seustub放置在external/文件夹
include external/seustub/seustub/Android.mk
include external/seustub/seustubtest/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
seustub.cpp \
util.cpp \
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
LOCAL_LDLIBS :=-llog
LOCAL_MODULE:= seustub
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
seustubtest.cpp \
../seustub/util.cpp \
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
LOCAL_LDLIBS :=-llog
LOCAL_MODULE:= seustubtest
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
service seustub /system/bin/seustub
class main
使用方法是seustubtest +指令+参数,例seustubtest chmod 777 /dev/si4754
公司的JAVA应用需要临时的root权限,还需要获取返回值判断指令的成功。因此删除seustubtest部分,为seustub添加了供上层调用的JNI接口,并且指令的返回结果输出到文件中。不做详细介绍。
。。。。。。