系统有意屏蔽了一些类和方法在我们应用开发的时候不让我们进行使用,但是这些类和方法是确实存在的。
Android 有两种类型的 API 不能通过 SDK 访问。
(1)com.android.internal 包中的 API,称之为 internal API。
(2)被标记为 @hide 属性的类和方法,这是被隐藏的 API,称之为 hidden API。
解决方法:
(1)反射调用
应用在设备上运行时,它会加载 /system/framework/framework.jar 。framework.jar 和 android.jar的区别就是它没有移除 internal API 和 hidden API,这就说明了为什么我们可以通过反射调用,因为我们开发的SDK中不包含这些API,所以我们无法进行显式的调用,当我们利用反射,程序在设备上运行的时候,其实是可以找到对应的方法进行调用的。反射的例子:
IActivitManageram = ActivityManagerNative.getDefault();
Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class); forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am, yourpkgname);
(2)替换androidstudio中的android.jar
由于反射的写法复杂,所以如果能把androidstuido中的framework.jar 用设备中的framework.jar 来替换,那我们就可以直接调用了。万能的GitHub已有人把各个版本的Android.jar做好了(https://github.com/anggrayudi/android-hidden-api),只需要去下载自己需要的版本然后替换本地的jar就可以使用了。具体步骤:
1:关闭Android Studio
2:下载对应API版本的Android.jar
3:替换SDK/platforms/android-版本/Android.jar
4:重新打开Android Stuido就可以查看
查看android所有源码的在线文档链接,包括隐藏API:
http://androidxref.com/