Eclips 开发 apk 使用android内部(com.android.internal) API

Android内部API在SDK中不能使用。

位于包com.android.internal的API,我将这些API称为内部API。

内部和隐藏API的编译时和运行时对比

当您使用Android SDK进行开发时,会引用一个非常重要的jar文件android.jar。它位于Android SDK的平台目录SDK_DIR/platforms/platform-X/android.jar(其中X为API Level,可以是5或者10或其它的数字)。在android.jar中,com.android.internal中所有的类移除了,同样的,所有标记为@hide的类、枚举、字段、方法也移除了。

但是当您在设备中运行应用程序时,加载的是framework.jar(大约等价于android.jar),它没有被裁减,包含所有的内部类和隐藏API。所以您可以使用反射机制来访问隐藏API和内部API(当然,这种方法使用起来不太方便,下面我将介绍不使用反射机制访问这些API的方法)。

关于内部API还有一些特别。Eclipse的ADT插件增加了一条额外规则,禁止使用来自com.android.internal包的任何东西。所以,即使您使用了原始(未裁减)的android.jar,也不容易在eclipse中使用内部API。

您可以自己检查一下。在eclipse中创建一个新的Android工程(或使用现有的),查看它的引用库(右键点击工程,Properties –> Java Build Path –> Libraries)。

重要总结:在SDK中内部API和隐藏API处理方式基本上相同(都从android.jar中移除),但内部API在Eclipse ADT插件中显示禁止了。

不通过反射机制使用内部API和隐藏API

本系列文章的终极目标是给程序员不用反射而使用内部API和隐藏API的方法。如果您完成了在后面文章中的所有步骤,您将可以向象使用官方API那样使用内部API和隐藏API,没有必要使用反射。

如何修改?

如何修改?

1. 把android-sdk-windows\platforms\android-17\android.jar用winrar解压到一个目录,例如android_tmp目录下

2. 复制android4.4_kitkat\out\target\common\obj\JAVA_LIBRARIES\framework-base_intermediates\classes\com\android\internal内容替换android_tmp\com\android\internal下所有内容。

如果自己添加的类,则复制到相应目录即可。例如:out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes\android\graphics\Stroke.class复制到android_tmp\android\graphics\Stroke.class

3. 用winrar重新压缩zip格式,进入android_tmp目录内,压缩内容至anroid.zip(注意,根目录必须是android_tmp目录内的根目录),改扩展名成jar:android.jar。(原android.jar改名备份)

 

  此时重启Eclispe,即可看到我们定制的扩展SDK平台了,但内部api仍无法使用。

 

  注意:重新压缩成的android.jar,看一下目录结构,不要把外层目录也加进去了。

 

4)定制ADT,去除ForBidden

  到目前为止,ADT仍然禁止使用com.android.internals包中的类。

  右键任一Android工程->Properties->左侧Java Build Path->右侧Libraries标签->Android XXX->android.jar->Access rules->Forbidden: com/android/internal/**

 

  越过该限制规则,最简单的方式是修改ADT字节码。只需替换"com/android/internal/**”字符串为其它的字符串,比如"com/android/internax/**”。

 

1. 关闭Eclipse

2. 在<Eclipse目录>\plugins目录,按名称排下序,按c,找到com.android.ide.eclipse.adt_*.jar

3. 复制到外部,解压修改再打包回去,修改如下:

  找出com\android\ide\eclipse\adt\internal\project\AndroidClasspathContainerInitializer.class文件

  记事本打开文件,查找com/android/internal/**,替换为com/android/internal/**为com/android/internax/**。

4. 回到plugins目录,重命名原先的添加_bak,备份下,把新jar放入。

5. 打开Eclipse,再检查下^^

 

  报错:parseSdkContent failed

com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer : Unsupported major.minor version 8241.8224

 

  不能以记事本打开,ASNI?字节码变掉了应该==

 

  用ultraEditor以16进制方式打开,按ctrl+H进入16进制编辑模式,ctrl+F搜索**,即2A 2A。把l替换成x,即6C->78。重弄遍,ok^^。备份是好习惯啊!

 

 

 

没有更多推荐了,返回首页