使用内部(com.android.internal)和隐藏(@hide)API手记

内部API和隐藏API的不同
隐藏API隐藏是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定下来,google的开发人员移除@hide属性,在API Level 5中就有Bluetooth API了。还有很多东西在Level 4和5之间发生了变化。如果程序依赖于某些隐藏API,可能会在新版本的Android OS上运行出现问题。
而内部API则不计划对外开放。这是android的内部餐厅,开发人员可以视为黑盒子。这里面的东西同样可能发生改变。同样的,如果您的程序依赖于内部API,在新的Android发布后,可能遇到麻烦。
下面总结它们之间的不同:隐藏API = 正在开发中;内部API = 黑盒
1)配置SDK路径
1.1)Ubuntu:
Ctrl+Alt+T打开终端
gedit ~/.bashrc
export SDK_HOME=<SDK路径>
export PATH=$PATH:$SDK_HOME/platform-tools:$SDK_HOME/tools
source ~/.bashrc
1.2)Windows:
我的电脑->右键属性->高级->环境变量
选择系统变量新建:SDK_HOME=<SDK路径>
选择系统变量Path编辑:%SDK_HOME%\platform-tools;%SDK_HOME%\tools;<原Path>
不一定要配置,只是为了方便启动某些工具==
以下是在Windows XP下操作的~
2)AVD Manager创建模拟器并启动
以下以2.3.3平台为例了~
3)从模拟器获取framework.jar
每个模拟器或者真实设备都有一个与android.jar等价的包用于运行时。我们可以取得此jar,解出原始的.class文件,然后复制到android.jar。
adb pull /system/framework/framework.jar C:\
4)解压framework.jar获取classes.dex
5)dex2jar反编译得到原classes
dex2jar下载:http://code.google.com/p/dex2jar/downloads/list
classes.dex放到<dex2jar目录>内或指定绝对路径,例如为C:\classes.dex时:
进入<dex2jar目录>
dex2jar C:\classes.dex
得到classes_dex2jar.jar。
6)创建SDK定制平台
进入<SDK路径>\platforms,复制一份对应平台。2.3.3为API-10,所以如下:
复制android-10,重命名为android-10-internals。并如下修改:
1. 把上述classes_dex2jar.jar移动至android-10-internals目录
2. 解压android.jar&classes_dex2jar.jar进各自目录
3. 复制classes_dex2jar.jar解压内容全部替换android.jar解压内容
4. 重新压缩android.jar解压内容至zip,删除冗余东西,重命名回android.jar
5. 修改build.prop文件,具体如下:
ro.build.version.sdk=10 –> ro.build.version.sdk=-10
6. 修改source.properties文件,具体如下:
Platform.Version=2.3.3 –> Platform.Version=2.3.3.extended
此时重启Eclispe,即可看到我们定制的扩展SDK平台了,此时其实使用隐藏API已经足够了。
注意:重新压缩成的android.jar,看一下目录结构,不要把外层目录也加进去了。
7)定制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?字节码变掉了应该==
用一些Editor以16进制方式打开搜索**,即2A 2A。把l->x,即6C->78。重弄遍,ok^^。备份是好习惯啊!
8)后记
本文源于如下网址:http://mogoweb.net/?s=%40hide;共有四部分,明细地址如下:
第1部分,介绍:http://mogoweb.net/archives/87
第2部分,定制android.jar:http://mogoweb.net/archives/92
第3部分,定制android平台:http://mogoweb.net/archives/104
第4部分,定制ADT:http://mogoweb.net/archives/117
当然,也有其他使用隐藏API的方式,不过觉着这个方式更优秀^^。
还有,AndroidManifest.xml内会是<uses-sdk android:minSdkVersion="-10" />。
补充:发现4.0模拟器内的framework.jar分出了个odex了==。
以下是反编译好的两个framework.jar(classes):
1)4.0.1(模拟器导出):framework_4.0.1.jar
2)4.0.3(源码编译得):framework_4.0.3.jar

具体如何操作,参见《Android混淆、反编译以及反破解的简单回顾》最后的补充^^。
     本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/861758,如需转载请自行联系原作者

