为Android添加开机启动脚本

Android 系统如何添加开机自启动 Shell 脚本 再回到权限那里,我们的脚本调用了 echo log 两个命令,这两个命令会通过执行 toybox_vendor 来实现,当执行 toybox_vendor 时,我们就需要 toybox_vendor 的打开,读取,执行权限,以及配置 domain 转换(A 程序到 B 程序都需要配置域转换)。很多时候,我们想在系统启动的时候干一些“私活”,这个时候,我们就可以添加开机自启动的脚本来完成。启动时打的 log,以及启动相关的属性值均正常,证明我们添加的脚本执行成功了。需要注意的是 shebang 的内容是。 阅读详情

最近在做项目的过程中,遇到了这么一个需求,需要在Android(4.2.2)启动时候执行以下命令,命令的具体含义不再解释:

  1. mount -t usbfs none /proc/bus/usb

最初做法是将其加入init.rc文件中,但是发现此方法行不通,原因到现在也未查明,希望知道原因的朋友能够留言告知,不胜感激o(∩_∩)o 。

接着查阅相关资料,发现将命令写入一个sh文件中,之后在开机的时候执行该sh文件,同样能够达到效果,于是新建了一个sh文件usbfs.sh,内容如下:

  1. #! /system/bin/sh
  2. mount -t usbfs none /proc/bus/usb

这里需要注意的是,操作该文件(包括新建、编辑)时尽量在Linux环境下,不要在Windows下。我开始做这步的时候是在Win下进行内容编译,之后将文件拷贝至Android源码相应位置的。结果编译完成,镜像烧写后发现死活都不执行,或者报错,cat了一下发现内容里有多余的字符。

接下来的操作,目的就很明确了。

第一、我们需要Android在编译的时候,将这个文件拷贝至输出目录相应的位置,并且最终添加到镜像中去。

第二、我们需要Android在启动的时候,执行这个sh文件。

围绕以上两点,我们开展下一步的工作。

 

一、实现编译时执行对此文件的拷贝。

 

新增的sh文件,我的存放路径为device/hisilicon/bigfish/etc/usbfs.sh。不同平台的话,文件路径可能略有差异,我的是海思平台的源码包。具体怎么定,按你自己的实际情况来。

出于安全考虑,我准备将该文件拷贝至Android system分区下的etc目录中,即目标地址为:/system/etc/。

OK,做好以上两点,接下来就是添加相应的拷贝动作了。这个动作需要自己添加的吗?当然,大部分情况下Android在编译的时候是不会自动添加你新增的文件的。动作在哪里添加的呢?

在这里----device/hisilicon/Hi3716CV200/device.mk文件中,当然这个也是不同平台略有差异,打开该文件,我们就能看到以下内容了(摘抄):

  1. #
  2. # Copyright (C) 2011 The Android Open-Source Project
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. #      http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. #
  16. PRODUCT_AAPT_PREF_CONFIG := xhdpi
  17. PRODUCT_CHARACTERISTICS := tablet
  18. PRODUCT_COPY_FILES := \
  19.     frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \
  20.     frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \
  21.     frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml
  22. PRODUCT_COPY_FILES += \
  23.     device/hisilicon/bigfish/etc/init.rc:root/init.rc \
  24.     device/hisilicon/bigfish/etc/init.hidolphin.rc:root/init.hidolphin.rc \
  25.     device/hisilicon/bigfish/etc/ueventd.bigfish.rc:root/ueventd.bigfish.rc \
  26.     device/hisilicon/bigfish/etc/media_codecs.xml:/system/etc/media_codecs.xml \
  27.     device/hisilicon/bigfish/etc/media_profiles.xml:/system/etc/media_profiles.xml \
  28.     device/hisilicon/bigfish/etc/tablet_core_hardware.xml:system/etc/permissions/tablet_core_hardware.xml \
  29.     device/hisilicon/Hi3716CV200/etc/init.Hi3716CV200.rc:root/init.bigfish.rc \
  30.     device/hisilicon/Hi3716CV200/etc/init.Hi3716CV200.sh:system/etc/init.bigfish.sh

