使用android hide API

使用androidhide API

Android有两种类型的API是不能经由SDK访问的。

第一种是位于com.android.internal包中的API。我将称之为internalAPI。第二种API类型是一系列被标记为@hide属性的类和方法。从严格意义上来讲,这不是一个单一的API,而是一组小的被隐藏的API,但我仍将其假设为一种API,并称之为hiddenAPI

使用hide具体步骤分为:调用hideapi和获得使用hideAPI权限

第一,调用hideAPI

第一种方法就是使用Java反射机制了,可以利用这种反射机制访问存在访问权限的方法,另一种方法就是或修改其域自己去掉Android源码中的"@hide"标记,然后重新编译生成一个SDK



1.1反射法,简单,但是运行时间较长

请参考:http://blog.csdn.net/annaleeya/article/details/8240510

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。在计算机科学领域,反射是一类应用,它们能够自描述和自控制。这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。   在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了)。它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。Reflection机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在执行的过程中,动态生成Instances、变更fields内容或唤起methods


1.2生成新的android.jarwith hide API,复杂,调用hideapi和一般API一样

基于以下事实:当你使用AndroidSDK进行开发的时候,你引用了一个非常重要的jar文件——android.jar。它位于AndroidSDK平台的文件夹中(SDK_DIR/platforms/platform-X/android.jar,其中,X表示API等级)。这个android.jar移掉了com.android.internal包中所有的类,也移掉了所有标记有@hide的类,枚举,字段和方法。

但当你在设备上启动应用程序时,它将加载framework.jar(简单来说,它和android.jar等同),而其未移掉internalAPIhiddenAPI。(但它对开发者来说,并不能友好地访问)。

请参考:http://www.cnblogs.com/xirihanlin/archive/2011/06/05/2073119.html



步骤:

1. 选择你的目标平台X

2. 创建目标平台X的模拟器

3. 启动模拟器,下载/system/framework/framework.jar

adb pull /system/framework/framework.jar

4. 重命名framework.jar-> framework.zip

5. framework.zip中抽取classes.dex

6. 使用dex2jar工具,将其转换成classes.jar

dev2jar classes.dex

7. 重命名classes.jar-> framework-classes.zip

8. 拷贝android.jar–> custom-android.zip

9. 解压custom-android.zipcustom-android文件夹

10. framework-classes.zip中所有文件拷贝至custom-android文件夹(覆盖存在的文件)

11. 压缩custom-android文件夹成original-android.zip

12. 重命名original-android.zip->original-android.jar

替换原来的android.jar(注意备份!!)



但是:在android5.0Android lollipop framework.jarhas noclasses.dex

https://groups.google.com/d/topic/android-building/PRdeUxuXYK4

需要自己下载google代码,编译android.jar

http://stackoverflow.com/questions/7888191/how-do-i-build-the-android-sdk-with-hidden-and-internal-apis-available

或者:

下载:

http://repository.grepcode.com/java/ext/com/google/android/android/5.0.1_r1/android-5.0.1_r1.jar

这个android-5.0.1_r1.jar包含hide api,但是有些基础包没有例如javajavax

原先无hideapiandroid.jar对比,目录:android-sdk/plaforms/android-xx/android.jarubuntu下双击就可以打开jar

对比两个jar

sdkandroid.jar

javajavax

hideapi

下载的android-5.0.1_r1.jar

javajavax

hideapi


所以不能用下载的android.jar直接替代原有的android.jar

而是把android-5.0.1_r1.jar中需要用的class拖入原有的android.jar中即可

原先用反射实现的方法可以像其他API一样调用!!

第二,获得使用hideAPI权限

无论是反射还是使用自编译的android.jar,只能解决调用隐藏API的问题,而无法越过权限检查。

可能会报类似的错误:

”Neither user 10053 nor current process hasandroid.permission.LOCATION_HARDWARE“

原因:

This permission is only given to system apps. In order to get thispermission, your app:

  1. must be signed with the system certificates. Thesecertificates are generally available only to the devicemanufacturers.

  2. be installed in /system/apppartition.

解决方案:

http://www.addictivetips.com/mobile/how-to-install-any-app-as-system-app-on-android/

In order to install an app as a system app on your Androiddevice, your device must be rooted.

猜你喜欢

转载自blog.csdn.net/coolwaterld/article/details/45671697