Android P 禁用非官方API

前言

1 . 信息:

Android P(禁用非官方API)目前類似的消息此起彼伏,關(guān)于國(guó)外移動(dòng)開發(fā)者社區(qū) XDA 的活躍者們?cè)?AOSP(Android 開放源代碼項(xiàng)目)的代碼提交記錄中的發(fā)現(xiàn)。從 AOSP 最新的 commits 中可以看到道川,那些使用 Android SDK 里面沒有被文檔提及的非公開 APIs(也就是使用 @hide 注解標(biāo)記的 APIs)的 apps 將受到系統(tǒng)限制冒萄。

image

2. 驗(yàn)證:

Android P預(yù)覽版已經(jīng)開發(fā)下載帅戒,大家可以下載刷機(jī)逻住,測(cè)試下使用到的api是否被限制。Android官網(wǎng)提供的刷機(jī)包有以下四種,大家可以直接下載刷機(jī)包刷機(jī)進(jìn)行驗(yàn)證装诡。下載地址如下:https://developer.android.com/preview/download.html

image

刷完包之后迫不及待的測(cè)試了非官方禁用API,測(cè)試結(jié)果和大家猜測(cè)的一樣鸦采,Android p會(huì)給大家彈出toast告知禁止使用非官方API渔伯,具體內(nèi)容請(qǐng)參考:co/dev/appcompat,最終的鏈接地址為:https://developer.android.com/preview/restrictions-non-sdk-interfaces.html
目前官方文檔已經(jīng)明確對(duì)非官方API的限制:

image

總結(jié)如下

Android P引入了對(duì)非官方API的限制。無論是通過反射還是通過JNI等方法蓝厌, 只要應(yīng)用程序引用非SDK接口或嘗試使用反射或JNI獲取其句柄拓提,就會(huì)使應(yīng)用受到這些限制。

01

禁用非官方API原因

關(guān)于為何要減少非官方接口寺惫,提高應(yīng)用穩(wěn)定性西雀,在2018年2月28日,Google官方有此類聲明:原文地址:

https://android-developers.googleblog.com/2018/02/improving-stability-by-reducing-usage.html

image

通過以上內(nèi)容可得知蒋搜,Google早在Android N中已經(jīng)在native層已經(jīng)對(duì)ndk開發(fā)所使用的API進(jìn)行了非官方API接口的限制豆挽,目前在Android P中開始實(shí)施對(duì)java層非官方API(官方SDK接口)的限制帮哈。目的是為了確保Android開發(fā)者和使用者的穩(wěn)定性娘侍,為減少非官方API帶來的崩潰,Google一直在努力著嚎杨。

02

如何區(qū)分官方API和非官方API

image

官方聲明:SDK接口是Android框架中記錄的接口枫浙。 處理非SDK接口是API抽象化的實(shí)現(xiàn)細(xì)節(jié); 它可隨時(shí)更改箩帚,恕不另行通知紧帕。(官方sdk接口:https://developer.android.com/reference/packages.html)

關(guān)于限制到何種程度是嗜,Goole官方有以下說明:

image

總結(jié)以下幾點(diǎn):

  • Android P預(yù)覽版暫時(shí)對(duì)非官方API不做限制,目的是為了提供給開發(fā)者用于測(cè)試應(yīng)用中是否使用非官方API潦嘶。

  • Android P預(yù)覽版暫時(shí)會(huì)打印使用的非官方API的日志以及彈出相應(yīng)的toast提供給開發(fā)者測(cè)試使用(注:Toast是為了增加關(guān)注度掂僵,logcat中有使用非官方API的詳細(xì)信息)

  • 日志(logcat)信息中包括Android運(yùn)行時(shí)使用的格式的聲明類锰蓬,名稱和類型芹扭。日志消息還指示訪問方式:直接舱卡,通過反射或通過JNI。以及適用的灰名單矫钓。

有兩種灰名單:

  • light greylisted :包含方法和字段赵辕,它們繼續(xù)在Android P預(yù)覽版中運(yùn)行概龄,但Google無法保證在未來版本的平臺(tái)上訪問這些方法和字段吸重。

  • dark greylist:開發(fā)人員預(yù)覽版本中無法訪問的方法歪今。
    這些日志消息可以使用adb logcat訪問寄猩,并且會(huì)顯示在正在運(yùn)行的應(yīng)用程序的PID下骑疆。日志中的條目可能如下所示:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (dark greylist, reflection)

03

使用非官方API的后果

在Developer Preview的后續(xù)版本中泊柬,訪問非SDK接口的各種方法都會(huì)產(chǎn)生錯(cuò)誤或其他不良結(jié)果兽赁。下面列出了幾種示例:

image

終上所述:使用非官方API的小伙伴么刀崖,趕緊檢查下自己的APP是否使用了非官方API吧亮钦,Android P呼之欲出蜂莉,別到時(shí)間措手不及映穗。

04

實(shí)際測(cè)試

有了以上大google的威逼利誘男公,以及各種模式下對(duì)非官方API的限制澄阳,我們來實(shí)際的測(cè)試下:
舉個(gè)例子碎赢,拿 android.net.wifi 包里面的 WifiManager 類來說肮塞,該 Class 里面就包含很多 @hide 標(biāo)記的代碼(其實(shí)源碼中類都包含有很多的@hide標(biāo)記枕赵,有興趣的可以參考下http://androidxref.com/查看源碼拷窜,或者下載源碼https://source.android.com/setup/downloading有興趣的同學(xué)可以進(jìn)一步交流)篮昧,一些變量或方法(這里隨便找網(wǎng)上找了一個(gè)):

/**
 * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently
 * @hide
 */public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available";
    這里我們通過java reflection功能來實(shí)現(xiàn)該功能笋妥,即調(diào)用隱藏API WIFI_SCAN_AVAILABLE字段:
WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE);
field = wifiManager.getClass().getDeclaredField("WIFI_SCAN_AVAILABLE");
Log.d(Tag, (String) field.get(wifiManager));

上述實(shí)現(xiàn)上很簡(jiǎn)單懊昨,通過反射Filed WIFI_SCAN_AVAILABLE 來打印隱藏Field的值,在pixel Android P預(yù)覽版執(zhí)行結(jié)果如圖所示:

image

圖中執(zhí)行結(jié)果讓訪問g.co/dev/appcompat正如我們上文中前言的內(nèi)容春宣,我們?cè)賮砜聪麓蛴〉娜罩荆?div id="59ttiwr" class="image-package">
image

