xirihanlin 2011.06.02
原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/
Android有兩種類型的API是不能經由SDK訪問的。
第一種是位於com.android.internal包中的API。我將稱之為internal API。第二種API類型是一系列被標記為@hide屬性的類和方法。從嚴格意義上來講,這不是一個單一的API,而是一組小的被隱藏的API,但我仍將其假設為一種API,並稱之為hidden API。
Hidden API 例子
你可以查看一下android的源碼,並能找到一些變數、函數和類等,都被@hide屬性標記了。
下面的例子就是在WifiManager(API 10源碼)中隱藏的變數。
另一個例子是在WifiManager(API 10源碼)中隱藏了setWifiApEnabled函數。
因此,只要你看到@hide屬性,那你看到的就是hidden API。
Internal和hidden API的區別
Hidden API之所以被隱藏,是想阻止開發人員使用SDK中那些未完成或不穩定的部分(介面或架構)。舉個例子,Bluetooth API在API 5(Android 2.0)上才開放;在API 3 和4上都是用@hide屬性隱藏了。當這些API被驗證和清理後,Google的開發人員會移除@hide屬性,並讓其在API 5官方化。很多地方在API 4 和5之間發生了變化。如果你的程式依賴某些隱藏的API,當其部署到新的平台上時,就有可能陷入困境。
對於internal API來說,從來都沒有計劃將其開放出來。它就是Android的“內部廚房”,對開發人員來說,應該將其視作黑盒。凡事都會有變化的。如果你依賴某些internal API,也有可能在新的Android release上,這些internal API發生變化,從而令你失望。
總結一下區別:
Hidden API = 進行中的工作;
Internal API = 黑盒;
Internal和hidden API的編譯時間 vs. 運行時
當你使用Android SDK進行開發的時候,你引用了一個非常重要的jar檔案——android.jar。它位於Android SDK平台的檔案夾中(SDK_DIR/platforms/platform-X/android.jar,其中,X表示API等級)。這個android.jar移掉了com.android.internal包中所有的類,也移掉了所有標記有@hide的類,枚舉,欄位和方法。
但當你在裝置上啟動應用程式時,它將載入framework.jar(簡單來說,它和android.jar等同),而其未移掉internal API和hidden API。(但它對開發人員來說,並不能友好地訪問,因此,我將向大家展示不通過反射如何使用這些API)。
關於internal API,還有一件事需要說明。Eclipse的ADT外掛程式增加了一個額外的規則,那就是禁止使用com.android.internal包中的任何東西。所以,即便是我們可以拿到最原始的android.jar(未刪減版),也沒有輕鬆的辦法通過Eclipse使用這些internal API。
你可以親自檢查一下。建立一個新的Android工程(或者使用已有的)。查看一下它引用的類庫(右擊project Properties –> Java Build Path –> Libraries)。
重要的總結:internal和hidden API在SDK中是按照一樣的方式處理的(都從android.jar中移除了),但internal API更慘的是,還被Eclipse的ADT外掛程式顯式禁止了。
不通過反射使用internal和hidden API
這些文章的終極目標是讓開發人員能夠不通過反射使用Internal和Hidden API。如果你完成了接下來部分中描述的步驟,你將能使用這些Internal和Hidden API,如同公開的API。你不再需要使用反射。
註:如果你正在使用這些非公開的API,你必須知道,你的程式有著極大的風險。基本上,無法保證在下一次的Android OS更新時,這些API不被破壞,也無法保證不同的電訊廠商有著一致的行為。你自己決定吧。
接下來有三個情境:
1. Internal 和hidden API都可用(情境A)
2. 只Hidden API可用(情境B)
3. 只Internal API可用(情境C)
情境A是B、C的總和。情境B是最簡單的一個(不需要對Eclipse的ADT修改)。
情境A:閱讀Part1, 2, 3, 4, 5
情境B:閱讀Part1, 2, 3, 5
情境C:閱讀Part1, 2, 3, 4, 5