Android 如何使用internal 和 hidden API

需求:import com.android.internal.telephony.Phone;

症状:the import xxxxxx cannot be resolved

诊断:android的SDK的目录里面明明是有\sdk\sources\android-15\com\android\internal\telephony 这样的目录。不能import的原因是,\sdk\platforms\android-x\android.jar文件中\com\android\internal\目录下面只有util\Predicate.class文件,所以在Eclipse里面import的时候只提示有com.android.internal.util。但是,模拟器和真实手机的/system/framework/framework.jar 库里面是有这些internal API的实现的。


原因:google反对使用internal下面的API做开发,但是在真机这些API是可以用的。另外,在ADT插件中,Google做了一个 Access Rules。打开Java Build Path->Libraries->android.jar->access rules 可以看到:Forbidden: com/android/internal/**


解决:分两步,第一是把class文件加入到android.jar文件内。 第二是去掉access rules

第一步:class文件可以从模拟器/真机的/system/framework/framework.jar 文件里提取,用dex2jar这个工具。提取了之后塞进android.jar文件就OK了。如果从API level 比较高的设备需要提取framework.odex文件,然后用baksmali+smali等工具处理。


第二步:修改eclipse的adt插件的bytecode来绕过这个限制。找到eclipse的plugin 插件,找到这个文件com.android.ide.eclipse.adt_*.jar,做个备份,然后解压缩,找到com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class 这个文件,用notepad++打开。因为notepad++看不懂二进制的部分,所以只会修改字符部分,不会乱动二进制的部分。找到这个字符串: “com/android/internal/**”.  把internal中某个字符替换掉,这样字符串长度不会变。然后保存。然后重新打包。然后重启Eclipse。不出意外的话,在Access Rules里面已经可以看到修改后的字符串了。限制去掉了。


这里的内容节选自下面这篇英文博客,原文里面图文并茂,更加详细。

https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/


你可能感兴趣的:(Android 如何使用internal 和 hidden API)