Android開發中,時常要去查看源碼,咱們會發現源碼裏面有些方法是加上了 @hide ,或者 {@hide} 註解的,就像下面這 2 個方法。java
(代碼截取自:android.os.storage.StorageManager.java)
android
那麼這兩個註解有什麼用處呢?ide
在說這兩個註解標記以前,首先咱們要知道 java 裏面 /** xxx */ 表示javadoc(文檔)註釋。ui
當你在方法、類名、或者變量上加上這樣的文檔註釋以後,別的地方引用到這些被你添加了文檔註釋的方法、類、變量時,就能很方便的看到原做者(也就是你)留下的註釋信息,這將會有利於別人理解你的想法或者思路。固然竟然是文檔註釋,那麼經過javadoc生成文檔時,這些註釋信息也就會被輸出來。好比咱們建立以下方法,並加上適當的文檔註釋信息:url
當咱們調用這個方法時,咱們添加的文檔註釋信息就會顯示出來了。
spa
切記:必定要是 /** */,只有它才表示 文檔註釋,只有文檔註釋的信息纔會在調用出顯示,或者隨javadoc輸出。 /* */ 只表示普通的多行註釋,註釋信息是不能顯示或者輸出的! 單行註釋 // 就更不用說了,絕對出不來的!.net
這裏咱們就不掩飾 javadoc 輸出的文檔信息了。(PS:其實是博主沒用過,還不知道怎麼用,有興趣的能夠本身查查資料)
對象
當咱們知道什麼是文檔註釋以後,接下來就能夠說說 @hide ,{@hide} 註解了。(百度百科那邊有個解釋,有興趣的能夠看看)開發
在源碼中,類或API是否開放,是經過doc的註釋{@hide}來控制的。方法、類、變量前面加上 {@hide} 註解以後,這個被註解的對象將會在生成 android.jar 的時候被刻意屏蔽掉,也就是SDK不可見的,這樣就使得使用 android.jar 的開發者不能直接調用這些被註解的對象,但一旦APP編譯好,安裝到機器上以後,APP調用的就不是SDK裏面的 android.jar 了,因此仍是能夠經過反射調用那些被添加 {@hide} 的對象的。被添加的這倆註解的對象,是 Google 不想被廣大開發者訪問到,但是出於 API 不穩定,或者兼容性不強考慮的,後期一旦穩定性或者兼容性獲得驗證,就會被開放出來了。
文檔
而 @hide 註解呢?它和 {@hide} 又有什麼區別呢?
實際狀況就是這兩種註解的效果沒什麼區別,都同樣能讓被註解的對象成爲 SDK不可見 的。至於它倆有啥區別,博主查了不少資料,也問了一些同事、大神,他們一致說沒區別,只不過一個是標準的寫法,一個是不怎麼嚴謹的寫法。至於哪一個是便準的,哪一個是不嚴謹的,我的持有疑問,這裏也就不寫出來誤導你們了。
由於這兩個註解只能在源碼裏面纔有效,咱們本身寫的不想公開的類、方法、變量等,加上這倆註解是沒效果的,因此你們也就不必深究它倆到底有啥區別了,只須要知道它倆差很少,都是讓被註解的對象成爲 SDK不可見 的,讓開發者不能直接訪問。
可是不想被訪問,並不表明不能被訪問!
上面說了源碼裏面有,但被添加了 @hide 或者 {@hide} 註解的對象,是Google不想被開發者訪問到的,但這並不表明他們不能被訪問。在真機或者模擬器的系統裏面,那些被註解的對象是存在的,只有在生成 SDK 的時候纔會被刻意屏蔽掉。咱們在開發的APP最終是運行在真機上的,一旦APP部署到機器上了,那些被隱藏的對象也就是能夠訪問的了。
咱們開發是基於SDK的,也就是說咱們不能直接調用哪些被隱藏的對象,由於他們在 SDK 裏面不存在,因此編譯器會報錯,沒法進行編譯,也就無法打包生成 APK 文件了。
怎麼訪問這些被隱藏的對象呢?
上面已經提到過一種方法,就是經過反射調用,這裏博主就不進行掩飾了。(PS:實際是博主反射沒學好,不會反)
這裏我將介紹另一種方法,也就是能直接訪問這些被隱藏對象的方法,進而使的能編譯經過。
以訪問一開始提到的 android.os.storage.StorageManager.java 爲例,這裏這個類是 framework 裏面的(別問我怎麼知道的,經驗而已)。咱們開發中想調用下面的方法就會報錯,進而不能經過編譯,也就不能生成APK了。
廢話很少說,下面就是見證奇蹟的時刻:
一、搞到源碼,編譯了;
二、進入 out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\ 目錄,將 classes.jar 複製項目 lib 下,並更名爲 framework_orginal.jar (也可不更名);
三、選擇項目屬性->Java Build Path->Libraries->Add Library->User Library->Next-> UserLibraries進入到User Libraries管理界面,點擊New新建一個User Library,好比android_framework_orginal,點擊Add Jars把Jar包加入到創建的User Library中,而後選中剛建的User Library,肯定。
四、此時咱們回到工程會發現,問題並無解決,依舊在報錯。接着咱們進行最關鍵的,也是比較容易忽略的一步操做。
選擇項目屬性->Java Build Path-> Order & Export,經過右側的 「Up」,「Down」按鈕,將咱們添加進來的 android_framework_original 移動到項目原有的 Android xxx 上面,點擊「Apply」,而後肯定,回到工程,就OK啦。