聽說Android9.0要禁用@HideApi的呼叫,你怎麼看?
距離 Android 8.0 釋出,已經過了五個月,雖然現在佔有率並不高,不過呢,Google 已經著手準備下一版本的 Android 系統。
上週,據快科技爆出來的訊息,在 XDA社群 有人發現最近的 AOSP(Android Open Source Project)提交記錄中,懷疑是下一代 Android 系統版本的程式碼:PI,這可能是 Android 9.0 的版本名稱。不過根據 Android 之前版本的命名習慣,Google 鍾愛使用甜點來命名版本,很多人猜測 Pi可能是 Pie(餡餅)的縮寫。
在 AOSP 最新的 commit 中,還暴露出來一些特別的資訊,可能會開始限制一些沒有被文件提及的非公開 APIs 的呼叫,例如被標記為 @hide
的 APIs。
上面是 commit 的截圖,有興趣可以去這裡 AOSP 裡看看細節。
https://android-review.googlesource.com/c/platform/external/doclava/+/589515
簡單看了一下這個 commit 的改動,可以看到,在 Stubs 中增加了一個 privateDexApiWriter,應該是用來記錄這些被標記為 @hide
的方法。
具體用來做什麼的,也沒有深入深究,不過單純從這個 commit 裡看到的內容猜測,應該是要著手限制一些 @hide
APIs 的訪問。
那麼我們繼續開一下腦洞,想想 Google 想要限制 @hide
APIs 的呼叫,有那些需要考慮的。
@hide 方法
眾所周知,Android 系統在迭代的過程中,越來越重視安全這個因素。而有一些方法可能會涉及到系統安全、使用者隱私或者其他一些原因,總之有一些因素考量,在釋出出來的時候,被 Google 標記為 @hide
,表示並不希望開發者去使用它們。
而這些標記為 @hide
的方法,我們也是無法直接呼叫的,只能使用反射的方式去呼叫它們,這本身就是不安全的操作。
不過呢,我們有時候確實為了實現一些功能,需要使用到這些被標記為 @hide
的方法。
從前面提到的 commit 的描述中,可以看到,這種限制是 Dex-level 層的,也就是它應該可以做到無視反射呼叫。例如加個許可權限制,呼叫的時候判斷無權呼叫則直接報錯或者讓你反射的時候呼叫,也無法起作用,其實都是限制的方式,現在還不用太深究原理。
Support Library
雖然 Google 是可以做到對 @hide
方法的限制的,不過有一點不知道大家注意到沒有,那就是 Support Library 中,也包含了大量 @hide
APIs 的呼叫。
例如最近說到的 Autosizing 功能的實現中,就專門用來寫了一個方法,來做反射的呼叫,獲取 TextView 中的一些屬性值。
private <T> T invokeAndReturnWithDefault(@NonNull Object object,
@NonNull final String methodName, @NonNull final T defaultValue) {
T result = null;
boolean exceptionThrown = false;
try {
// Cache lookup.
Method method = getTextViewMethod(methodName);
result = (T) method.invoke(object);
} catch (Exception ex) {
exceptionThrown = true;
Log.w(TAG, "Failed to invoke TextView#" + methodName + "() method", ex);
} finally {
if (result == null && exceptionThrown) {
result = defaultValue;
}
}
return result;
}
Google 提供的一系列 Support Library 的庫,本質上都是 Google 為開發者準備的一些 APIs 擴充套件包,但是它不同於系統本身的 APIs。
我們在開發 Android 的階段,會指定一個 Api Level ,從 IDE 的表現來看,它會引用一個 android.jar ,本質上是為了我們開發階段能夠成功編譯而存在的,這個 Jar 包本身是不會被打包在 APK 中的。
在 Support Library 則不一樣,它只是 Google 提供的一個工具包,會真實的被編譯進 APK 中,會佔用 APK 的體積。這就是為什麼 Support v26 刪除了一些方法來促使體積減小,是一件讓人高興的事情。
而如果 Google 對 @hide
方法進行了一刀切的限制之後,Support Library 中的一些功能,應該也會受到影響,因為本質上它就是我們 Apk 中的程式碼,許可權級別和我們開發中編寫的程式碼是一樣的。
所以這就存在兩個方向的問題:
1、區分來自 Support Library 的呼叫和開發者呼叫。
2、一刀切,直接修改 Support Library 原始碼和系統原始碼,重新審視那些現在被標記為 @hide
的方法,將那些不會影響安全和隱私的 APIs 全部開放出來,允許開發者呼叫。
下面我們繼續開腦洞,仔細說說這些的區別。
1、區分呼叫來源
如果 Google 有辦法區分呼叫來自哪裡,然後針對不同的呼叫來源來實行不同的呼叫許可權控制。
對開發者而言,實際上就是有漏洞可以讓我們模擬成一個來自 Support Library 的呼叫,就依然可以繞過不允許呼叫 @hide
方法的限制,這個明顯是有隱患的。
2、一刀切
從現有 Support Library 中的程式碼可以看到,其實它使用的 @hide
方法,並不全都是涉及安全和隱私的。
就拿最近分析的 Autosizing 來說,它其中大量的呼叫了一些 TextView 的諸如 getHorizontallyScrolling()
、getLineSpacingMultiplier()
、getLineSpacingExtra()
方法,這些方法其實並不觸及安全和隱私。
只是為了拿個文字控制元件的屬性而已,能有什麼不安全或者不隱私的?慎重考慮之後,拿掉這些方法的 @hide
就好了,開放呼叫,就不需要區分那麼多了。
本文轉自承香墨影部落格園部落格,原文連結:http://www.cnblogs.com/plokmju/p/8334869.html,如需轉載請自行聯絡原作者
相關文章
- 你說你學不動啦,看 Redux 作者怎麼說?Redux
- 你信得過AI嗎?聽聽IBM科學家怎麼看AIIBM
- 聽說你的物件有個”環“?怎麼發現的呢?物件
- 對於5G的到來,你是怎麼看的?說說你的想法
- VueJS&&ReactJS如何?聽聽別人怎麼說。VueJSReact
- 聽說你會 Python ?Python
- 全面佈局安全可靠 聽聽東軟怎麼說!
- 聽說你的資源被盜用了,那你知道 Nginx 怎麼防盜鏈嗎?Nginx
- 你有聽說過“分詞”嗎?說說你對它的理解分詞
- 說說你是怎麼安排你工作外的時間的?
- 聽說你的爬蟲被封了?爬蟲
- 公益直播課|遠離勒索病毒,聽聽專家怎麼說
- React 和 Vue 到底誰更牛?聽聽尤雨溪怎麼說ReactVue
- 說說你遇到過最大的bug是什麼?怎麼解決的?
- 對於相親你們有什麼要說的嗎
- 說說你是怎麼實現頁面阻尼效果的?
- 軟體測試的測試環境該怎麼搭建?聽聽卓碼軟體測評小編怎麼說
- 恐怖遊戲的當下和未來?來聽聽Gamera和製作人們怎麼說遊戲GAM
- 雲端計算儲存之什麼是Ceph?聽聽Ceph創始人怎麼說
- 你有沒有看過哪些開源專案的原始碼?說說你看原始碼的流程原始碼
- 聽說你們春節要出去玩?我要學好Flutter為升職加薪做準備了!Flutter
- win10怎麼禁用所有通知_要怎麼關閉Win10通知訊息Win10
- 你說說RPC的一個請求的流程是怎麼樣的?RPC
- “人老了要明白:養老與孩子無關,自己有錢,才是王道”你怎麼看?
- 老闆問你什麼是SASE,你該怎麼說?
- 你說你精通Redis,你看過持久化的配置嗎?Redis持久化
- 聽說同學你搞不懂Java的LinkedHashMap,可笑JavaHashMap
- 說下你平時是怎麼自學的?怎麼安排時間的?
- 學習Java虛擬機器沒用? 聽聽當事人是怎麼說的!(skycto JEEditor)Java虛擬機
- 沒有“好的”資料,AI就沒有未來?聽聽雲測資料怎麼說AI
- 聽說你用webpack處理檔名的hash?那麼建議你看看你生成的haWeb
- 你說,怎麼把Bean塞到Spring容器?BeanSpring
- 聽說你又被面試官虐了?面試
- 聽說你還在手寫懶載入?
- [Day 1] 聽說你沒來 JSConf 2017?JS
- [Day 2] 聽說你沒來 JSConf 2017?JS
- 網路釣魚,你要怎麼防範
- 如何獲得一場黑客馬拉松的勝利?聽聽AWS特約評委怎麼說黑客
- 遊戲交友是社交的匱乏還是繁榮?聽聽這些大學生怎麼說遊戲