Android Runtime

本文深入探讨了Android Runtime(ART)如何替代Dalvik虚拟机,ART的预编译机制使得应用启动和执行更为高效,耗电量降低且占用内存更小。介绍了ART在Android系统中的引入背景、启动流程及核心组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dalvik是Google公司自己设计用于Android平台的Java 虚拟机 。Dalvik 虚拟机 是Google等厂商合作开发的Android移动设备平台的核心组成部分之一

ART 的机制与 Dalvik 不同。在 Dalvik 下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在 ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这 样的话,应用的启动和执行都会变得更加快速。

Dalvik VM 效率并不是最高的。从 Android 4.4 开始,Google 开发者引进了新的 Android 运行环境 ART(意思就是 Android Runtime。Android 官方页面的介绍中,也将其称作新的虚拟机),以替代旧的 Dalvik VM。

ART处理应用程序执行的方式完全不同于Dalvik,运行起来更有效率、耗电更少、占的内存也更低。

 AndroidRuntime 是android中一个很重要的组成部分,引导系统(init)会调用到AndroidRuntime 中的start函数,在这个函数里完成启动android的一切工作。
 1、首先会创建一个信号管道(blockSigpipe),在这个函数中首先初始化了一个信号集(指针为mask),之后将SIGPIPE设置到这个信号集中,最后作一次信号集的遮罩(联级)。

 2、设置默认的系统根目录,如果在环境变量(ANDROID_ROOT)中有设置,则以设置为准,否则默认/system为系统根目录。

 3、调用startVm启动android 虚拟机。在这个函数里面主要是对一些参数的解析,和变量的初始化。如虚拟机的运行模式,是否检查dex校验和,设置默认语言类型等等。当这一切都准备就绪了,调用JNI_CreateJavaVM来创建运行JavaVM。如果运行失败,则直接释放所有相关资源,并退出。否则返回一个带入参数 JNIEnv* env。

 4、得到env之后,标志着javaVM已经可以初始化完毕了,此时开始注册android的native函数。当然此时不是真正的要将所有函数都注册进来,只不过是注册了一个用于注册的回调函数(javaCreateThreadEtc)而已。

 5、正式开始启动VM(该线程将一直运行下去,直到VM退出),此时是一个标准的C程序加载java的方法,首先将java的类(诸如com.x7.program.test这样形式的类)名转变为目录形式(com/x7/program/test),然后开始找这个文件是否存在。找到之后开始查找运行入口(main),一切OK之后调用这个入口函数,运行java程序。而这个关键的入口类就是com.android.internal.os.RuntimeInit。

 6、其实在第5步最后的时候线程是否退出已经取决于所调用的java程序了,如果退出,则运行到本步,分别调用DetachCurrentThread以及DestroyJavaVM的函数释放这个线程(运行Java的线程),然后释放所有相关的资源。

<think>嗯,用户问的是关于AndroidRuntime报错的原因及解决方法。首先,我需要回顾一下常见的AndroidRuntime错误类型,比如空指针异常、资源未找到、类未找到等。这些都是开发中经常遇到的问题。然后,用户可能是在实际开发中遇到了具体的错误日志,但问题中没有给出具体的错误信息,所以需要给出一般性的解决方案。 根据提供的引用,引用[1]提到的是编译时的系统校验问题,比如user版本关闭debug_fs,这可能和系统配置有关,但可能不直接关联Runtime错误。引用[2]是关于ADB连接超时的设置,这可能导致应用安装或启动失败,但属于环境配置问题。引用[3]处理的是Native库的加载问题,涉及ABI过滤,这可能和运行时找不到so文件有关,属于UnsatisfiedLinkError,确实属于AndroidRuntime错误的一种。 接下来需要组织答案的结构。用户需要原因和解决方案,所以分点列出常见原因,再对应解决方法。例如,空指针、资源问题、类加载问题、权限问题、ANR等。每个原因后面给出对应的解决步骤,可能包括代码示例或配置修改。 另外,用户可能还希望知道如何分析日志,比如查看Logcat,定位崩溃堆栈。需要提醒用户查看具体的错误信息和堆栈跟踪,因为不同错误原因解决方法不同。同时,根据引用[3],添加abiFilters可以解决某些Native库的问题,这应该包含在解决方案中。 可能还需要提到常见的工具使用,比如Android Studio的Logcat,或者处理ANR时的超时设置调整,如引用[2]中的ADB连接超时,但ANR通常是因为主线程阻塞,可能需要优化代码或使用后台线程。 最后,生成相关问题,帮助用户进一步排查问题,比如如何分析崩溃日志、ANR的解决方法、预防空指针的方法等。确保问题与用户查询相关,并且覆盖可能的扩展需求。</think>### AndroidRuntime报错原因及解决方案 AndroidRuntime报错是Android开发中常见的运行时异常,通常由代码逻辑错误、资源缺失或系统配置问题引发。以下是常见原因及解决方案: --- #### **一、常见原因** 1. **空指针异常(NullPointerException)** - 未初始化对象直接调用方法,例如:`TextView textView = null; textView.setText("test");` - 解决方案:检查对象初始化逻辑,使用`@Nullable`/`@NonNull`注解辅助排查[^3]。 2. **资源未找到(ResourcesNotFoundException)** - XML布局文件或资源ID引用错误,如`findViewById(R.id.missing_id)`。 - 解决方案:清理并重新构建项目(Build → Clean Project → Rebuild Project)。 3. **类未找到(ClassNotFoundException)** - 动态加载类时路径错误或未添加依赖库。 - 解决方案:检查Gradle依赖配置,确保模块已正确引入。 4. **权限问题(SecurityException)** - 未在`AndroidManifest.xml`中声明权限(如相机、存储权限)。 - 解决方案:添加所需权限声明,例如: ```xml <uses-permission android:name="android.permission.CAMERA"/> ``` 5. **ANR(Application Not Responding)** - 主线程执行耗时操作导致界面卡死。 - 解决方案:将耗时任务移至子线程,使用`AsyncTask`或`Coroutine`[^2]。 --- #### **二、通用排查步骤** 1. **查看Logcat日志** - 在Android Studio中打开Logcat,过滤`AndroidRuntime`关键字,定位崩溃堆栈。 - 示例错误日志: ``` Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(...) ``` 2. **检查代码上下文** - 根据日志中的行号(如`MainActivity.java:32`)检查对应代码逻辑。 3. **兼容性处理** - 针对Native库加载失败(如`UnsatisfiedLinkError`),在`build.gradle`中限制ABI类型: ```gradle android { defaultConfig { ndk { abiFilters "armeabi-v7a", "x86" } } } ``` 引用自。 --- #### **三、示例代码修正** ```java // 修正空指针问题 TextView textView = findViewById(R.id.text_view); if (textView != null) { textView.setText("Safe Usage"); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值