• jQueryrocket


    最早以前的手机基本都是下载一个刷机软件(像刷机精灵、刷机大师),一键root,一键刷机,这就以前的傻瓜式刷机,至少我在高中(2015年开始接触)的时候也是这么干的。那时候,好像有种手机开机界面会出现“大神”,有时候莫名其妙开不开机,只能重新刷就好了。(别问为什么不去手机店修,玩手机都得偷偷摸摸的好吗)。后来发现,通过这种方式,手机能够增加一些额外没有功能,甚至是卸载掉最早手机上买回来就有的流氓软件。最初,自己也是在摸爬滚打的摸索着,还烧了两部手机,虽然现在很辣鸡,当时还是很心疼的。当然,能够成为爱好,还是靠了酷安里的一群人,隐藏大神很厉害!

    现在就来了解一下安卓手机的分区和一些刷机的术语吧。

     手机的ROM存储分成了几个分区:bootloader分区,boot分区,system分区等等(如上图)。刷机我们可以简单的理解成把软件安装在手机的某些分区。

    modem分区

    实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区,在所有适配的ROM中这部分是不动,否则会造成通话不稳定;

    bootloader分区和boot分区

    bootloader的primarybootloader部分,主要执行硬件检测,确保硬件能正常工作,然后将secondarystagebootloader拷贝到内存(RAM)开始执行。

                       Secondarystagebootloader会进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式。比如说大家所熟知的通过电源键和其它一些按键的组合,可以进入到recovery,fastboot或者选择启动模式的启动界面等。

     我们经常所说BL锁其实就是Bootloader Lock,其实就是手机主板上加了一串密码。

     fastboot模式:fastboot是android定义的一种简单的刷机协议,用户可以通过fastboot命令行工具(eg.:fastboot flash boot boot.img)来进行刷机。一般的手机厂商不直接提供fastboot模式刷机,会提供自己专有的刷机工具和刷机方法。万变不离其宗,本质将软件直接flash到各个分区中。通常,和它联系最紧密的就是线刷。(OTA 在智能手机中即是我们熟悉的设置—关于手机—系统更新,其全称是 Over-the-Air technology,简单来说就是无需连接电脑,在线下载和升级,与之对应的是 SD 卡升级(把 OTA 包放到 SD 卡上手动升级,卡刷)。)

    recovery分区

     recovery模式:recovery是android定义的一个标准刷机协议。当进入recovery模式时,secondary stage bootloader从recovery分区开始启动,recovery分区实际上是一个简单的Linux系统,当内核启动完毕后,开始执行第一个程序init(init程序是Linux内核启动的第一个用户级进程)。init会启动一个叫做recovery的程序(recovery模式的名称也由此而来)。通过recovery程序,用户可以执行清除数据,安装刷机包等操作。这是recovery刷机。(常见的TWRPMagisk

    正常启动模式。Secondary stage bootloader会从boot分区开始启动。boot分区的格式是固定的,首先是一个头部,然后是Linux内核,最后是用作根文件系统的ramdisk。
        一般针对每个机型的完整刷机包中会有一个boot.img文件,这就是boot分区镜像文件。当Linux内核启动完毕后,就开始执行根文件系统中的init程序,init程序会读取启动脚本文件(init.rc和init.xxxx.rc)。根文件系统中有一个重要的配置文件,叫default.prop,该文件的内容一般为:

    #
    # ADDITIONAL_DEFAULT_PROPERTIES
    #
    
    ro.secure=1
    ro.allow.mock.location=1
    ro.debuggable=0
    persist.service.adb.enable=1。

    如果ro.secure=0允许我们运行adb root命令。

    ro.deguggable=1允许调试系统APP

    通常大家说得内核ROOT指的就是ro.secure=0。ROOT权限只是的手机上有一个名为授权管理的程序(Superuser.apk)可以授予程序root用户的权限。 init程序读取启动脚本,执行脚本中指定的动作和命令,脚本中的一部分是运行system分区的程序。

     system分区

    核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电话,音乐等。应用层往下就是开发人员所接触的。

    框架层:这一层是Android系统的核心,它提供了整个Android系统运作的机制,像窗口管理,程序安装包管理,开发人员所接触的Activity, Service, broadcast等等。

    JNI层:JNI层是Java程序和底层操作系统通信的一个机制,它使得Java代码可以调用C/C++代码来访问底层操作系统的API。

    Dalvik虚拟机:Android开发使用Java语言,应用程序的Java代码会被编译成dalvik虚拟机字节码,这些字节码由dalvik虚拟机解释执行。(在Android4.4,被ART替换掉了之前一直使用的Dalvik虚拟机,不在本文中过多介绍)至于Dalvik虚拟机,我是对比着Java种的虚拟机来理解的。Java种的虚拟机JVM是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。当你启动一个Java程序,一个虚拟机实例就诞生了;程序退出时,这个实例也随之消亡。Dalvik则是安卓中的JVM。它是Google公司自主设计的运行于Android平台的Java虚拟机。JVM是归Oracle公司所有的,运行在基于PC机上的Window 和Linux操作系上的java虚拟机。Google工程师之所以设计Dalvik虚拟机主要有以下两点原因:若要使用JVM需要获得授权许可,这意味着需要缴纳大量的费用;JVM主要是针对于CPU快,内存大的传统PC机,不适合移动设备。和jVM很像,只不过他编译的其实是.dex文件(本质上是多个.class),另外为了进一步提高运行速度,Dalivk虚拟机可以运行八进制的文件.Odex。Dalvik允许多个实例,每一个实例作为一个独立的linux进程执行,可以防止一个程序的崩溃导致所有程序都崩溃。来张图片更明了:

    本地库:本地库一般是由C/C++语言所开发,直接编译成相应CPU的机器码,这其中包含标准C库,用以绘制图形的skia库,浏览器核心引擎webkit等。

    HAL:硬件抽象层,为了和各个厂家的不同硬件工作,Android定义了一套硬件接口,比如说为了使用相机,厂家的相机驱动必须提供的接口方法。这样使得上层的代码可以独立于不同的硬件运行。

    厂家适配层:本来Android定义的HAL层是直接和厂家提供的设备驱动打交道的,但是目前厂家不想开源HAL部分的代码,因此很多厂家都提供了一个我称之为厂家适配层的代码,这样在HAL层接口的实现只是一个简单的对厂家适配层接口函数的调用。

    内核:这一层就是大家熟悉的Linux内核,内核中包含有各种硬件驱动,这些驱动不同的手机厂商不同的手机是不一样的。Linux内核是支持驱动模块化机制的,简单的说就是允许用户动态的加载或者卸载某个硬件驱动,但是目前来看,手机厂商除了提供WIFI驱动单独加载外,其它驱动都是和内核绑定在一起的。 

    刷机的机友们,对RE管理器一定不陌生,尤其是那些习惯用第三方ROM的伙计。除了这个分区的组成,补充一下,该分区的一些路径,

    /system/priv-app 特权App,比system_app权限还要高,其不仅System_app标识是true,同时还置了Priv-app标识。

    /system/app  核心应用程序档(*.apk),都是放在这。像是Phone、Alarm Clock, Browser, Contacts 等等。 

    /system/framework 这里放 Android 系统的核心程式库。

    /system/lib上图中Library部分,存放的是所有动态链接库(.so文件),这些SO是JNI层,Dalvik虚拟机,本地库,HAL层所需要的,因为系统应用/system/app下的apk是不会解压的SO到程序的目录下,所以其相应用的SO,都应放在/system/lib 下面。
    /system/media/audio/(notification, alarms, ringtones, ui) 这里放系统的声音档,像是闹铃声,来电铃声等等。这些声音档,多是 ogg 格式。

    /system/bin存放的是一些可执行文件,基本上是由C/C++编写的。(有一个重要的命令叫app_process。一般大家称之为Zygote。(Zygote是卵的意思,所有的Android进程都是由它生出来的)。Zygote首先会加载dalvik虚拟机,然后产生一个叫做system_server的进程。system_server顾名思义被称作Android的系统服务程序,它主要管理整个android系统。system_server启动完成后开始寻找一个叫做启动器的程序,找到之后由zygote开始启动执行启动器,这就是我们常见到的桌面程序。)

    /system/xbin存放的是一些扩展的可执行文件,既该目录可以为空。大家常用的busybox就放在该目录下。Busybox所建立的各种符号链接命令都是放在该目录。
    /system/build.propbuild.prop和根文件系统中的default.prop文件格式一样,都称为属性配置文件。
    /system/etc目录存放一些配置文件,和属性配置文件不一样,这下面的配置文件可能稍微没那么的有规律。GPS配置文件(gps.conf)和APN配置文件(apns-conf.xml)放在这个目录。

    data和cache分区

    当我们开机进入桌面程序后,一般来说我们都会下载安装一些APP,这些APP都安装在data/app目录下。所有的Android程序生成的数据基本上都保存在data/data目录下。wipe data实质上就是格式化data分区,这样我们安装的所有APP和程序数据就都丢失了。作为一个刷基友来说,双清肯定都干过,其实擦除的也就是这一部分数据。

    【拓展:

    双清就是 TWRP 的恢复出厂设置,跟手机系统的恢复出厂设置还有点不同,它会卸载所有用户安装的应用,但保留 SD卡的文件。

    三清就是手机系统所谓恢复出厂设置,删除用户下载的应用也删除 SD 卡的文件。

    四清则是在三清的基础上把手机系统也删除掉,除非你确定手机里有完全可用的 ROM,不然用不着清理那么干净。

    FC,Force Close,即强制退出也叫闪退。如果是第三方应用闪退那就是应用自己的问题,如果是系统本身一些组件闪退那就说明当前系统不稳定,需要更换了。

    变砖,一般是系统文件被删除或损害导致无法开机,当然硬件损坏也会变砖。

    救砖:刷机失败,手机完全没反应,变板砖了,拯救手机。通常玩的比较六的机友会,使用9008模式救砖,这是一种利用9008端口物理线刷的方式)

    Kaspar温馨提示:刷机一时爽,翻车火葬场。数据及时备份,谨慎行车!

  • 相关阅读:
    mac 鼓捣php 多版本切换
    thinkPHP 导出excel 发布正式环境net::ERR_INVALID_RESPONSE
    js 计时显示 倒着 正者 都行
    LNMP 下 php.ini 文件修改后不生效
    Jquery 遍历数组之$().each方法与$.each()方法介绍
    js 去掉字符串最后一个逗号
    js拼接字符串时,字符串首出现undefined的问题
    PHP 暂停函数 sleep() 与 usleep() 的区别
    在IDEA里创建web项目,以及web 项目部署
    spring容器和springmvc容器,以及web容器的关系
  • 原文地址:https://www.cnblogs.com/kaspar/p/11454197.html
Copyright © 2020-2023  润新知