由于 java.lang.NoClassDefFoundError 解析失败:Landroid/widget/Magnifier$Builder;

Caused by java.lang.NoClassDefFoundError Failed resolution of: Landroid/widget/Magnifier$Builder;

我在某些设备上遇到此错误,但在其他设备上一切正常。

Caused by java.lang.ClassNotFoundException Didn't find class "android.widget.Magnifier$Builder" on path: DexPathList[[zip file "/data/app/android.myproject-y_q4TlFhfWP/base.apk"], nativeLibraryDirectories=[/data/app/android.myproject-y_q4TlFhfWP/lib/arm64, /data/app/android.myproject-y_q4TlFhfWPN/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]

我使用自定义视图,在初始化放大镜时崩溃

 class CustomView : FrameLayout {
 private var magnifier: Magnifier? = null

constructor(context: Context) : super(context) {
    init(context)
}

constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
    init(context)
}

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
    context,
    attrs,
    defStyleAttr
) {
    init(context)
}

private fun init(context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        var magnifier = Magnifier.Builder(this)
            .setInitialZoom(2f)
            .build()
    }
}

可能您的某些测试设备的 api 版本低于 Q(Api 29)

根据文档; https://developer.android.com/reference/android/widget/Magnifier.Builder 在 api 版本 29(Q) 中添加了放大镜生成器。因此,要么将您的代码更改为

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

或删除相等性

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {

并确保您的测试设备 api 版本至少为 29(Q)。