2015-09-06 55 views
1

我的APK對於很大的(對很多方法),並且我試圖把一些庫類(例如android/support/v4)放到framework.jar中。我拉framework.jar,提取classes.dex,baksmali,然後添加然後android/support/v4,smali,建立一個新的framework.jar,簽名,推到設備,並重新啓動設備。不幸的是我得到一些奇怪的dalvikvm驗證錯誤:把額外的庫代碼放到framework.jar

FATAL EXCEPTION: main 
Process: com.example.myapp, PID: 3792 
java.lang.VerifyError: android/support/v4/view/ViewPager 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at dalvik.system.NativeStart.main(Native Method) 
/system/framework/framework2.jar odex has stale dependencies 
/system/framework/telephony-common.jar odex has stale dependencies 
/system/framework/voip-common.jar odex has stale dependencies 
/system/framework/mms-common.jar odex has stale dependencies 
/system/framework/android.policy.jar odex has stale dependencies 
/system/framework/services.jar odex has stale dependencies 
/system/framework/apache-xml.jar odex has stale dependencies 
/system/framework/webviewchromium.jar odex has stale dependencies 
/system/framework/am.jar odex has stale dependencies 
VFY: unable to resolve virtual method 283: Landroid/content/Context 
.getCodeCacheDir()Ljava/io/File 
/system/framework/framework2.jar odex has stale dependencies 
/system/framework/telephony-common.jar odex has stale dependencies 
/system/framework/voip-common.jar odex has stale dependencies 
/system/framework/mms-common.jar odex has stale dependencies 
/system/framework/android.policy.jar odex has stale dependencies 
/system/framework/services.jar odex has stale dependencies 
/system/framework/apache-xml.jar odex has stale dependencies 
/system/framework/webviewchromium.jar odex has stale dependencies 
DexOpt: resolve class illegal access: Landroid/support/v4/app/BackStackRecord$2 
-> Landroid/support/v4/app/BackStackRecord 
DexOpt: resolve class illegal access: Landroid/support/v4/app/BackStackRecord$3 
-> Landroid/support/v4/app/BackStackRecord 

任何想法我做錯了什麼?我只是使用一個設備進行測試。所以我不想讓我的apk在任何其他設備上工作。

我認爲這是關係到:

Is it necessary to keep classes of the same package in the same dex while using multiple dex files

但是我不明白的框架是如何工作的,因爲它包含是自己單獨的DEX文件。

+1

雖然這是一個有趣的方法,但更簡單的方法是隻使用多個dex。 Gradle非常簡單。 –

+0

我必須在Android上完成<5 –

+0

它在API Level 15及更高版本上完美運行。由於我從未嘗試過,因此無法確定早期版本。 –

回答

2

可能是因爲使用支持庫的應用程序(除了你的,我猜)現在將有兩個來源的支持庫類:一個來自框架,另一個來自他們的應用程序。

所以你這個樣子,哪裏(如果我正確地閱讀本錯誤日誌)的內部類是不允許訪問其父的錯誤:

DexOpt: resolve class illegal access: 
Landroid/support/v4/app/BackStackRecord$3 
-> Landroid/support/v4/app/BackStackRecord 

如果我們假設BackStackRecord$3BackStackRecord類最終被從兩個不同的來源引入,這是合理的:BackStackRecord不是公共的(it's package-protected),所以它的包之外的類(顯然包括「具有相同包名但源不同的類)不是允許訪問。或者,也許內部班正試圖訪問一個私人領域,並被拒絕訪問?無論如何,這樣的事情。

可能如果您重新命名所有添加到框架中的類(以及它們對彼此所做的所有引用),但是......就像問題註釋所說的那樣,您應該使用multidex來代替。

+0

再次,我想指出,這是*純粹的猜測*。我沒有實際的證據或具體的分析來支持這一點。 *請*不要鏈接這個答案作爲任何東西的授權來源。 :P –