我们需要做的,就是将以下内容添加到上述文件合适的位置:

  1. PRODUCT_COPY_FILES += \
  2.         device/hisilicon/bigfish/etc/usbfs.sh:system/etc/usbfs.sh

“:”前面是文件源路径,后面的是目的路径。

这样,Android在执行编译的时候就会把新增文件拷贝至相应的目标路径去了,拷贝动作已经实现。

 

二、添加启动动作,使Android在启动时候执行。

 

如何添加启动动作?大部分人或许都知道,那就是在init.rc文件中添加上就是了,网上也有一些此类的介绍,我是这么做的:

init.rc文件末尾处加入以下内容(不再详述,不懂的自己翻书或者爬网查)

  1. service mount-usbfs /system/etc/usbfs.sh
  2.     class main
  3.     user root
  4.     group root
  5.     oneshot

之后编译系统,烧写,启动,观察启动log,发现确实执行了该sh文件,但是却报了一个“权限不足”的提示,ll了一下usbfs.sh文件,发现权限是644,没有执行权限。

OK,没有执行权限,给他添加上执行权限就是了,同样是在init.rc文件中,添加以下内容:

  1. chown root shell /system/etc/usbfs.sh
  2. chmod 0550 /system/etc/usbfs.sh

添加了执行的权限,这次应该没有问题了吧,网上很多介绍也是这么干的。

之后又是编译、烧写、启动...漫长的过程(┬_┬),Android系统级开发,要有耐心啊。

观察启动的log,居然还是“权限不足”!!!怎么回事,难道没有生效?ll了一下usbfs.sh文件,发现权限居然还是644,说明刚才的赋权限是没有效果的。

为什么?接着查,在查看init.rc的过程中,发现了以下内容:

  1. mount ext4 ext4@system /system ro

原来system分区是以只读的形式进行挂载的,忽略这点了。以只读形式挂载,再怎么赋权限,也是徒劳啊。

突然又发现,与usbfs.sh在同一个目录的init.bigfish.sh,权限是正常的,并且该文件的源文件与sh文件同样都在一个目录里。那么,这说明Android在编译过程中,除了拷贝以外,应该还有一个赋权限的动作。

基于以上思路,继续进行查找。功夫不负有心人,还真被我找到了,确实存在这么一个动作,它在哪里呢?

