一開始需要說明的是,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 (靜态變量)被隐藏掉了,是以在sdk中無法使用。在知道了原因之後,我們有幾種解決方案(強烈建議使用方法二):
方法一:自己将源代碼中的@hide去掉,然後編譯一個sdk來替換預設的sdk。
在linux上使用 make PRODUCT-sdk-sdk 指令,編譯一個新的sdk出來,注意編譯後其實我們不需要整個sdk,隻需要android.jar這個檔案替換掉sdk裡的android.jar,例如:筆者的sdk裡的jar對應的目錄為:
F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar
具體編譯sdk的方法是,在linux編譯環境下用指令make PRODUCT-sdk-sdk ,成功後,會有如下提示:
Package SDK: out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86.zip
我們進入到linux編譯環境的 out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86/platforms/android-2.2/目錄下可以看到android.jar 檔案。使用此檔案替換 F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar 即可。替換前記得備份
此方法較為麻煩,建議使用方法二
方法二:添加framework 編譯出來的classes.jar檔案到eclipse的build path
其實在編譯android的時候,我們将framework 編譯到一個臨時的jar包中了,這個jar包的路徑一般為:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
我們隻需要在linux上android源代碼目錄下使用make 指令即可生成此檔案。
由于這個jar檔案中的api 還沒有重新打包,裡面被@hide掉的api并沒有被去掉。是以我們依然能夠引用裡面被@hide的api。而sdk 中的android.jar檔案時重新打包生成的,其裡标記有@hide的api已經被去掉了。是以我們把 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar 拷貝到本地pc上。然後在工程中添加此jar包。
具體方法:
1 . 拷貝linux編譯生成的 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar到本機PC。
2,在eclipse的Android項目中,選擇項目屬性->Java Build Path->Libraries->Add Library->User Library->Next-> UserLibraries進入到User Libraries管理界面,點選New建立一個User Library,比如android_framework,點選Add Jars把Jar包加入到建立的User Library中,最後點選OK。
3.選擇項目屬性->Java Build Path->Order and Export,使用右面的“UP”鍵,把所建立的User Libraries移到Android SDK的上面。這樣做的意思就是優先使用classes.jar中的API,其次使用android.jar中的API。為什麼不直接使用classes.Jar?因為我在使用時發現,android.jar中有的東西classes.jar中沒有。