
ART
文章平均质量分 78
Invoker123
菜鸟的一点笔记,大神请多多指教
展开
-
Android10中的boot*.art和boot*.oat加载过程
简介 在Android7.0之前,所有bootclasspath指定的库会被同一编译成为boot.oat和boot.art两个文件。其中boot.oat包含了编译后的机器码指令,而boot.art文件,则是一个类对象映像。boot.art内包含了所有framework/base/preloaded-classes文件列出的所有类。这些类会被一次性的载入到内存中,并可以被直接使用。 在Android7.0及以后,boot.art和boot.oat被分成以boot-{packagename}.oat/a原创 2021-03-03 21:42:28 · 5308 阅读 · 0 评论 -
java类的访问权限问题
Android中java类的访问权限控制在art中的Class::CanAccessMember实现。其中,参数access_to是要访问的属性或者方法所在的类,member_flags是要访问的属性或者方法的flag(Android提供public、protected、private修饰符来设置flag)。规则如下(以下规则优先级从高到低): 1.如果要访问的内容在当前类中,允许访问; 2.如果要访问的内容设置了public修饰符,允许访问; 3.如果要访问的内容设置了private修饰符原创 2021-02-05 12:33:29 · 449 阅读 · 0 评论 -
Android针对非SDK接口的限制(基于Android 10)
简介 从 Android 9(API 级别 28)开始,此平台对应用能使用的非 SDK 接口实施了限制。只要应用引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,这些限制就适用。这些限制旨在帮助提升用户体验和开发者体验,为用户降低应用发生崩溃的风险,同时为开发者降低紧急发布的风险。Google官方文档地址:针对非 SDK 接口的限制全局hiddenapi设置HiddenApiSettings AMS有一个HiddenApiSettings类型的成员,负责记录黑名单是否使能(mBlackl原创 2020-07-20 17:54:01 · 3384 阅读 · 0 评论 -
ART加载OAT文件的过程分析
OAT文件是一种Android引入ART虚拟机后的一种私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。Android使用/system/bin/dex2oat(我们也可以编译出debug版本的dex2oatd)来将DEX文件编译成OAT文件,dex2oat的主入口为main函数:/art/dex2oat/dex2oat.ccint ...原创 2018-03-30 00:08:49 · 2016 阅读 · 0 评论 -
ART类和方法
先看看ART中跟类的查找关系最密切的classlinker的初始化过程。当启动的时候存在boot.art的时候,将从imagespace中初始化classlinker;当没有boot.art的时候,将脱离boot.art调用InitWithoutImage初始化classlinker。由于dex2oat进程生成boot.art时没有image,这时候调用的是InitWithoutImage来加...原创 2018-04-13 03:42:16 · 2728 阅读 · 0 评论 -
ART虚拟机的对象分配过程
在art内部对线程Thread的实现中,会对函数跳转表进行初始化,这些函数跳转表的初始化在不同的平台有不同的实现,通常是记录一些关键的汇编函数的入口。Thread类有个struct tls_ptr_sized_values结构体成员,struct tls_ptr_sized_values的interpreter_entrypoints,jni_entrypoints,portable_en...原创 2018-05-09 12:54:19 · 1869 阅读 · 0 评论 -
ART虚拟机堆的创建过程
ART在调用Runtime::Init进行初始化的过程中,会创建一个虚拟机堆Heap。堆的初始化过程需要由一些虚拟机启动参数决定,例如有: 1. options->heap_initial_size_: 堆的初始大小,通过选项-Xms指定。 2.options->heap_growth_limit_: 堆允许增长的上限值,这是堆的一个软上限值,通过选项-XX:HeapG...原创 2018-04-25 01:25:50 · 1323 阅读 · 0 评论 -
Android synchronized实现原理
synchronized关键字可以用在两处:1.同步代码块,锁住的是任意的object,也可以是类;2.同步方法,其中普通同步方法锁住的是类的实例对象,静态同步方法锁住的是这个类。在Android中,它们的实现原理都是通过monitor实现的。大致过程是:monitor-enter(加锁)–>执行同步代码块或同步方法–>monitor-exit(释放锁)。 举个例子。/f...原创 2018-06-12 15:01:03 · 2190 阅读 · 2 评论