標籤:android style class blog code java
暫時主要討論以下幾點:
- Android引用外部包,報NoClassDefFoundError異常崩潰
- 同名包參考關聯性問題
- 程式表徵圖
- 9patch圖片素材
Android引用外部包,程式報java.lang.NoClassDefFoundError異常崩潰
在Android工程中,引用第三方jar包(尤其是經過本地編譯的),在Java代碼開發環境中正常編譯輸出,但到手機等裝置上運行時一旦運行到引用該包的代碼,立即異常崩潰,系統顯示進程意外停止提示視窗,LogCat報出異常資訊
dalvikvm Could not find class ‘引用包.類‘, referenced from method...
AndroidRuntime java.lang.NoClassDefFoundError: 引用包.類
開啟Console控制台視窗,Android監控頁中顯示異常資訊
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx
trouble processing:
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing 引用包/類.class
...while processing 引用包/類.class
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx 1 warning
出現這種錯誤的原因是,當前Android工程(API17 android4.2.2 ADT v21.1)預設使用的是jdk 1.6(JDK 6.0)編譯器,而引用的包編譯環境大於1.6(如1.7等),由於編譯出的位元組碼版本不一致,導致無法轉換成android虛擬機器dalvikvm可讀的位元組碼,因此引用的這個類包實際上並沒有被編譯到這次輸出的apk中,自然程式啟動並執行時候就找不到對應的類檔案了。
解決方案:
擷取引入包的原始碼工程,右擊工程菜單: Properties(屬性)->Java Compiler 視窗中可以選擇工程編譯使用的jdk版本,選擇1.6或1.5,點擊確定,重新編譯輸出jar包,匯入Android工程即可:
PS. Android工程本身是不支援更改jdk編譯版本的,如果嘗試更改至1.7的話,Console控制台將得到錯誤輸出資訊 Android requires compiler compliance level 5.0 or 6.0. Found ‘1.7‘ instead. Please use Android Tools > Fix Project Properties.
同名包參考關聯性問題
同時引入兩個同名jar包到工程,例如:
a.jar
|---wavky.wand.A
ab.jar
|---wavky.wand.A
|---wavky.wand.B extends wavky.wand.A
在javaSE中測試,使用 wavky.wand.B 類時,不會導致衝突,但只會引用第一個載入的jar包的類。
在下面的Order and Export介面中,可以調整相應類包的載入順序,調整 a.jar 到 ab.jar 上面,則類B繼承自 a.jar 中的類A(ab.jar中的類A不再被類載入器載入)。
但是,無法通過這種調整載入順序的方式替換JDK中的包類!
但在Android中,這種調整類載入順序的方式似乎已經不再起作用,所有外部參考的包自動被整合為一個單獨的Android Dependencies,而且跟javaSE的情況一樣,無法通過將Android Dependencies調整至頂層的方式替換Android SDK中的原生同名包類,如果外部參考與Android SDK內同名的包,則自動優先使用SDK內的jar包的類,而忽略外部參考。
程式表徵圖
- 根目錄\ic_launcher-web.png——512×512解析度表徵圖,用於google Play市場展示
- 根目錄\res\drawable-xdpi\ic_launcher.png——各像素密度下程式表徵圖
9patch圖片素材使用
- 除了左、上的擴充像素標記外,右、下的內容約制像素標記也必需塗上(且連續、不斷點),否則實際布局顯示效果將產生混亂、無法對齊等不可預測現象。
- 在eclipse(ADT)的XML布局設計介面上使用9patch的圖片,在API16/17以下的版本儲存編譯XML會導致IndexOutOfBoundsException
異常,但不影響相應版本系統的運行顯示效果,安裝使用API16/17 SDK編譯即可。相關資訊可參考:http://stackoverflow.com/questions/10757997/9-patch-not-working