android 官方说明
10余年的滴道网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整滴道建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“滴道网站设计”,“滴道网站推广”以来,每个客户项目都认真落实执行。
Android Init 语言由四大类语句组成,它们是 Actions、Commands、Services 和 Options。
所有这些都是面向行的,由空格分隔的标记组成。 c 样式的反斜杠转义可用于将空格插入到标记中。 双引号也可用于防止空格将文本分成多个标记。 反斜杠,当它是一行的最后一个字符时,可以用于换行。
以 # 开头的行(允许前导空格)是注释。
Actions 和 Services 隐式声明了一个新部分。 所有Commands或Options都属于最近声明的部分。 第一部分之前的Commands或Options将被忽略。
Actions 和Services 具有唯一的名称。 如果第二个 Action 或 Service 被声明为与现有的同名,则将其作为错误忽略。 (???我们应该覆盖而不是)
Actions 是命名的命令序列。 Actions 有一个触发器,用于确定动作何时发生。 当发生与Actions 的触发器匹配的事件时,该Actions 将添加到待执行队列的尾部(除非它已经在队列中)。
队列中的每个 action 都按顺序出队,并且该动作中的每个命令都按顺序执行。 Init 在活动中的命令执行“之间”处理其他活动(设备创建/销毁、属性设置、进程重 启)。
命令采取以下形式:
服务是在它们退出时启动并(可选)重新启动的程序。
服务采取以下形式:
选项是服务的调节器。他们影响init进程如何并且何时运行这个服务。
触发器是可用于匹配某些类型的字符串
事件并用于导致动作发生。
boot
这是 init 启动时将发生的第一个触发器
(在 /init.conf 加载后)
name=value
设置属性 name 时会发生这种形式的触发器
到特定值 value。
device-added-path
device-removed-path/pre
添加设备节点时会发生这些形式的触发器
或删除。
service-exited-name
这种形式的触发器在指定的服务退出时发生。
init : 单词翻译过来是 初始化的意思, 并不是一个官方提供的api函数,一般来说,程序员习惯自己写一个 init( ) 函数 来作为 自己写的 类/activity/surfaceview 的 首次执行初始化的操作,比如加载资源,比如给一些变量初始赋值,
并不是都需要放在init中, 控件 只要求在使用其之前 实例化就好,你要用了再来实例化取出也不晚, 只是 习惯上 把 要用的控件 都在 oncreate中 统一实例化,方便,易看, 但是把代码放在oncreate中很难看的感觉, 所以再创一个函数 init……之类的,把初始化代码都放里面,方便整改
第一篇: Android系统启动之bootloader
第二篇: Android系统启动之Init流程(上)
第三篇: Android系统启动之Init流程(下)
第四篇: Android系统启动之init.rc文件解析过程
第五篇: Android系统启动之zyogte进程
第六篇: Android系统启动之zyogte进程java(上)
第七篇: Android系统启动之zyogte进程java(下)
第八篇: Android系统启动之SystemServer
Android init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。
主要包含了四种类型的语句:
Action和services显式声明了一个语句块,而commands和options属于最近声明的语句块。
在第一个语句块之前 的commands和options会被忽略.
基本规则如下:
动作表示了一组命令(commands)组成.动作包括一个触发器,决定了何时运行这个动作。
注意: 当触发器的条件满足时,这个动作会被增加到已被运行的队列尾。假设此动作在队列中已经存在,那么它将不会运行.
一个动作所包括的命令将被依次运行。
在"动作"(action)里面的,on后面跟着的字符串是触发器(trigger),trigger是一个用于匹配某种事件类型的字符串,它将对应的Action的执行。
触发器(trigger)有几种格式:
常见的格式:
command是action的命令列表中的命令,或者是service中的选项 onrestart 的参数命令.
命令将在所属事件发生时被一个个地执行.
常见命令:
服务是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序.
解释一下各个参数:
options是Service的修订项。它们决定一个服务何时以及如何运行.
使用例子:
源码路径 system/core/init/init.cpp 中:
开始解析rc文件.
ParseConfig函数在文件 core/init/init_parser.cpp 140行:
ParseConfigFile函数:
Android init.rc文件浅析
安卓系统启动--3init.rc解析
init.rc深入学习
1.Root设备
Root权限下才能快乐调试。
使用市面上的各种Root师傅工具。
2.连接设备
将设备打开调试模式在开发者选项里。
将IDA安装目录中dbgsrv文件夹下的android_server推送到设备系统目录并赋可执行权限。在高于IDA6.6版本才能调试高版本android,此时调试低版本Android SO时,需要使用的是android_nonpipe。
在PC端输入命令:
adb shell su
adb shell android_server的路径/android_server
保持上面窗口,在命令行窗口进行端口转发:
adb forward tcp:23946 tcp:23946
为什么是23946呢,IDA和push进设备的android_server默认用都用23946端口进行通讯。当然可以修改。
3.打开IDA
附加或者启动进程的过程不再多言。
4.定位INIT函数
比较便捷的方法是找一份与设备同系统版本号的android源码。解析执行SO文件的地方在linker.c(cpp)中。
因为不同版本有差异,我就不上图了。
高版本时在do_dlopen()下的CallConstructors()里面,但是编译系统时往往将其和find_library融合在其父函数中,查找时需注意。一个简便方法是源码中搜索“INIT”四个字.
先将设备中的linker pull出来用IDA分析来确定调用INIT的具体位置。
因为linker在Android进程中加载非常早,所以它在IDA中的地址可以不用修正直接拿来用。
5.下断在INIT
下断点后,执行Apk中触发加载该SO的功能。
正常情况下就能停在该SO的INIT前了。