使用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等同),而其未移掉internalAPI和hiddenAPI。(但它对开发者来说,并不能友好地访问)。
请参考: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.zip至custom-android文件夹
10. 将framework-classes.zip中所有文件拷贝至custom-android文件夹(覆盖存在的文件)
11. 压缩custom-android文件夹成original-android.zip
12. 重命名original-android.zip->original-android.jar
替换原来的android.jar(注意备份!!)
但是:在android5.0下Android
lollipop framework.jarhas noclasses.dex
https://groups.google.com/d/topic/android-building/PRdeUxuXYK4
需要自己下载google代码,编译android.jar
或者:
下载:
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,但是有些基础包没有例如java,javax
原先无hideapi的android.jar对比,目录:android-sdk/plaforms/android-xx/android.jar(ubuntu下双击就可以打开jar)
对比两个jar
sdk的android.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:
- must be signed with the system certificates. Thesecertificates are generally available only to the devicemanufacturers.
- 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.