怎樣查看并且使用 Android 隱藏 API 和內(nèi)部 API

Android 有兩種類型的 API 不能通過 SDK 訪問驹碍。一種是在 com.android.internal 包中的 API忿晕,稱之為 internal API呐芥。另一種是被標記為 @hide 屬性的類和方法介牙,這是一組小級別的被隱藏的 API壮虫,稱之為 hidden API。

當使用 Android SDK 進行開發(fā)的時候耻瑟,應用默認引用了 android.jar旨指,它位于 SDKDir\platforms\android-X 目錄下(X 代表 API 級別),默認移除了所有的被@hide標識的方法或者類以及 internal 包下的類喳整。谆构。當應用在設備上運行時,它會加載 framework.jar框都。簡單來說搬素,framework.jar 和 android.jar 等同,但是沒有移除 internal API 和 hidden API魏保。Hidden API 之所以被隱藏熬尺,是想阻止開發(fā)者使用 SDK 中未完成或不穩(wěn)定的部分。

舉個栗子:這是沒有移除 internal API 的 android.jar谓罗,可以看到包里的類是完整的粱哼。

internal api

比如 AssetManager 的 addAssetPath 方法被 @hide 標記,它屬于 hidden API檩咱,我們無法直接調(diào)用該方法揭措。

    /**
     * Add an additional set of assets to the asset manager.  This can be
     * either a directory or ZIP file.  Not for use by applications.  Returns
     * the cookie of the added asset, or 0 on failure.
     * {@hide}
     */
    public final int addAssetPath(String path) {
        synchronized (this) {
            int res = addAssetPathNative(path);
            makeStringBlocks(mStringBlocks);
            return res;
        }
    }

但是,人的需求是無限的刻蚯。如果我們非要使用不可用的 API 怎么辦呢绊含?最簡單的就是 Java 的反射,反射 @hiden 的方法或類炊汹,修改訪問修飾符躬充,然后就可以搞事情了~~還有一種方法是從設備中提取,簡單說就是把設備上的 /system/framework/framework.jar 提取出來讨便,經(jīng)過一系列轉(zhuǎn)換充甚,最終得到完整的 android.jar,具體的步驟可以參考這篇文章:android怎樣調(diào)用@hide和internal API器钟。另外一種方式非常簡單津坑,GitHub 上有一個項目:android-hidden-api,里面提供了眾多版本完整的 android.jar 包傲霸,下圖所示疆瑰。

android hidden api

我們把工程 clone 下來眉反,找到對應平臺的 android.jar 包,替換掉 Android SDK 下面的 jar穆役,最好先備份一下原始的 jar寸五,重新編譯工程或者重啟 Studio 就行了。

比如 AssetManager 的 addAssetPath 方法耿币,沒有替換之前是這樣梳杏,Studio 提示錯誤,編譯失敗~o(>_<)o ~

can't resolve addAssetPath

但是在使用了完整的 android.jar 后淹接,發(fā)現(xiàn)竟然不會報錯了十性,代碼可以通過編譯,終于可以愉快地使用想要的方法了 O(∩_∩)O~

can resolve addAssetPath

這種方式對于個人開發(fā)來說沒有問題塑悼,你把 android.jar 替換掉就好了劲适,但是如果面對團隊開發(fā),就非常痛苦了 %>_<%厢蒜,每個人都要替換 SDK 的 android.jar霞势,代價和風險可想而知。那么有沒有好的解決辦法斑鸦,既可以讓工程編譯通過愕贡,又能夠免去多人替換 jar 的成本呢?答案是有的巷屿。

Studio 默認引用的是 SDK 下面的 android.jar固以,那我們把它的引用改成完整的 jar 的路徑不就行了么?
我們把完整的 android.jar 放在工程 libs 目錄下嘱巾,也就是平時依賴 jar 的地方嘴纺,然后在工程 build.gradle 配置的 dependencies 里,以 provided 的方式引用 android.jar浓冒。因為每個工程模塊依賴 android.jar 的類型就是 provided,這樣不會把 android.jar 打包到應用中尖坤,運行環(huán)境中存在 framework.jar稳懒,應用直接就可以使用。