如圖中所示酵颁,訪問hide的方法以警告的形式出現(xiàn)在log日志中后方包含詳細(xì)的信息,細(xì)心的朋友可能會(huì)看到月帝,我們反射使用@hide的WIFI_SCAN_AVAILABLE的值灰名單的級(jí)別為(dark greylist, reflection)材义,也就是說在屬于無法訪問的方法。以上便是Java層內(nèi)容的測(cè)試
雖然大多數(shù)還都在灰名單的light greylisted級(jí)別嫁赏,暫時(shí)可以在Android P 預(yù)覽版中運(yùn)行其掂,但不要忘記了上面所說的,Google無法保證在未來版本的平臺(tái)上訪問這些方法和字段潦蝇。

總結(jié):

以上贤牛,無論是java層使用了非官方API還是在NDK層反射使用,都會(huì)在log日志中打印詳細(xì)信息。

親愛的開發(fā)者們,Android官方禁用非官方API已經(jīng)從Android N到Android P有了比較實(shí)質(zhì)的進(jìn)展,為構(gòu)建穩(wěn)定和諧的Android使用環(huán)境,大Google也一直努力著。對(duì)于使用非官方API的內(nèi)容請(qǐng)大家及時(shí)留意纵揍,不要因?yàn)橐粋€(gè)不留神觸碰到了源碼Bug造成了大量的崩潰哦吧雹,趕緊查看下自己的應(yīng)用有沒有使用到這些吧,提前做好準(zhǔn)備哦。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚎花,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卖词,更是在濱河造成了極大的恐慌即横,老刑警劉巖页藻,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筒繁,死亡現(xiàn)場(chǎng)離奇詭異幻赚,居然都是意外死亡佳谦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辜昵,“玉大人诵叁,你說我怎么就攤上這事碑诉】烀” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵襟衰,是天一觀的道長(zhǎng)瑰妄。 經(jīng)常有香客問我竹宋,道長(zhǎng)三娩,這世上最難降的妖魔是什么蔚万? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮临庇,結(jié)果婚禮上笛坦,老公的妹妹穿的比我還像新娘区转。我一直安慰自己,他們只是感情好版扩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布废离。 她就那樣靜靜地躺著,像睡著了一般礁芦。 火紅的嫁衣襯著肌膚如雪蜻韭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天柿扣,我揣著相機(jī)與錄音肖方,去河邊找鬼。 笑死未状,一個(gè)胖子當(dāng)著我的面吹牛俯画,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播司草,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼艰垂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了埋虹?” 一聲冷哼從身側(cè)響起猜憎,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搔课,沒想到半個(gè)月后胰柑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爬泥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年柬讨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袍啡。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踩官,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葬馋,到底是詐尸還是另有隱情卖鲤,我是刑警寧澤肾扰,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布畴嘶,位于F島的核電站,受9級(jí)特大地震影響集晚,放射性物質(zhì)發(fā)生泄漏窗悯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一偷拔、第九天 我趴在偏房一處隱蔽的房頂上張望蒋院。 院中可真熱鬧亏钩,春花似錦、人聲如沸欺旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辞友。三九已至栅哀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間称龙,已是汗流浹背留拾。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲫尊,地道東北人痴柔。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像疫向,于是被迫代替她去往敵國(guó)和親咳蔚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評(píng)論 25 707
  • afinalAfinal是一個(gè)android的ioc鸿捧,orm框架 https://github.com/yangf...
    passiontim閱讀 15,434評(píng)論 2 45
  • 營(yíng)養(yǎng)學(xué)屹篓,就是身體的材料學(xué)。這也就是我們?yōu)槭裁疵刻煲允澄锏脑颉?吃食物的目的匙奴,就是為了采集身體細(xì)胞指定的原材料堆巧,...
    樂樂_8655閱讀 167評(píng)論 0 0
  • 在本次案例中,我所需要做的便是通過已有的信息進(jìn)行預(yù)測(cè)員工未來的動(dòng)向泼菌,即判斷該員工未來是否會(huì)離職谍肤。 satisfac...
    艾瑞婭閱讀 3,666評(píng)論 14 24
  • 不知從什么時(shí)候開始,慢慢的沒有了運(yùn)動(dòng)的習(xí)慣哗伯。多年來荒揣,感覺自己的身體越來越疲憊,感覺自己"生埠干病"了好久系任。直到有一天,...
    夜空下的黑貓閱讀 353評(píng)論 0 1