簡體   English   中英

NoClassDefFoundError僅某些設備,僅來自playstore? 這有可能嗎?

[英]NoClassDefFoundError only some devices, only from playstore? is this even possible?

這個問題就像一個邏輯難題。 你被警告了。

我正在與其他應用程序集成的庫中工作。 一個人抱怨說,他們只看到部分用戶的崩潰:

java.lang.NoClassDefFoundError: com.somecompany.subpackage.SomeAsyncTaskSubclass
at com.somecompany.subpackage.ClassA.instantiateInstanceOfSomeAsyncTaskSubclass(ClassA.java:105)
at
com.somecompany.subpackage.Blah.loadsomedata(MyController.java:180)
at com.somecompany.subpackage.Blah.loadsomemoredata(MyController.java:164)
at com.somecompany.subpackage.SomeView.loadsomemoredata(SomeView.java:213)
com.other.blah.Blah.preloadstuff(Blah.java:118)
at
com.other.blah.Controller.loadSomething(Controller.java:100)
at
com.other.blah.Controller.preloadSomething(Controller.java:144)
at org.cocos2dx.lib.Cocos2dxRenderer.nativeRender(Native Method)
at org.cocos2dx.lib.Cocos2dxRenderer.onDrawFrame(Cocos2dxRenderer.java:94)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1332)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)

發生崩潰的代碼行位於:

public class ClassA {
    public void instantiateInstanceOfSomeAsyncTaskSubclass(){
        SomeAsyncTaskSubclass crashHere = new SomeAsyncTaskSubclass(); //<--- this is where it crashes
    }
}

在同一個包裝中,有...

class SomeAsyncTaskSubclass extends AsyncTask<String, Void, SomeCustomObject> {
// some code here...
}

這是我被告知或我知道的:

  1. 此崩潰僅發生在某些用戶上。 (但基於Google Play崩潰報告。那是不准確嗎?還是樣本生成太慢?)

  2. 即使使用已簽名的版本,開發人員也無法在內部重現此錯誤。 (我檢查了簽名的構建並對其進行了刪除處理,以查看該類存在於src中,因此我相信他)

  3. 但是當該應用程序在Play商店中上線並且人們下載了他的新版本時,他突然看到了一些人的崩潰報告,據信主要是設備2.3.x,盡管尚未證實)

  4. 他聲稱自己已更新為“ api 17”。 當人們這么說時,是指建立目標17嗎? 還是人們意味着要更新到ADT 17? 因為我知道ADT會處理lib / libs文件夾問題。

  5. 他似乎正在使用日食。

  6. 他正在通過執行handler.post()從Android的cocos2d-x調用我的代碼

這怎么可能?

我對為什么只有部分用戶看到NoClassDefFoundError感到困惑? 那是一個巨大的Google Play崩潰報告問題嗎? 例如,所有用戶都看到了此問題,但隨后Google Play說只有部分用戶看到了此問題? (我尚未與開發人員進行驗證,但是可以肯定地說,他通過從Play商店下載實時版本進行了測試,並且他沒有看到任何錯誤,並且該代碼段運行得很好)。

據我了解, NoClassDefFoundError僅在通過三個類加載器之一存在該類時出現,但是在運行時,沒有一個類加載器找不到特定的類。

這是一個保衛問題嗎? 我已經了解到proguard僅在發布時運行。

這是AsyncTask問題嗎? 我讀過AsyncTasks必須在UI線程上第一次實例化。 雖然,我不確定為什么會導致NoClassDefFoundError

有什么想法嗎?

導致NoClassDefFoundError出現在您的應用中的原因可能有多種,例如:

  • APK中包含超過65536個方法。 解決方案是啟用MultiDEX ,您可以按照此官方Android資源https://developer.android.com/studio/build/multidex#mdex-gradle
  • 在某些情況下,僅啟用MultiDEX是不夠的,您需要在主DEX文件中聲明一些類。 基本上,您只需要將缺少的類添加到文件中,如Dean Wild指出的那樣,它們會在應用程序啟動時加載。 這是因為有時構建工具在計算要添加的類時可能會遇到麻煩。 官方文檔: https : //developer.android.com/studio/build/multidex#keep
  • 如果您重寫了Application類以使用一些自定義代碼擴展它,則可能必須從MultiDexApplication類而不是從Application類繼承。
  • 在測試過程中,如果您使用MonitoringInstrumentationAndroidJUnitRunner工具,則不會發生NoClassDefFoundError ,但是您可能會得到它們。 如果是這種情況,則只需在onCreate()方法中添加以下代碼:

onCreate()方法的內容:

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
}

根據SDK ICS或更高版本構建項目。

他們已經在ICS +中自動加載了AsyncTask。 這就是問題。

啟用multidex對我來說會引起這個問題。 我需要multidex,因為我包括了整個Google Play服務庫。 通過僅包含所需的組件(在我的情況下為GCM),我可以禁用multidex並防止出現此問題。

我知道這不是一個真正的解決辦法,但我認為,如果可能的話,應該避免閱讀多義詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM