开发问题及解决 E/AndroidRuntime(15377): Caused by: java.lang.InstantiationException: can't instantiate clas

本文讨论了在使用IntentService时未定义无参构造函数导致的错误,并提供了正确的构造函数实现方式及使用示例。

在使用IntentService时,没有定义无参的构造函数。

如下所示。


代码段1:

public class CustomIntentService extends IntentService {
	
	private static final String TAG = CustomIntentService.class.getSimpleName();
	static String s = "test";
	
//	public CustomIntentService() {
//		super("CustomIntentService");
//	}

	public CustomIntentService(String name) {
		super(name);
		Log.i(TAG, "CustomIntentService");
	}

	@Override
	public void setIntentRedelivery(boolean enabled) {
		super.setIntentRedelivery(enabled);
		Log.i(TAG, "setIntentRedelivery");
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Log.i(TAG, "onCreate");
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.i(TAG, "onStart");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return super.onStartCommand(intent, flags, startId);
	}
}


这样我们用以下方式使用IntentService的时,就会报如标题所示的错误。

代码段2:

		Intent startServiceIntent1 = new Intent();
		startServiceIntent1.setClass(this, CustomIntentService.class);
		Bundle bundle = new Bundle();
		bundle.putString("param", "oper1");
		startServiceIntent1.putExtras(bundle);  
		startService(startServiceIntent1);

解决方法就是将代码段1中被注释掉的部分放开。