dependencies {
     // compile fileTree(include: ['*.jar'], dir: 'libs')  這行一定要去掉慢味,當然為 android.jar 換個目錄也行
    testCompile 'junit:junit:4.12'
    provided files('libs/hidden_api_23.jar')
}

最后還要在工程根目錄的 build.gradle 里面配置當前 project场梆,加上下面的代碼就行了。

project('app') { // app是你工程的名字纯路,配置只對當前工程有效
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            // 注意修改 jar 包的路徑或油,替換 app/libs/hidden_api_23.jar,其他部分不要改
            // Xbootclasspath/p:是 Java 編譯的尋址優(yōu)先設置驰唬,先找缺省路徑還是全路徑
            options.compilerArgs.add('-Xbootclasspath/p:app/libs/hidden_api_23.jar')
        }
    }
}

現(xiàn)在重新編譯工程顶岸,雖然會在代碼中出現(xiàn)錯誤提示腔彰,但是編譯打包運行都是正常的。_

在開發(fā)中使用隱藏 API 和內(nèi)部 API 是不推薦的做法辖佣,但是為了實現(xiàn)一些「黑科技」霹抛,這些又是必須的~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卷谈,隨后出現(xiàn)的幾起案子杯拐,更是在濱河造成了極大的恐慌,老刑警劉巖世蔗,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端逼,死亡現(xiàn)場離奇詭異,居然都是意外死亡污淋,警方通過查閱死者的電腦和手機顶滩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芙沥,“玉大人诲祸,你說我怎么就攤上這事《颍” “怎么了救氯?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歌憨。 經(jīng)常有香客問我着憨,道長,這世上最難降的妖魔是什么务嫡? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任甲抖,我火速辦了婚禮,結(jié)果婚禮上心铃,老公的妹妹穿的比我還像新娘准谚。我一直安慰自己,他們只是感情好去扣,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布柱衔。 她就那樣靜靜地躺著,像睡著了一般愉棱。 火紅的嫁衣襯著肌膚如雪唆铐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天奔滑,我揣著相機與錄音艾岂,去河邊找鬼。 笑死朋其,一個胖子當著我的面吹牛王浴,可吹牛的內(nèi)容都是我干的脆炎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼叼耙,長吁一口氣:“原來是場噩夢啊……” “哼腕窥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筛婉,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤簇爆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后爽撒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體入蛆,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年硕勿,在試婚紗的時候發(fā)現(xiàn)自己被綠了哨毁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡源武,死狀恐怖扼褪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粱栖,我是刑警寧澤话浇,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站闹究,受9級特大地震影響幔崖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渣淤,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一赏寇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧价认,春花似錦嗅定、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捶箱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間动漾,已是汗流浹背丁屎。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旱眯,地道東北人晨川。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓证九,卻偏偏與公主長得像,于是被迫代替她去往敵國和親共虑。 傳聞我的和親對象是個殘疾皇子愧怜,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • 今天第一次做個人成長團輔妈拌,真的很感恩拥坛,這么好的機會大家給我了。職場關(guān)系最近幾年一直是我的短板尘分,我想過怎么怎么不被她...
    寧小小白閱讀 352評論 0 2
  • 這個世界所有東西本不是非黑即白的猜惋,所以按照這個理論,除了文藝騷和非文藝騷培愁,還有一類人叫偽文藝騷著摔。 文藝騷通常看了一...
    安an安an閱讀 110評論 0 0
  • 開發(fā)過程中真是會用到各種各樣的方法定续,今天記錄一下字符串和數(shù)組的相互轉(zhuǎn)換的方法 1.將string字符串轉(zhuǎn)換為arr...
    尋常_0閱讀 382評論 0 0