zoukankan      html  css  js  c++  java
  • 使用内部(com.android.internal)和隐藏(@hide)API[第2部分,定制android.jar]

    本文翻译自https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/

    在前一篇文章中,我解释了为什么不通过反射机制,不太容易使用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目录。

    原文:http://mogoweb.net/archives/92

  • 相关阅读:
    maven常用命令
    项目管理需要做的事情
    jinkins 部署过程
    怎么操作会导致MySQL锁表
    高性能Java代码的规范
    java8新特性(2)--接口的默认方法
    java8新特性1--Lambda表达式
    eclipse web项目
    js 0 "" null undefined
    Android分页加载
  • 原文地址:https://www.cnblogs.com/veins/p/3716657.html
Copyright © 2011-2022 走看看