Android在init.rc中自定义开机启动进程(service) 您所在的位置:网站首页 安卓app设置开机自启 Android在init.rc中自定义开机启动进程(service)

Android在init.rc中自定义开机启动进程(service)

2023-09-15 18:37| 来源: 网络整理| 查看: 265

Android在init.rc中自定义开机启动进程(service)

原文链接:Android如何配置init.rc中的开机启动进程(service)(有删改)

前言

首先我先来解释一下本文到底讲什么的。 用一句话来说:本文讲解的主要内容是,如何通过修改Android操作系统源码,来配置一个自定义的开机启动进程。

有些人也许会问,这有什么用?问的好,一项实用的技术必然要有用处才会有价值。

首先说明的是,如果你的工作或项目只是做一个应用程序app,那本文确实没有什么用处。但如果你的公司做的是Android系统开发,或者本身就是一家做硬件的公司,那本文可能就会有不少用处了;

举个例子:假如你们公司做了一台搭载Android的嵌入式设备,这台设备有某个特殊的传感器是一般手机没有的,传感器属于硬件,那想让硬件工作就必然有驱动程序,现在我们想让这个传感器在设备一开机的时候就立刻启动,那我们就需要知道如何配置一个Android的开机启动进程了。而本文正是讲这部分内容的。如果用最简单的一句话描述本文是讲什么的,那其实只要文章题目的一句话,但是其实涉及到的知识又多又杂,加上本人也处在底层开发的探索阶段,所以,涉及到的知识我只讲到我们能用到的深度为止,如果想深入学习,我会附上其他博主对这些知识深入分析的文章的链接。

需要做哪些准备工作?

首先,在硬件上,我希望你能有一块能搭载Android系统的嵌入式开发板,比如我用的是Friendly-arm的NanoPi M3,也许你会问,一台普通的Android手机行不行,这个说实话我没有试过,但是市面上的手机有很多权限是被厂商限制的,所以如果用手机来测试,可能会发生很多迷之问题,所以我建议还是使用一块开发板,不一定非要和我的型号一样,只要能跑Android就行。其次,在软件上,我希望你准备好了一份Android系统的源码,关于如何获取Android的源码我这里就不讲了,网上有很多文章讲这个,你可以从Google官方的渠道获取,如果你使用开发板,一般开发板的提供商也会提供定制的Android源码,那我们就直接从开发板的提供商的网站获取就行了。最后,我希望你有一台装有mac OS或者Linux操作系统的电脑,本文所开展的工作只支持以上两种系统,不支持Windows,其实我比较推荐unbuntu 14.04,这也是我使用的开发板的官方文档所推荐的,你当然也可以用Mac,但是说实话,我最开始开展工作时用的是搭载mac OS 10.12.02的Macbook pro 2016,各种发生迷之错误,其实按道理来说是可以解决的,但是由于做底层开发的人本来就不多,以及用Mac做底层开发的人就更少了,所以网上关于解决这些问题的学习资料以及文章少之又少,导致问题长时间无法解决,浪费时间,所以还是推荐使用ubuntu 14.04。

最后,阅读本文需要哪些知识?本文尽量讲的通俗且浅显易懂,你不需要有任何底层开发的前置知识,你只需要对Android系统有一个比较全面的认识就行,你说你写App的水平不高?这些都没关系,都不会影响你阅读这篇文章。但是我希望你能了解最起码的Linux命令,不用太复杂,最基本的就行,实在不行,Windows的cmd命令总用过吧,只要会用命令行工具进入硬盘下某个目录就行。

大体上有哪些知识点

大体上有哪些知识点,我画了以下一张图来描述:

img

这么一看,一目了然,我们需要将我们自己写的程序(示例中我用的是C语言)将它配置给init.rc这个文件;然后通过编写Android.mk来对它进行编译描述,什么是编译描述呢?我们可以这么理解,只要我们写的这个程序的所在目录下有Android.mk文件,它就可以和Android源码一样用make命令编译;然后我们要通过SEAndroid给我们的程序授权,否则程序会因为权限问题而无法执行;以上这些都是在Android源码中进行修改的;最后,我们将源码编译,刷机,运行,你亲自编译的Android操作系统就可以运行在你的开发板上,同时,你的C程序也可以跟随Android系统的启动而实现开机启动。

Android源码目录结构介绍

我相信读者手里已经拿到一份Android源码了,无论它是从哪里获得的(哪怕是同学同事拷贝给你的)。我的源码版本是5.1.1,源码版本对本文的影响不大,只要版本不是太老就行。我们先来对Android源码做个简要的介绍。打开源码的文件夹,我们会发现有很多目录,让我们眼花缭乱,确实,Android系统是一个非常复杂的软件,它必须面面俱到,所以这里面的源码覆盖了方方面面,想要全部把它看完是不可能的,我相信有不少人看过Linux内核源码,光是Linux内核的源码可能就能让一个人一生都无法穷尽,而Linux内核只是Android的最底层,可想而知Android的源码数量有多么庞大,所以我在这里只说几个我们最常用的目录以及本文会涉及到的目录。

不少人做Android都是做应用开发,做应用开发入门以后很多人都想要进阶,这时候就会买一些进阶的书,这些进阶的书很多都涉及Android源码分析,比如比较火的《Android开发艺术探索》,《Andoird源码设计模式解析与实战》等等,我们刚学Android的时候就知道,Android系统分为四层,我们开发的应用处于Application层,而Application层的下面一层是framework层,想做好应用开发,了解一下下层机制是必不可少的,所以我刚才说的源码分析的书籍所讲解的源码都在framework层,大家其实也能发现,这些书里所讲的源码都是java代码。那打开Android源码目录,我们能看到一个framework文件夹,所以framework层的源码就在这个文件夹下,你进去找找,可以找到不少应用开发时常用的API。

上面说的是闲话,现在我来介绍一个等一下会多次使用的一个目录——device,点开这个目录,我们会看到很多手机品牌的名字,比如htc啊,moto啊,samsung啊等等。这是什么意思呢?Android系统会运行在各种品牌的手机上,但是各种品牌的手机在硬件上都会有差异,因此,很多厂商都会对源码进行定制,以修改它的某些部分来配合自家硬件的特性,比如我有某个传感器,别的厂商没有,我的摄像头比较特殊,运行起来比较复杂,这些都属于硬件差异。由于我使用的Friendly-arm提供的源码,所以我可以在这个目录下看到一个friendly-arm的文件夹,里面是针对friendly-arm的开发板定制的一些代码,等会儿我们会多次访问这里。

还有一些等下我们会常用的目录,比如system,external,out等等,这些我们等会儿用到的时候再说。

如何在源码中添加自己的可执行文件

我们如果想要一个属于自己的开机启动进程,那首先就要一个我们自己编写的程序了,一般来说,在实际项目中这个程序就是我们想要开机启动的驱动,正如文章开头所说的那样,但是在我们这个例子中,我就不搞那么复杂了,写一个最简单的C语言程序,让它作为我们的开机启动进程。我给这个程序命名为loop,也就是循环的意思,代码如下:

#include int main() { int i = 0; for(i;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有