在这里:system/core/include/private/android_filesystem_config.h,其中有个结构体做如下定义:

  1. /* Rules for files.
  2. ** These rules are applied based on "first match", so they
  3. ** should start with the most specific path and work their
  4. ** way up to the root. Prefixes ending in * denotes wildcard
  5. ** and will allow partial matches.
  6. */
  7. static struct fs_path_config android_files[] = {
  8.     { 00440, AID_ROOT,      AID_SHELL,     "system/etc/init.goldfish.rc" },
  9.     { 00550, AID_ROOT,      AID_SHELL,     "system/etc/init.goldfish.sh" },
  10.     { 00550, AID_ROOT,      AID_SHELL,     "system/etc/init.bigfish.sh" },
  11.     { 00440, AID_ROOT,      AID_SHELL,     "system/etc/init.trout.rc" },
  12.     { 00550, AID_ROOT,      AID_SHELL,     "system/etc/init.ril" },
  13.     { 00550, AID_ROOT,      AID_SHELL,     "system/etc/init.testmenu" },
  14.     { 00550, AID_DHCP,      AID_SHELL,     "system/etc/dhcpcd/dhcpcd-run-hooks" },
  15.     { 00550, AID_DHCP,      AID_SHELL,     "system/etc/dhclient*" },
  16.     { 00440, AID_BLUETOOTH, AID_BLUETOOTH, "system/etc/dbus.conf" },
  17.     { 00444, AID_RADIO,     AID_AUDIO,     "system/etc/AudioPara4.csv" },
  18.     { 00555, AID_ROOT,      AID_ROOT,      "system/etc/ppp/*" },
  19.     { 00555, AID_ROOT,      AID_ROOT,      "system/etc/rc.*" },
  20.     { 00644, AID_SYSTEM,    AID_SYSTEM,    "data/app/*" },
  21.     { 00644, AID_MEDIA_RW,  AID_MEDIA_RW,  "data/media/*" },
  22.     { 00644, AID_SYSTEM,    AID_SYSTEM,    "data/app-private/*" },
  23.     { 00644, AID_APP,       AID_APP,       "data/data/*" },
  24.         /* the following two files are INTENTIONALLY set-gid and not set-uid.
  25.          * Do not change. */
  26.     { 02755, AID_ROOT,      AID_NET_RAW,   "system/bin/ping" },
  27.     { 04750, AID_ROOT,      AID_INET,      "system/bin/netcfg" }, //modified by lwf 20141008,for resolve a bug when DHCP enable.
  28.                                                                   //called by BrowserEthernetClientX::submitParameters().
  29.         /* the following five files are INTENTIONALLY set-uid, but they
  30.      * are NOT included on user builds. */
  31.     { 06755, AID_ROOT,      AID_ROOT,      "system/xbin/su" },
  32.     { 06755, AID_ROOT,      AID_ROOT,      "system/xbin/librank" },
  33.     { 06755, AID_ROOT,      AID_ROOT,      "system/xbin/procrank" },
  34.     { 06755, AID_ROOT,      AID_ROOT,      "system/xbin/procmem" },
  35.     { 06755, AID_ROOT,      AID_ROOT,      "system/xbin/tcpdump" },
  36.     { 04770, AID_ROOT,      AID_RADIO,     "system/bin/pppd-ril" },
  37.         /* the following file is INTENTIONALLY set-uid, and IS included
  38.          * in user builds. */
  39.     { 06750, AID_ROOT,      AID_SHELL,     "system/bin/run-as" },
  40.     { 00755, AID_ROOT,      AID_SHELL,     "system/bin/*" },
  41.     { 00755, AID_ROOT,      AID_ROOT,      "system/lib/valgrind/*" },
  42.     { 00755, AID_ROOT,      AID_SHELL,     "system/xbin/*" },
  43.     { 00755, AID_ROOT,      AID_SHELL,     "system/vendor/bin/*" },
  44.     { 00750, AID_ROOT,      AID_SHELL,     "sbin/*" },
  45.     { 00755, AID_ROOT,      AID_ROOT,      "bin/*" },
  46.     { 00750, AID_ROOT,      AID_SHELL,     "init*" },
  47.     { 00750, AID_ROOT,      AID_SHELL,     "charger*" },
  48.     { 00750, AID_ROOT,      AID_SHELL,     "sbin/fs_mgr" },
  49.     { 00640, AID_ROOT,      AID_SHELL,     "fstab.*" },
  50.     { 00644, AID_ROOT,      AID_ROOT,       0 },
  51. };

从行9可以看到,此处重新定义了init.bigfish.sh的权限,OK,我们应该只需要加入以下内容,就可以了:

  1. { 00550, AID_ROOT,      AID_SHELL,     "system/etc/usbfs.sh" },

保存,编译,启动。。。果然可以了!

 

后话

 

个人感觉,我这种做法是比较遵循Android规则的一种方法。可能存在一些更加简单、直接的方法,我在爬网文过程中也看到过,比如更改system分区的挂载方式,由只读变为读写等等,但是这样的方法,你自己感觉合适吗?

当然,如果你有更好的方法,希望能够留言分享,不胜感激o(∩_∩)o 。


转自: http://www.liweifan.com/2014/12/03/android-initrc-shell-script/

