您好,登錄后才能下訂單哦!
內部API和隱藏代碼的例子
在翻閱Android源碼的時候有時會遇到一些奇怪的代碼,例如下面這個:
//注:這段代碼在源碼android/provider/Telephony.java中。 import android.util.Patterns; import com.android.internal.telephony.SmsApplication; import java.util.HashSet; //……
還有這種(下面這段摘自同一文件):
/** * //comments... * @hide */ public static boolean isOutgoingFolder(int messageType) { //method body... }
這些代碼是什么意思呢?
內部API:android.internal.*
實際上,在SDK的source目錄,是找不到所謂android.internal包的。該包下的所有類的源碼都是不可見的,僅供系統內部使用。一般而言,在這個包下的都是Android系統核心功能,不對外開放接口和源碼。
隱藏代碼:@hide
與內部API不同,使用@hide標記的一般并非整個文件或外部類,而一般是內部類、函數或字段,姑且籠統稱其為隱藏代碼(我個人認為不對外開放的代碼不應該叫做Application Programming Interface)。這些隱藏代碼在源碼中可見,但并不能直接引用。
內部API和隱藏API的不同
從Google的目的看,使用兩種不同的方式,是有自己的考慮的,內部API屬于系統核心部分,不計劃對外開放。系統的核心功能會通過Framework提供一定的訪問,但并不需要公布其代碼。
而隱藏API則更多是為了考慮Android不同版本間的安全性。很有可能一個正在開發的、并不穩定的Feature被隱藏,直到穩定、成熟后再開放。Android在API Level5之后才出現Bluetooth API,但實際上更早的源碼中就已經有這部分代碼,只不過被@hide隱藏起來了。可以想見,如果某個應用程序依賴于API 4的Bluetooth API,很有可能在Android2.0(API Level5)的機器上出現不可預料的問題。
當然,內部代碼也有可能發生這樣的變動,但由于它本身對開發者來說就是個黑盒子,因此它內部的變動我們大可放心交給Google啦。
開發者眼中的不同
目前一般Android開發者使用Eclispe ADT插件進行開發,對于一般的開發者來說,內部API和隱藏代碼沒什么區別,都沒法用嘛。不過,總有那么一些人出于各種目的,希望使用這些API。
在開發的時候我們使用最多的庫就是android.jar包,該包下有我們用的幾乎所有功能【不排除會使用到android-support-v4.jar】。在該jar包中,我們可以看到,所有的android.internal內的類都不見了,同樣,類中也不含有源碼中標記為@hide的字段、函數和類。
但是在應用程序真正在設備上運行的時候,系統加載的是framework.jar包,該包未被裁剪,包含所有內部API和隱藏代碼。因此開發者可以通過反射機制進行調用。
此外,在使用Eclipse ADT 的時候,ADT插件專門對android.internal包做了訪問規則限制。因此,即使將項目下的android.jar替換成未裁剪的android.jar包,也是很難使用內部API的。
不推薦使用內部API和隱藏代碼
如前所述,理論上,開發者盡可以使用反射機制進行對這些功能的調用。但是,必須面對以下問題:
使用這樣的功能會使程序的代碼變得晦澀難懂,難于維護;
不同廠家的Framework包可能略有差別,難以兼顧多種設備;
Android版本升級后,其內部功能或者隱藏代碼可能發生較大的變化,因此使用了這些代碼的程序無法確保向后兼容。
參考資料:使用內部(com.android.internal)和隱藏(@hide)API[第1部分,介紹]
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。