Android runtime

本文详细介绍了AndroidRuntime组件的作用及启动流程,包括创建信号管道、设置系统根目录、启动虚拟机、注册Native函数等步骤。

Class Overview

Allows Java applications to interface with the environment in which they are running. Applications can not create an instance of this class, but they can get a singleton instance by invoking getRuntime().

     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的线程),然后释放所有相关的资源。

 

对Java开发者而言,最有关系的信息是Android Runtime:

1、Android包括一组核心库(core libraries),他提供了 Java 编程语言的核心库中大多数可用功能。

2、每个 Android 应用程序运行在自己的进程上,有自己的 Dalvik 虚拟机实例。 Dalvik这样是为了使一个设备可以有效地运行多个虚拟机。 Dalvik VM 以被优化占用最小内存的Dalvik Executable (.dex)格式执行文件。VM 是基于寄存器的,并通过一个 Java 语言编译器的编译来运行,而这个Java编译器已经被内置的"dx"工具转成.dex 格式。

3、Dalvik MicrosoftVM 依赖 Linux 内核获得基本功能,如线程处理和低层内存管理。

 


<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、付费专栏及课程。

余额充值