Android开机自动执行脚本 Android开机自动执行脚本0.前言1.需求描述2.需求分析3.操作步骤4. 0.前言 由于作者本人初次接触Android,所以本文所述内容只是操作方法,没有深究原理。各位可自行深入学习研究。 1.需求描述 需要在Android开机启动之后,自动执行一个脚本,假设这个脚本是 test.sh。 2.需求分析 根据需求描述,可以推导有两件事情要做: 首先将 test.sh 脚本文件预置到Android中的某个路径下,假设放在system/app; 编译后,下载到开发板,上电自动执行 test.sh 脚本。 阅读详情

相关推荐

Android 系统添加开机自启动脚本

OS:Android8.1 Platform:PX30 我们这儿以创建一个开机自启动日志服务为例 1、创建需要自启动的脚本文件 创建一个名字为init_tool.sh的脚本文件,内容如下: #!/system/bin/sh mkdir -p /sdcard/logs/ logcat -b system -b events -b main -b radio -b kernel -n 10 -v threadtime -f /sdcard/logs/alllog -r5000 脚本名称及内容可自定义。 2

我的小鱼楠的博客 8305

Android系统添加开机自动启动执行的shell脚本

Android系统添加开机自动启动执行的shell脚本

特立独行的博客 1万+

Android 添加开机启动脚本

2.修改 device/xxx/xxx/device-common.mk 文件,将编写的 loadsetmix.sh 文件添加拷贝操作,拷贝到 system/bin/ 目录,如。1.编写一个 loadsetmix.sh 脚本文件,语法别写错了 :D。如果需要添加多个脚本,添加多个对应的拷贝操作即可。基于 AN8.0 ,添加一个开机启动脚本。

u010503912的专栏 1291

[Android]开机自启动脚本和selinux权限配置

概述 在前段时间的工作中,需要开发一个开机自动启动的脚本,现把开发过程记录一下 主要框架 编写一个可以开机自动启动的脚本,方法就是通过rc文件,在boot_complete=1时,去启动这个服务,那么,可以先基于以上思路,创建实现脚本所需要的文件。 通常来说,我这个脚本是要放在vendor分区的,因此将脚本放到vendor目录下,参考其他的脚本,创建3个空的文件如下: multi_tpinsmod/ //脚本文件夹 ├── Android.bp //bp文件,用于放置编译参数 ├── multi_t

骑驴赶集市的博客 9466

Android开机启动执行脚本的实现方法

在Android系统中,我们经常需要在设备开机时执行一些特定的操作,例如启动某个应用程序或执行一段脚本。通过创建一个初始化脚本,并将其添加到Android系统的启动流程中,我们可以在设备开机时执行自定义的命令。将脚本文件复制到Android设备的/system目录下,并修改文件权限,使其可执行。首先,我们需要创建一个Shell脚本文件,用于存放要在开机时执行的命令。因此,我们需要编辑这个文件,以在开机时执行我们的脚本。要实现这个功能,我们需要创建一个初始化脚本,并将其添加到Android系统的启动流程中。

2301_79326588的博客 3364

android开机自启动APP及使用adb命令测试方法

android开机自动运行APP实现方式其实很简单。在android系统运行时,会发出“android.intent.action.BOOT_COMPLETED”这个系统广播,因此我们监听它,并进行打开APP的操作即可。现在大多数的android手机系统都默认禁止第三方安装的APP开机自启动,只有系统APP(system/app)才默认有这个权限,所以一般都需要去安全中心或者手机管家中去设置为允许。这里说个题外话,手机软件除非特殊情况,不然最好不要做开机自启动,开机自启动一般适用于android系统的终端机上,开机即运行相应的项目,该机器上也只有这个项目,下面上代码。 新建一个类AutoSta

为 Android 8.0 添加开机启动脚本

