`

使用内部(com.android.internal)和隐藏(@hide)API[第2部分,定制android.jar]

 
阅读更多

在前一篇文章中,我解释了为什么不通过反射机制,不太容易使用com.android.internal包的内部API和标记为@hide的隐藏API,这是由于android.jar文件没有包含内部API和隐藏API的类,这样在编译时刻就没有办法引用这些类了。

本文将说明如何恢复原始的android.jar,这样就可以使用内部API和隐藏API了,就如同使用公开API一样。

如何获得原始(未裁减)的android.jar?

我们需要修改android.jar,让它包含所有原始的类文件(包括内部和隐藏API)。有两种方法:

1)Android是一个开源项目。我们可以下载源代码,定制构建系统,不从android.jar中移除内部和隐藏类。这种方法比较难。

2)每个模拟器或者真实设备都有一个与android.jar等价的包用于运行时。我们可以取得此jar,解出原始的.class文件,然后复制到android.jar。

我倾向于第二种方法,它比较容易,不需要linux机器(如果您是在windows下工作),也不需要编译所有的源码、定制构建系统,等等。

从设备获取framework.jar

您可以用命令行(adb pull)或者DDMS(从eclipse,或者android sdk单独启动)从设备或者模拟器中下载文件。

(注:模拟器总是在.dex文件中包含代码,而真实设备通常将代码包含在优化版的dex-odex文件。使用odex文件通常比较难,所以本文推荐用模拟器)

运行时刻和Android SDK中android.jar等价的文件是framework.jar. 该文件位于/system/framework/framework.jar。

adb pull /system/framework/framework.jar

当framework.jar下载后,重命名为framework.zip,然后unzip到一个单独的目录,您应该可以得到如下所示的内容:

image3 

文件classes.dex就是我们要的。

创建framework-classes.zip

首先我们需要将.dex文件转化为.jar文件格式。这可以用一个小工具dex2jar做到,您仅需要运行:

dex2jar classes.dex

当转化完成后,会得到classes.dex.dex2jar.jar文件,将其命名为framework-class.zip。使用zip文件查看器,进到framework-class.zip/com/android/internal:

image4

哇,我们得到了内部API和隐藏API的.class文件(虽然截图只确认了内部API)。

创建original-android.jar

Android SDK中的android.jar位于ANDROID_SDK/platforms/android-X/android.jar(这里X代表API Level,比如X==9)。

复制android.jar为custom-android.zip。unzip到custom-android文件夹。从framework-class.zip中复制所有.class文件到custom-android文件夹(您需要替换所有已有的.class文件)。

然后zip文件夹custom-android为original-android.zip,重命名为original-android.jar。

步骤总结

  1. 选择目标平台X(我使用API Leve 9的平台,所以X == 9)
  2. 创建平台X的模拟器
  3. 启动模拟器,从中下载/system/framework/framework.jar文件
  4. 重命名framework.jar为framework.zip
  5. 从framework.zip解压出classes.dex
  6. 使用dex2jar将classes.dex转化为classes.jar
  7. 重命名classes.jar为framework-classes.zip
  8. ANDROID_SDK/platforms/android-X/复制android.jar,重命名为custom-android.zip
  9. 解压custom-android.zip到custom-android目录
  10. 从framework-classes.zip复制所有文件到custom-android文件夹(替换已有文件)
  11. zip压缩custom-android文件夹为original-android.zip
  12. 重命名original-android.zip为original-android.jar

完成。

结论

我们恢复了原始的android.jar,包含内部API和隐藏API的.class文件。这只是第一步,下一步是创建定制的平台,使用未裁减版本的android.jar,然后加入到Android SDK platforms目录。

分享到:
评论

相关推荐

    android.jar的internal与hideApi

    android.jar的internal与hideApi 隐藏API

    Android代码-直接访问安卓系统隐藏的 APIs 和资源

    The internal API is located in the com.android.internal package which is available in the framework.jar file from a real Android device, while the hidden API is located in the android.jar file with @...

    android.jar

    当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识的方法或者类以及 internal 包下的类。。当应用在...

    使用internal和 hide api

    使用internal和 hide api

    android-26-带internal-telephony包.jar

    android sdk -26 带 com.android.internal.telephony 包的 jar, 下载后 将名称改为 android.jar 替换 anroid-sdk -> platform -> android-26 文件下的 android.jar 即可直接找到 telephony 下的类, 不会报错

    com.google.android.webview.apk

    webview全称叫做Android System WebView,它是Android生态系统的重要组成部分,也是Chrome浏览器的内核。可以让你的手机变得瞬间畅通,它会及时优化网页相关数据,有着接入式的操作体验数据,各种类型的应用程序可...

    android (7.0,7.1,8.0,8.1,9.0)对应的framework.rar

    【4.2到6.0的在已上传,文件太大,一次上传不了】当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识的...

    android (4.4,5.0,5.1,6.0)对应的framework.rar

    【7.0到9.0在下一个上传,文件太大,一次上传不了】当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识...

    async-http-client-1.6.3.jar com.ning.http.client.jar

    java 工具包, async-http-client-1.6.3.jar com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class ...

    com.google.android.webview

    android system webview 适配系统>=5.0

    android-hidden-api:一个提供对Android隐藏API和内部资源的访问的库

    内部API位于包com.android.internal ,可在framework.jar ,而隐藏的API位于具有@hide javadoc属性的android.jar文件中。 现在您知道了区别。 但是我将两者都称为隐藏API。 此存储库包含自定义android.jar ,可用于...

    包含android内部类的jar包

    这是一个包android内部类的jar包 import com.android.internal.* com.android.server.* com.google.android.* javax.microedition.khronos.*

    Android Material FlowLayout简单使用

    Android Material FlowLayout简单使用

    jna-5.4.0.jar中文文档.zip

    jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 ...

    jna-5.6.0.jar中文文档.zip

    jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 ...

    jna-5.10.0.jar中文文档.zip

    jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 ...

    jna-5.5.0.jar中文文档.zip

    jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 ...

    license文件

    at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) at ...

    org.eclipse.swt.win32

    org.eclipse.swt.internal.image.OS2BMPFileFormat.class org.eclipse.swt.internal.image.PNGFileFormat.class org.eclipse.swt.internal.image.PngChunk.class org.eclipse.swt.internal.image.PngChunkReader....

    original_android.jar

    基于android api28 (android 9)编译的完整版的android.jar。 如果是做framework开发可直接导入此项目作为compileOnly依赖项以通过androidstudio的编译check,应用层开发也可导入作为参考

Global site tag (gtag.js) - Google Analytics