Android启动过程中执行一个C语言的应用程序或者执行shell脚本
Android启动过程中执行一个C语言的应用程序或者执行shell脚本
一、Android启动过程中去对系统做一些设置,如修改某些文件夹的属性和文件的权限,可在init.rc中增加service执行shell脚本,从而可在shell脚本中完成大部分操作。或者也可以执行c语言应用程序。
二、实际测试
1、在init.xxxx.rc中增加执行脚本的service,把service设为class main,则在启动class类的serive自动启动init-setup的service。
1.1 开机执行脚本
service init-setup /system/bin/rootandwakelock.sh
class main
user root
group root
oneshot
seclabel u:r:init:s0
1.2 开机执行C可执行程序
service check_hdmiin_signal /system/bin/check_hdmiin_signal
class main
user root
group root
oneshot
seclabel u:r:init:s0
1.3 如果想在开机完成后执行shell脚本,可如下设置:
service init-setup /system/bin/rootandwakelock.sh
user root
group root
disabled
oneshot
seclabel u:r:init:s0
on property:sys.boot_completed=1
start init-setup
1.4 各参数解释:
Android 服务名称规则invalid service name 限制16字符以内
user root 和 group root 意思是使用 root 权限。
seclabel u:r:init:s0 这句的具体含义大概是设置init进程的安全上下文,不加这个会提示没有权限:service does not have a SELinux domain defined。
disabled是不自动执行,得另外start。
oneshot说明的是该操作只会执行一次,并不像其他带有 restart 指令的 service 一样当被 kill 调之后会重新调起。如果你希望被kill掉之后重新调起,那就不写.
我这里的测试代码如下图
2、在Android下编写和编译c程序生存两个可执行文件。
2.1 auto_run.c的代码
#include <stdio.h>
#include <android/log.h>#define LOG "ffmpegDemo-jni" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG,__VA_ARGS__) // 定义LOGF类型 int main(void)
{int i=0;//signal(SIGCHLD, SIG_IGN);//daemon(0, 0);//fork 强制后台运行!// for(i = 0; i < 10; i++)system("touch /data/new_file.txt"); while(1){sleep(1);printf("auto run demo! number=%d\n",i);LOGF("auto run demo! number=%d\n",i);i+=8;// LOGI("Calls=%d,Valid=%d",10,11);}return 0;
}
2.2 Android.mk的代码
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE := auto_runLOCAL_SRC_FILES := $(call all-subdir-c-files)
LOCAL_SHARED_LIBRARIES := \liblog \libcutilsinclude $(BUILD_EXECUTABLE)
2.3 rootandwakelock.sh脚本如下,里面是执行另外一个c可执行程序auto_run_script。
2.4 auto_run_script.c代码如下
#include <stdio.h>
#include <android/log.h>#define LOG "ffmpegDemo-jni" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG,__VA_ARGS__) // 定义LOGF类型 int main(void)
{int i=0;//signal(SIGCHLD, SIG_IGN);//daemon(0, 0);//fork 强制后台运行!// for(i = 0; i < 10; i++)system("touch /data/new_file.txt");while(1){sleep(1);printf("auto run demo! number=%d\n",i);LOGF("\nscript auto run demo! number=%d\n",i);i+=1;// LOGI("Calls=%d,Valid=%d",10,11);}return 0;
}
2.5 在Android下编译成可执行文件auto_run和auto_run_script。
3、打包固件运行,打开一个cmd窗口adb logcat查看打印信息,打开另外一个窗口setprop变量来start和stop进程。通过打印信息可以看出来开机后执行auto_run程序和运行rootandwakelock.sh。
三、kill 该进程后之后会重新调起例子,没有oneshot。
service gwdtservice /system/bin/giada_watchdoguser rootgroup rootdisabledseclabel u:r:init:s0
Android启动过程中执行一个C语言的应用程序或者执行shell脚本相关推荐
- 从Android启动过程中kernel日志确认Flash(分区)大小
直接上Android启动过程中kernel日志: [ 0.877387] mmc0: MAN_BKOPS_EN bit is not set [ 0.878355] mmc_host mmc0: Bu ...
- r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf
注: 本文是R语言sf包的核心开发者和维护者--来自德国明斯特大学的地理信息学教授:Edzer Pebesma 的一篇关于sf包的简介,发表于2018年7月的R语言期刊,主要讲述了sf的定位.功能. ...
- android启动过程中cpu降频,android省电开发之cpu降频
众所周知,在android系统的耗电量排行里,cpu的耗电占了比较大的一部分比例,也就是说,cpu的使用率和使用频率将直接或间接的影响电量的分配和使用,但很遗憾,android-sdk中没有为andr ...
- 计算机加电启动操作引导自举,在计算机加电启动过程中,加电自检程序、 操作系统、引导程序、自举装入程序,这四个的执行顺序为...
在计算机加电启动过程中四个程序的执行顺序应该为: 1.加电自检程序: 2.自举装入程序: 3.引导程序: 4.操作系统. 复位启动: "复位"是用硬件控制的方式对CPU进行复位操作 ...
- 编写一个USB接口程序,模拟计算机启动过程和关闭过程启动过程中要加载鼠标、键盘、麦克风等USB设备,具体要求如下: (1)定义一个接口USB,包含两个抽象方法turnOn()he turnOff(),
一.好物推荐 给大家推荐三款蓝牙耳机,下面的链接可以直接购买: 1.https://item.taobao.com/item.htm?ft=t&id=643733003968 2.https: ...
- ifix5.8 启动过程中 iFX系统未启动!Profice iFIX 启动文件末找到无法执行任务:IOCNTRL.EXE
错误提示: iFX系统未启动! Profice iFIX启动 文件末找到 无法执行任务:IOCNTRL.EXE 未检测到SCADA冗余对 无法找到I/O启动器的配置程序 解决过程:找到以下贴子 IF ...
- Android启动过程深入解析【转】
转自:http://www.open-open.com/lib/view/open1403250347934.html 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么 ...
- Android启动过程深入解析
当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样的? 什么是Linux内核? 桌面系统linux内核与Android系统linux内核有什么区别? 什么是引导装载程序 ...
- Android 启动过程简析(一)之 init 进程
问题 在进入到 Android 启动过程之前先让我们思考以下几个问题 Android 系统的启动过程是怎样的? init .zygote 进程是什么?在系统启动的过程中各自发挥了什么作用? AMS.P ...
最新文章
- PriorBox 改进
- mybatis入门-第一个程序
- 通达oa oracle数据库,通达OA 2016系统连接ORACLE 11g数据库(图文)
- 插件编写傻瓜教程VC6.0
- uva 10716 Evil Straw Warts Live
- 需求获取的三阶段:需求背景、需求调研、需求分析 (2)
- LMS Virtual Lab对发动机噪声进行仿真的2种方法
- BZOJ 3668: [Noi2014]起床困难综合症【二进制+贪心】
- Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
- 骁龙845_性能强大价格更吸引 超值骁龙845手机盘点
- 性能分析:处理器、磁盘I/O、进程、网络分析方法 http://www.cnblogs.com/fnng/archive/2012/10/30/2747246.html...
- php mysql完全自学手册 smarty_PHPSmarty完全开发手册.pdf
- 3、等长子网掩码及变长子网掩码以及超网
- torch.load()出现ModuleNotFoundError错误
- 磁耦隔离与传统隔离的区别
- 适用于高级别自动驾驶的驾驶员可预见误用仿真测试
- 苹果手机实现NTU校园网连接自动化
- python list是不可变的数据类型吗_python中不可变数据类型和可变数据类型
- 洞悉物联网发展1000问之为什么新零售不仅仅是无人零售?
- GitChat · 人工智能 | 如何零基础用 Keras 快速搭建实用深度学习模型
热门文章
- 非洲难民营之十六 冲突 下
- 马万的故事:从开发商到难民
- 美国旧金山之行第四天
- showdialog wpf 如何关闭_WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体...
- javascript 生成器函数 function*
- ubuntu22.04 虚拟机无法复制粘贴问题解决方案
- 48小时突破110亿美元销售额,这些爆款是最大功臣!
- Angular:This is probably not a problem with npm,There is likely additional logging output above.报错
- sql中的非等值连接
- 征途2经典版服务器双线哪个稳定,双线操控战不停 《征途2经典版》战灵分身登场...