为 Android 8.0 添加开机启动脚本 Qidi 2018.01.11 (Markdown & Haroopad) 【写在前面】   本人对于 SELinux for Android 理解不深,下文中的各文件及安全规则虽都是我所编写,但也是一边查阅文档一边试验得出的。在此强行为文,若有理解错误之处,请各位工程师同仁热情指出。 一、需求描述   项目上需要在 Andr

一程山水一程歌 1万+

昆仑通态,自由串口通讯

软件默认无该功能,需要问客服索要扩展包。

cfqq1989的博客 1537

Android 系统添加开机自启动脚本(转)

本文转载链接:Android 系统添加开机自启动脚本_我的小鱼楠的博客-优快云博客_安卓开机自启脚本 OS:Android8.1 Platform:PX30 我们这儿以创建一个开机自启动日志服务为例 1、创建需要自启动的脚本文件 创建一个名字为init_tool.sh的脚本文件,内容如下: #!/system/bin/sh mkdir -p /sdcard/logs/ logcat -b system -b events -b main -b radio -b kernel -n 10 -v .

Johnny2004的专栏 3038

电机转矩、功率与转速:核心关系、公式推导与工程应用指南

在电气传动与自动化控制领域,理解旋转机械的核心物理量是进行设备选型、系统设计和故障诊断的基础。转矩、功率和转速构成了描述电机性能的“铁三角”,它们之间通过经典的物理公式紧密关联。从原理上讲,功率是单位时间内做功的能力,转矩是产生旋转运动的力矩,而转速则决定了运动快慢。这三者的关系(P = T × n / 9550)不仅是理论核心,更是工程实践中的关键计算工具,直接关系到电机的驱动能力、能耗与系统匹配。其技术价值在于,它为从微型伺服电机到大型工业传动系统的设计提供了统一的量化分析框架。在应用场景上,无论是为输

weixin_29184371的博客 258

FPGA开发者必看:手把手教你用Xilinx ERNIC IP实现RoCE v2网络加速(附PG332文档解读)

本文详细解析了Xilinx ERNIC IP在FPGA平台上实现RoCE v2网络加速的全流程,包括架构设计、Vivado工程配置、驱动开发与性能调优。通过PG332技术文档的实践指导,帮助开发者快速构建低延迟、高性能的网络加速方案,适用于数据中心和边缘计算场景。

weixin_29168813的博客 669

android+启动脚本,imx6q android 添加开机启动脚本

1.在xx/out/target/product/sabresd_6dq/root/init.rc中添加以下内容==========================================service android-user /system/etc/android-user.shclass mainuser rootgroup rootoneshot==================...

weixin_35781147的博客 362

LightRAG实战:从零构建中药知识图谱,解锁六种检索模式效能对比

本文详细介绍了如何使用轻量级RAG框架LightRAG从零构建中药知识图谱的实战过程。通过本地部署环境搭建、开源模型配置与《本草纲目》数据导入,文章重点对比了Naive、Local、Global、Hybrid、Mix和Bypass六种检索模式在中药问答中的效能差异,并提供了可视化图谱与优化心得,为开发者构建专业领域智能问答系统提供了实用指南。

weixin_29096377的博客 176

rk3399 android8.1 添加开机启动脚本

项目场景: 使用 瑞星微RK3399 android8.1系统 linux4.4版本内核平台做可视化终端 包含双目摄像头(mipi接口),显示屏,fm1288声卡。 目录 项目场景: 文章目录 一、关于开机启动脚本的添加 1.找到脚本init.rc 2.添加相关启动权限 3.te文件权限内容格式 一、关于开机启动脚本的添加 因为好多引脚是通过手动拉高的,因此添加了一个开机启动脚本做初始化。 1.找到脚本init.rc 在当前的系统中,开机启动过程会调用 init...

m0_59561453的博客 1141

一文看懂分布式存储架构