12-20 17:32:28.483 13148 13148 E AndroidRuntime: FATAL EXCEPTION: main 12-20 17:32:28.483 13148 13148 E AndroidRuntime: Process: com.android.systemui, PID: 13148 12-20 17:32:28.483 13148 13148 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate application com.android.systemui.SystemUIApplication package com.android.systemui: java.lang.RuntimeException: Couldn't call constructor 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1504) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1425) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7835) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2566) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:311) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.os.Looper.loop(Looper.java:408) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9137) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:627) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:970) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: Caused by: java.lang.RuntimeException: Couldn't call constructor 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at androidx.core.app.AppComponentFactory.instantiateApplicationCompat(AppComponentFactory.java:116) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at com.android.systemui.SystemUIAppComponentFactoryBase.instantiateApplicationCompat(SystemUIAppComponentFactoryBase.kt:82) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at androidx.core.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:61) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.Instrumentation.newApplication(Instrumentation.java:1361) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1497) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: ... 11 more 12-20 17:32:28.483 13148 13148 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at java.lang.reflect.Constructor.newInstance0(Native Method) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at androidx.core.app.AppComponentFactory.instantiateApplicationCompat(AppComponentFactory.java:114) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: ... 15 more 12-20 17:32:28.483 13148 13148 E AndroidRuntime: Caused by: java.lang.NoSuchMethodError: No static method registerWithPerfetto()V in class Landroid/os/Trace; or its super classes (declaration of 'android.os.Trace' appears in /system/framework/framework.jar!classes3.dex) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: at com.android.systemui.SystemUIApplication.<init>(SystemUIApplication.java:99) 12-20 17:32:28.483 13148 13148 E AndroidRuntime: ... 18 more 什么意思
最新发布
12-23
你提供的日志是一个 **Android 系统级崩溃(Crash)**,发生在 `com.android.systemui` 进程启动时。我们来逐行分析并解释它的含义。 --- ## ✅ 总体结论: > ❌ **SystemUI 启动失败**,原因是: > > ```text > Caused by: java.lang.NoSuchMethodError: No static method registerWithPerfetto()V in class Landroid/os/Trace; > ``` > > 即:**代码调用了 `Trace.registerWithPerfetto()` 方法,但当前系统框架中没有这个方法**。 这通常出现在 **ROM 定制、AOSP 编译不匹配或 SystemUI 与 framework 不兼容** 的场景中。 --- ## 🧩 日志逐层解析 ```log FATAL EXCEPTION: main Process: com.android.systemui, PID: 13148 java.lang.RuntimeException: Unable to instantiate application com.android.systemui.SystemUIApplication ``` - 主线程发生致命异常。 - 应用是 `com.android.systemui`,即 Android 的状态栏、导航栏、通知面板等 UI 组件的宿主进程。 - 错误发生在创建 `SystemUIApplication` 实例时。 --- ### 异常链路: #### 1. 根本原因(Cause by): ```log Caused by: java.lang.NoSuchMethodError: No static method registerWithPerfetto()V in class Landroid/os/Trace; ``` 📌 关键点: - `SystemUIApplication.<init>` 构造函数试图调用一个静态方法: ```java android.os.Trace.registerWithPerfetto(); ``` - 但当前运行的 Android 框架(framework.jar)里 **根本没有这个方法**。 - 所以 JVM 抛出 `NoSuchMethodError` —— 方法不存在! > 🔥 这不是编译时报错,而是 **运行时找不到方法**,说明 **SystemUI 是基于新版 SDK 编译的,但运行在旧版系统上**。 --- #### 2. 哪里出的问题? ```log at com.android.systemui.SystemUIApplication.<init>(SystemUIApplication.java:99) ``` 定位到源码第 99 行类似这样: ```java public class SystemUIApplication extends Application { public SystemUIApplication() { Trace.registerWithPerfetto(); // ←← 就是这一行炸了! } } ``` 而 `registerWithPerfetto()` 是什么? --- ## 🔍 背景知识:`Trace.registerWithPerfetto()` 是什么? 这是 Android 在 **较新版本(如 Android 12+ 或内部实验性构建)** 中引入的一个用于性能追踪的方法。 | 属性 | 内容 | |------|------| | 类 | `android.os.Trace` | | 方法 | `public static native void registerWithPerfetto()` | | 功能 | 向 [Perfetto](https://perfetto.dev/) 性能分析系统注册当前进程,用于跟踪 SystemUI 的启动耗时、渲染延迟等 | | 引入时间 | AOSP 提交大约在 Android 12 ~ 13 之间(部分设备厂商提前合入) | ⚠️ 但它并不是所有 Android 版本都有的公共 API! --- ## 📦 为什么会“方法不存在”? ### 最可能的原因有以下几种: | 原因 | 解释 | |------|------| | ✅ **1. SystemUI 使用了高版本 SDK 编译,刷到了低版本 ROM 上** | 比如你在 Pixel 设备上编译了 Android 14 的 SystemUI,刷进 Android 12 的手机,就会缺少新方法 | | ✅ **2. 修改过 SystemUI 源码,手动加了 `registerWithPerfetto()`,但目标设备不支持** | 开发调试时常见错误 | | ✅ **3. 刷机包不完整 / 分区损坏(system.img 中 framework 和 systemui 版本不一致)** | 导致 `framework.jar` 没更新,但 `SystemUI.apk` 更新了 | --- ## 💡 如何验证这个问题? 你可以通过 ADB 查看当前系统的 `android.os.Trace` 类是否包含该方法: ```bash adb shell dumpsys package android | grep -A 20 "android.os.Trace" ``` 或者更直接地反编译 `/system/framework/framework.jar` 并检查 `Trace.class` 是否有 `registerWithPerfetto()` 方法。 也可以用以下命令查看当前 Android 版本: ```bash adb shell getprop ro.build.version.release ``` - 如果是 Android 11 或更早 → 几乎肯定没有这个方法 - Android 12~13 → 部分厂商有,AOSP 可能有 - Android 14+ → 更大概率存在 --- ## ✅ 解决方案 ### ✅ 方案一:【推荐】降级编译 SystemUI —— 使用目标设备对应的 SDK 确保你的 SystemUI 是用和设备系统 **相同版本的 AOSP 源码** 编译的。 例如: - 设备是 Android 12 → 使用 `android-12.0.0_r1` 分支编译 - 不要使用 Android 14 的源码去编译 SystemUI 刷入 Android 12 设备 --- ### ✅ 方案二:移除对 `registerWithPerfetto()` 的调用 如果你自己修改了 SystemUI 源码,可以注释掉这行代码: ```java // SystemUIApplication.java public SystemUIApplication() { // Trace.registerWithPerfetto(); // ← 注释或删除这一行 } ``` ✅ 对功能无影响(只是少了一个性能监控注册),可正常启动。 --- ### ✅ 方案三:同步升级整个系统框架(Framework) 如果你坚持要用新版 SystemUI,那就必须同时替换: - `/system/framework/framework.jar` - `/system/priv-app/SystemUI/SystemUI.apk` ⚠️ 但这样做可能导致其他应用崩溃或系统不稳定,需谨慎操作。 --- ### ✅ 方案四:检查刷机完整性 如果是刷机后出现此问题,请确认: - 是否只刷了 `systemui.img` 而没刷 `system.img`? - 是否使用了跨大版本的补丁包? 👉 建议完整刷入对应版本的全包固件。 --- ## 🛠️ 如何预防? | 措施 | 说明 | |------|------| | 编译时使用正确的 AOSP 分支 | 如 `android-12.0.0_r1` | | 不随意合并高版本特性到低版本 ROM | 特别是 native 层接口 | | 使用 `@UnsupportedAppUsage` 或反射处理非公开 API | 避免硬引用 | --- ## ✅ 总结 | 问题 | 回答 | |------|------| | ❓ 这个 crash 是什么意思? | `SystemUI` 启动时调用了不存在的方法 `Trace.registerWithPerfetto()` | | ❓ 为什么方法不存在? | 当前系统 framework 不支持该 API(通常是版本太低) | | ❓ 是严重问题吗? | ✅ 是!会导致 SystemUI 无法启动 → 状态栏、锁屏、导航栏全部消失 | | ❓ 如何解决? | ① 改用兼容版本编译;② 删除调用;③ 升级 framework | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值