系統(tǒng)有意屏蔽了一些類和方法在我們應(yīng)用開發(fā)的時(shí)候不讓我們進(jìn)行使用,但是這些類和方法是確實(shí)存在的。
Android 有兩種類型的 API 不能通過(guò) SDK 訪問(wèn)。?
(1)com.android.internal 包中的 API,稱之為 internal API。?
(2)被標(biāo)記為 @hide 屬性的類和方法,這是被隱藏的 API,稱之為 hidden API。
解決方法:
(1)反射調(diào)用
????????應(yīng)用在設(shè)備上運(yùn)行時(shí),它會(huì)加載 /system/framework/framework.jar 。framework.jar 和 android.jar的區(qū)別就是它沒有移除 internal API 和 hidden API,這就說(shuō)明了為什么我們可以通過(guò)反射調(diào)用,因?yàn)槲覀冮_發(fā)的SDK中不包含這些API,所以我們無(wú)法進(jìn)行顯式的調(diào)用,當(dāng)我們利用反射,程序在設(shè)備上運(yùn)行的時(shí)候,其實(shí)是可以找到對(duì)應(yīng)的方法進(jìn)行調(diào)用的。反射的例子:
? ??????IActivitManageram = ActivityManagerNative.getDefault();
? ??????Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class); forceStopPackage.setAccessible(true);
? ??????forceStopPackage.invoke(am, yourpkgname);??
(2)替換androidstudio中的android.jar
? ? ? ? 由于反射的寫法復(fù)雜,所以如果能把a(bǔ)ndroidstuido中的framework.jar 用設(shè)備中的framework.jar 來(lái)替換,那我們就可以直接調(diào)用了。萬(wàn)能的GitHub已有人把各個(gè)版本的Android.jar做好了(https://github.com/anggrayudi/android-hidden-api),只需要去下載自己需要的版本然后替換本地的jar就可以使用了。具體步驟:
? ? ? ? 1:關(guān)閉Android Studio
? ? ? ? 2:下載對(duì)應(yīng)API版本的Android.jar
????????3:替換SDK/platforms/android-版本/Android.jar
????????4:重新打開Android Stuido就可以查看

查看android所有源碼的在線文檔鏈接,包括隱藏API:
http://androidxref.com/
