使用internal(com.android.internal)和hidden(@hide)APIs – Part 1

來源:互聯網
上載者:User

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。

Internalhidden 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 = 黑盒;

Internalhidden 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外掛程式顯式禁止了。

不通過反射使用internalhidden 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.