目录一、集中存储结构二、分布式存储1 、分布式存储的兴起2 、分布式存储的重要性3 、分布式存储的种类和比较三、分布式理论浅析1 、一致性和可用性2 、数据分布3 、复制4 、分布式协议5、跨机房部署四、分布式文件系统1、 Google 文件系统( GFS )2、 Taobao 文件系统( TFS )3、 Fackbook Haystack 文件系统4、 CDN 内容分发网络五、分布式键值系统1、 Amazon Dynamo2、 Taobao Tiar3、 ETCD4 、产品选型比较( Etcd , Zoo

weixin_70730532的博客 2万+

注意力机制模块:二次创新:CBAM 与 ECA 融合形成 CECA 模块,参数量减少 40%

文章摘要: 本文提出一种轻量化注意力模块CECA,通过融合CBAM和ECA的优势解决模型部署中的精度与速度矛盾。CBAM虽具备通道和空间双重注意力,但参数量大;ECA轻量但缺乏空间注意力。CECA采用ECA的一维卷积替换CBAM的通道注意力部分,保留其空间注意力模块,在保持双注意力能力的同时减少40%参数量。实验表明该方案在边缘设备部署中能维持精度并提升推理速度,特别适用于YOLO等目标检测模型的轻量化改进。文章详细拆解了架构设计、代码实现及参数量优化原理,为算法工程师和嵌入式开发者提供了实用解决方案。

ZXSXJ的博客 237

为 Android 8.0 添加开机启动脚本【转】

本文转载自:https://zhuanlan.zhihu.com/p/32868074  本人对于SELinux for Android理解不深,下文中的各文件及安全规则虽都是我所编写,但也是一边查阅文档一边试验得出的。在此强行为文,若有理解错误之处,请各位工程师同仁热情指出。   感谢 @leedecode 指出文章不足。按照 Project Treble 的要求,这种需求的规范做...

zzb2760715357的博客 159

C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎

本文探讨了嵌入式开发中句柄(Handle)的概念与应用。通过电机控制案例,分析了传统单例模式在扩展性上的局限,并展示了如何通过句柄实现代码复用:将电机状态封装为结构体,通过指针(句柄)传递实例数据,使同一套逻辑可操作多个实例。文章比较了单例模式与句柄模式的适用场景,建议底层驱动库默认采用句柄模式以提高扩展性。最后指出当前实现仍存在数据暴露风险,预告下期将介绍不透明指针技术实现更安全的封装。全文揭示了句柄作为C语言实现模块化和面向对象设计的关键作用。

一路往蓝-Anbo 的博客 1340

Android添加开机自启动脚本

最近需要在android5.1中添加自启动脚本,直接将脚本要执行的指令写到init.rc没有成功,可以将指令写到一个sh脚本,用init.rc来执行sh脚本才成功。 需要注意的有: 1.sh脚本第一行不能省略 #!/system/bin/sh 注意:这是Android设备上的sh 2.sh脚本的权限要可执行,init.rc除了要添加service外,还需要在这之前修改sh脚本的权限 chown root shell /system/etc/my.sh chmod 0755 /system/e

学无止境,止于至善 5585

【DRAM存储器五十一】LPDDR5介绍--DFE与Pre-Emphasis

简述LPDDR5的DFE和预加重应用设置

highman110的博客 705

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android 8.1 添加开机启动脚本

本文转载自:https://zhuanlan.zhihu.com/p/32868074  本人对于SELinux for Android理解不深,下文中的各文件及安全规则虽都是我所编写,但也是一边查阅文档一边试验得出的。在此强行为文,若有理解错误之处,请各位工程师同仁热情指出。   感谢 @leedecode 指出文章不足。按照 Project Treble 的要求,这种需求的规范做法应该是通过 HIDL 进行调用并添加上相应的 SELinux 权限,所以下文中的做法只能算是一种 worka...

梦家之家 1622

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: windows 如何查看端口占用情况
下一篇: libelf.so.1: cannot open shared object file
simonjay2007
博客等级 码龄17年 104粉丝 112原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值