使用内部(com.android.internal)和隐藏(@hide)API手记相关推荐

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

    本文翻译自http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-4-customizing-adt/ 在前面的 ...

  2. android 如何调用 隐藏的 API 接口

    怎样查看并且使用 Android 隐藏 API 和内部 API https://www.jianshu.com/p/fbf45770ecc8 android 隐藏API显式调用以及内部资源使用方法 h ...

  3. Android 原生应用使用@hide api

    android源码中有很多@hide标记的api,这些api默认是不对外开放的,app是访问不到的. 我在修改android_root/packages/apps/Email下的文件,就遇到了不能访问 ...

  4. 使用internal(com.android.internal)和hidden(@hide)APIs

     方案一:使用android 反射可以实现 Android系统内部提供了一个不错的txt文本读写类,但目前并没有公开提供给标准的SDK,FileUtils类的源代码如下,可以很好的操作Linux下的文 ...

  5. 使用android hide API

    使用androidhide API Android有两种类型的API是不能经由SDK访问的. 第一种是位于com.android.internal包中的API.我将称之为internalAPI.第二种 ...

  6. has leaked window com.android.internal.policy.impl.PhoneWindow解决(Dialog.cancel、dismiss、hide区别)

    项目中有个Activity中用到了ProgressDialog,而在跳转到下个Activity时就会报这个错: has leaked window com.android.internal.polic ...

  7. 使用internal(com.android.internal)和hidden(@hide)APIs – Part 5

    xirihanlin 2011.06.07 原文路径:https://devmaze.wordpress.com/2011/01/19/using-com-android-internal-part- ...

  8. Data Storage(数据存储)之内部储存(Internal Storage)

    Data Storage(数据存储)之内部储存(Internal Storage) 读取手机内部储存,Activity 中调用 openFileOutput(file_name, mode)方法返回F ...

  9. Android反射@hide API 方法、变量,支持Android11和Android12

    Android源码中现在有大量的方法和变量被@hide所修饰,而这些被hide修饰的方法和变量是不允许应用层进行反射获取的,所以富有探索精神的程序员们就开始想尽各种办法绕过系统hide限制来使用@hi ...

最新文章

  1. R语言ggplot2可视化分组的重叠图实战:grouped overlay plot
  2. Java 程序员都该懂的 HashMap
  3. 1069: [SCOI2007]最大土地面积 - BZOJ
  4. Android开发之选项菜单(optinosMenu)
  5. php如何读取多个url文件,如何从PHP中的URL获取具有相同名称的多个参数
  6. Android官方开发文档Training系列课程中文版:Activity测试之UI组件测试
  7. 一统江湖的大前端(3) DOClever——你的Postman有点Low
  8. getelementsbyname谷歌浏览器兼容_常用的浏览器内核有哪些?常用浏览器及其内核介绍...
  9. HoverTree开发日志之验证码
  10. 测试工具平台介绍之MeterSphere
  11. 如何在matlab中打开图片
  12. 整理了 25 个 Python 文本处理案例,收藏!
  13. 解决Postman报错Could not send request
  14. html css blockquote,3个Blockquote的css样式【css3实现】
  15. lol人物模型提取(三)
  16. mac 安装问题汇总
  17. .net服务端渲染_驳:服务端命令 VS 表间公式
  18. 接口测试准备一、 网路基础 常用代理工具 charles使用 Android手机代理抓包
  19. python服务器环境搭建_服务器python环境搭建
  20. 正则表达式详解(Perl)

热门文章

  1. 在centos6.5中安装reids
  2. 求出数组中超过一半的数
  3. 【白话设计模式二十二】解释器模式(Interpreter)
  4. Docker时代来临,你的团队准备好了吗?
  5. HTML5体感游戏《守护拉普达》诞生记
  6. 数据库链、物化视图、高级复制方面
  7. Atlassian 域名被曝一次点击账户接管漏洞 可导致供应链攻击
  8. Spring - Netty (整合)
  9. windows curl ssl版本号编译
  10. 收费版APP三年总结(个人经验)