Android8.0后版本的分区变化

从上图可以看出,一个完整的Android镜像参与方有多方,比如

  • system.img 主要包括Android框架。
  • boot.img (内核/ ramdisk)包含Linux内核+ Android补丁。
  • vendor.img 包含SoC特定的代码和配置。
  • odm.img 包含设备特定的代码和配置。
  • oem.img 包含OEM /运营商相关配置和自定义。
  • bootloader 启动内核(供应商专有)。
  • radio 调制解调器(专有)。

在Android 8.0之前,供应商,odm和oem镜像是可选的;其实属于这些映像的文件被放置在boot.img或system.img中,并带有符号链接(如/vendor>/system /vendor)。

Android 8.0使vendor分区成为强制性的。目标是通过在Android平台(在system.img上)和供应商提供的代码之间定义标准接口来模块化Android分区。该标准接口使Android平台得到更新,而不会影响SoC和ODM分区。

8.0中最重要的更新之一是Project TrebleTreble是不仅仅是安全功能 - 它是一系列重要的体系结构变化,对安全性有着巨大的积极影响。

 为了让设备运行Android,设备制造商可以定制该设备的软件与设备的硬件。在以前的Android版本中,这些自定义与一般的Android OS框架混合在一起。在Android 8.0中,谷歌与设备制造商和片上系统(SoC)供应商密切合作解决这个问题,从而对Android的底层级系统架构进行了最大的改变。 Treble将供应商实现(由SoC供应商编写的设备特定的较低级别软件)与Android框架分离开来。为了实现这一目标,Android 8.0在Android框架和SoC供应商实施之间包含一个新的供应商界面。新的供应商接口由供应商测试套件(VTS)验证,该套件验证供应商实施的向前兼容性。这种分离使得将设备更新为新版本的Android变得更加容易,因为它使供应商的实现保持不变。

从历史上看,更新对于设备制造商而言是具有挑战性的,代价高昂且耗时的,因为它们的定制化。 带有Treble的设备更容易更新,这应该意味着更快的安全补丁和整个Android版本的更新生态系统。更快更轻松的更新并不是Treble唯一的安全优势。Treble的模块化旨在通过提高隔离度来提高安全性和供应商提供的硬件抽象层(HAL)的取消特权。Android的早期版本中,HAL在进程中运行。该进程需要所有进程内HAL所需的所有权限,包括直接访问内核驱动程序。同样,进程中的所有HAL都可以访问与进程剩余部分相同的一组权限,包括其他进程内HAL所需的权限。这导致了过度权限的进程和HAL,它们有权访问他们不应该拥有的权限和硬件。

在Android 8.0中,将HAL移入它自己的进程中。孤立的HAL更好地遵守最小特权原则,并提供两个明显的优势:

  • 每个HAL都在其自己的沙箱中运行,并且只能访问其控制的硬件驱动程序和执行其工作所需的权限。
  • 进程失去对硬件驱动程序和HAL所需的其他权限和访问的能力。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 8.0 及以上版本,为了增强应用程序的安全性,Android 引入了后台限制,禁止未在前台运行的应用程序启动服务。如果您想在后台启动服务,需要使用 `startForegroundService()` 方法。这个方法会启动一个前台服务,然后你可以在服务启动后在通知栏显示一个通知,以此来告知用户服务正在运行。 以下是一个使用 `startForegroundService()` 的示例代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 创建一个 NotificationChannel NotificationChannel channel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT); // 向系统注册 NotificationChannel NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } // 创建一个 Intent,启动你的服务 Intent serviceIntent = new Intent(this, YourService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 在 Android 8.0 及以上版本上,需要调用 startForegroundService() 方法启动服务。 startForegroundService(serviceIntent); } else { // 在 Android 8.0 以下版本上,可以直接调用 startService() 方法启动服务。 startService(serviceIntent); } ``` 注意:如果你使用的是 `startForeground()` 方法,会在 Android 8.0 及以上版本上抛出 `IllegalStateException` 异常,因为 Android 8.0 及以上版本禁止在后台启动服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值