1. 程式人生 > 其它 >Binary XML file line #2: Error inflating class <unknown>

Binary XML file line #2: Error inflating class <unknown>

技術標籤:原始碼分析安卓開發errors

1.背景

之前一直用的8.0版本模擬器沒啥問題,偶然間切換到了android 6.0 版本的模擬器,發現我的應用崩了。

2.錯誤堆疊

01-26 02:26:28.670 3682-3682/pers.hl.library.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: pers.hl.library.debug, PID: 3682
    java.lang.RuntimeException: Unable to start activity ComponentInfo{pers.hl.library.debug/pers.hl.module_login.LoginActivity}: java.lang.reflect.InvocationTargetException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at pers.hl.common.base.BaseVBActivity.initRootView(BaseVBActivity.kt:48)
        at pers.hl.common.base.BaseVBActivity.init(BaseVBActivity.kt:32)
        at pers.hl.common.base.BaseVBActivity.onCreate(BaseVBActivity.kt:27)
        at pers.hl.common.base.BaseVBVMActivity.onCreate(BaseVBVMActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>
        at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:70)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:64)
        at java.lang.reflect.Method.invoke(Native Method)
        at pers.hl.common.base.BaseVBActivity.initRootView(BaseVBActivity.kt:48)
        at pers.hl.common.base.BaseVBActivity.init(BaseVBActivity.kt:32)
        at pers.hl.common.base.BaseVBActivity.onCreate(BaseVBActivity.kt:27)
        at pers.hl.common.base.BaseVBVMActivity.onCreate(BaseVBVMActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
        at android.view.LayoutInflater.createView(LayoutInflater.java:645)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:70)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:64)
        at java.lang.reflect.Method.invoke(Native Method)
        at pers.hl.common.base.BaseVBActivity.initRootView(BaseVBActivity.kt:48)
        at pers.hl.common.base.BaseVBActivity.init(BaseVBActivity.kt:32)
        at pers.hl.common.base.BaseVBActivity.onCreate(BaseVBActivity.kt:27)
        at pers.hl.common.base.BaseVBVMActivity.onCreate(BaseVBVMActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at android.view.LayoutInflater.createView(LayoutInflater.java:619)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:70)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:64)
        at java.lang.reflect.Method.invoke(Native Method)
        at pers.hl.common.base.BaseVBActivity.initRootView(BaseVBActivity.kt:48)
        at pers.hl.common.base.BaseVBActivity.init(BaseVBActivity.kt:32)
        at pers.hl.common.base.BaseVBActivity.onCreate(BaseVBActivity.kt:27)
        at pers.hl.common.base.BaseVBVMActivity.onCreate(BaseVBVMActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.OutOfMemoryError: Failed to allocate a 98724108 byte allocation with 1951802 free bytes and 93MB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
        at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635)
        at android.content.res.Resources.loadDrawable(Resources.java:2540)
        at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
        at android.view.View.<init>(View.java:3948)
        at android.view.ViewGroup.<init>(ViewGroup.java:573)
        at android.view.ViewGroup.<init>(ViewGroup.java:569)
        at android.view.ViewGroup.<init>(ViewGroup.java:565)
        at androidx.constraintlayout.widget.ConstraintLayout.<init>(ConstraintLayout.java:568)
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at android.view.LayoutInflater.createView(LayoutInflater.java:619)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:70)
        at pers.hl.module_login.databinding.LoginActivityLoginBinding.inflate(LoginActivityLoginBinding.java:64)
        at java.lang.reflect.Method.invoke(Native Method)
        at pers.hl.common.base.BaseVBActivity.initRootView(BaseVBActivity.kt:48)
        at pers.hl.common.base.BaseVBActivity.init(BaseVBActivity.kt:32)
        at pers.hl.common.base.BaseVBActivity.onCreate(BaseVBActivity.kt:27)
        at pers.hl.common.base.BaseVBVMActivity.onCreate(BaseVBVMActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

3.分析

開始就是一頓花裡胡哨的瞎分析,因為我這裡是反射呼叫ViewBinding的inflate方法,就去各種改程式碼,然並卵。。。

簡單檢視後,抓住一句重要的資訊:Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>

這意思可不就是在我的頁面佈局xml檔案裡面第二行報錯麼,於是打開了我的佈局,第二行就是個ConstraintLayout呀,沒啥特別的。

又著急了,谷哥度娘問了一圈,多方查閱資料,有告訴我是啥drawable資源沒放對位置的原因,有說是自定義view沒寫對的原因,還有啥刪除v24的資料夾之類的。最後就把此佈局只保留一個根layout,然,無果。。。

實在想不通啊,又到群裡找大佬幫忙,可惜大佬沒理我。

最後冷靜下來,仔細看了看佈局,這不起眼的一行引起了我的注意:

點開一看,這是一個.jpg格式的圖片,我放在drawable下面的。

4.解決

結合上面報錯最後一個原因跟loadDrawable有點關係,抱著試試看的態度刪除此行。

然後,好了,神奇的Android世界。。

5.原理

最後還是沒想通是為啥,自己分析可能是不同版本的inflate方法差異,想去看原始碼,時間不允許,就留到下次吧。