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

  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/veins/p/3716657.html
Copyright © 2011-2022 走看看