一開始需要說明的是,Google之所以要將一些API隱藏(指加上@hide標記的public類、方法或常量)是有原因的。其中很大的原因就是Android系統本身還在不斷的進化發展中。從1.0、1.1到現在即將問世的Android 2.3.4。 這些隱藏的API本身可能是不穩定的,所以,使用隱藏API,意味著程式更差的相容性。
如果要我給出建議的話,最好還是不要使用隱藏的API。不過有時為了實現Android應用某些特殊的功能或者效果,隱藏的API往往能發揮意想不到的作用。這些API具體能做些什麼事,我就不在這裡舉例了。正好,如果你不知道隱藏API能做什麼的話,那麼還是儘早放棄使用它們吧……
不想長篇大論,直接進入正題吧。使用隱藏API主要有兩種辦法:一是我在《Java反射機制的學習》一文中提到的反射的方法得到隱藏API;二是使用源碼編譯時間產生的全編譯的jar包classes.jar。
使用反射的方式,在這裡就不詳細介紹了,具體見《Java反射機制的學習》。利用反射機制使用隱藏API的方法的優點是靈活,能夠在不相容的系統捕獲異常,而使程式不至於崩潰;缺點是過程太繁雜,而且對於隱藏類的繼承等很難實現。如果需要大量使用隱藏API,使用反射無疑會讓程式員很煩的。
這篇文章主要要介紹的就是通過匯入全編譯的classes.jar包,來實現對隱藏API的使用。這種方法實現簡單,程式員編程也簡單,就像是那些隱藏的API在SDK中變得可見了一樣。它的缺點就是相容性問題,希望使用者引起重視,在使用時考慮清楚。
編譯Android架構源碼後,在源碼路徑下會產生out檔案夾,在這個檔案夾下的out"target"common"obj"JAVA_LIBRARIES"framework_intermediates"路徑下,會產生全編譯的jar庫classes.jar。你需要做的就是將這個jar庫匯入到你的工程中。
在匯入classes.jar過程中,有可能會出現兩個問題(我是使用eclipse開發環境的,所以僅對此環境會遇到的問題進行說明)。
問題一是按匯入其他jar的方式匯入此jar庫,發現編譯很慢,有時甚至無法編譯成功,eclipse崩潰或者提示“java.lang.OutOfMemoryError: Java Heap Space”錯誤。這個問題,可能是由於jar太大的原因吧,網上說改eclipse.ini裡的參數,個人試了下,似乎沒有什麼作用。我的做法是在eclipse中建立自訂的library,然後將classes.jar放在library中。Android工程添加library,就像使用SDK一樣。這樣可以很好地解決這個問題。具體如何建立自訂的library我就不詳述了,不知道的朋友自己搜尋下或者摸索下,很簡單的。
問題二是已經正確匯入了jar庫,卻發現還是找不到隱藏的API。這個的原因是Build class path order不對,具體說就是android.jar和classes.jar的匯入順序不對。應該將classes.jar的順序放在android.jar之前,具體調節Build class path order的地方就在properties -> Java Build Path -> Order and Export.。
成功解決這兩個問題之後,相信你就可以正常使用Android隱藏API了。