android使用隐藏api的方法(使用被@hide的api)

2023-11-11

前言:

一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类、方法或常量)是有原因的。其中很大的原因就是Android系统本身还在不断的进化发展中。从1.01.1到现在即将问世的Android 2.3.4。 这些隐藏的API本身可能是不稳定的,所以,使用隐藏API,意味着程序更差的兼容性。


    如果要我给出建议的话,最好还是不要使用隐藏的API。不过有时为了实现Android应用某些特殊的功能或者效果,隐藏的API往往能发挥意想不到的作用。这些API具体能做些什么事,我就不在这里举例了。正好,如果你不知道隐藏API能做什么的话,那么还是尽早放弃使用它们吧……


    不想长篇大论,直接进入正题吧。使用隐藏API主要有两种办法:一是我在《
Java反射机制的学习》一文中提到的反射的方法得到隐藏API;二是使用源码编译时生成的全编译的jarclasses.jar


    使用反射的方式,在这里就不详细介绍了,具体见《
Java反射机制的学习》。利用反射机制使用隐藏API的方法的优点是灵活,能够在不兼容的系统捕获异常,而使程序不至于崩溃;缺点是过程太繁杂,而且对于隐藏类的继承等很难实现。如果需要大量使用隐藏API,使用反射无疑会让程序员很烦的。


    这篇文章主要要介绍的就是通过导入全编译的classes.jar包,来实现对隐藏API的使用。这种方法实现简单,程序员编程也简单,就像是那些隐藏的APISDK中变得可见了一样。它的缺点就是兼容性问题,希望使用者引起重视,在使用时考虑清楚。

 

我们使用sdk在开发一个android项目时,往往不能使用被隐藏的api,比如说:
1.我们想实现应用的静默安装,我们不能使用

 
1 pm.installPackage(mPackageURI, observer, installFlags,installerPackageName);

2.使用大容量存储的相关功能时,不能使用

 
1 StorageManager s = (StorageManager) getSystemService(Context.STORAGE_SERVICE);

等等。。
以自带android自带的AlarmClock 为例,导入eclipse后,往往出现很多错误,如下图所示:

例如,上图中的Intent.ACTION_ALARM_CHANGED 无法访问,下面我们就找到源代码看看原因何在?

我所介绍的方法必须要在linux下编译,但仅仅只是编译sdk,开发还是在windows下,假如你现在还不会android源码编译,请先搞定这个,再往下看。下面的方法二真的是非常的方便,解决了我好多问题,强烈建议你耐心看看。

根据java 编程规范,我们知道这个api (静态变量)被隐藏掉了,所以在sdk中无法使用。在知道了原因之后,我们有几种解决方案(强烈建议使用方法二):

方法一:自己将源代码中的@hide去掉,然后编译一个sdk来替换默认的sdk。 
在linux上使用  make PRODUCT-sdk-sdk 命令,编译一个新的sdk出来,注意编译后其实我们不需要整个sdk,只需要android.jar这个文件替换掉sdk里的android.jar,例如:笔者的sdk里的jar对应的目录为:

F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar

具体编译sdk的方法是,在linux编译环境下用命令make PRODUCT-sdk-sdk ,成功后,会有如下提示:

Package SDK: out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86.zip

我们进入到linux编译环境的 out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86/platforms/android-2.2/目录下可以看到android.jar 文件。使用此文件替换   F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar 即可。替换前记得备份

此方法较为麻烦,建议使用方法二

方法二:添加framework 编译出来的classes.jar文件到eclipse的build path 
其实在编译android的时候,我们将framework 编译到一个临时的jar包中了,这个jar包的路径一般为:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
我们只需要在linux上android源代码目录下使用make 命令即可生成此文件。

由于这个jar文件中的api 还没有重新打包,里面被@hide掉的api并没有被去掉。所以我们依然能够引用里面被@hide的api。而sdk 中的android.jar文件时重新打包生成的,其里标记有@hide的api已经被去掉了。所以我们把 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar 拷贝到本地pc上。然后在工程中添加此jar包。
具体方法:
1 . 拷贝linux编译生成的 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar到本机PC。
2,在eclipse的Android项目中,选择项目属性->Java Build Path->Libraries->Add Library->User Library->Next-> UserLibraries进入到User Libraries管理界面,点击New新建一个User Library,比如android_framework,点击Add Jars把Jar包加入到建立的User Library中,最后点击OK。
3.选择项目属性->Java Build Path->Order and Export,使用右面的“UP”键,把所建立的User Libraries移到Android SDK的上面。这样做的意思就是优先使用classes.jar中的API,其次使用android.jar中的API。为什么不直接使用classes.Jar?因为我在使用时发现,android.jar中有的东西classes.jar中没有。

如下图:
 
之后我们的工程错误消失了:
 
到此问题基本解决.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android使用隐藏api的方法(使用被@hide的api) 的相关文章

  • APP开发如何批量生成不同尺寸的图标?

    在我们开发APP的时候 我们使用到大量的不同尺寸的APPLogo的图片 如下图 通常 我们的做法是和设计师沟通 让他们切出这儿所以的图片 然后我们一个一个图片放在对应的位置 这样处理的话 我们比较容易出错 比如说 图片的格式 苹果对图片的格
  • Genymotion推送2.6.0后几个问题自己解决的办法

    先上结果 注意版本号 Genymotion 2 6 0 VirtualBox 5 0 10 其实我用了官方的几种历史版本尝试组合了下没能解决最后是都单独更新解决的 到各自官网直接下载即可 反正vbox开了也是推送新版 Genymotion单
  • 当面试官说 “你还有什么问题想问的” ,你该如何回答?

    程序员面试时经常会听到面试官说一些套话 比如 今天的面试就到这里了 回去等通知吧 你还有什么问题想问我的吗 如果这道题不会做 那么我们也可以换一道 今天我们要说的是大多数面试官都会说的一句话 你还有什么问题想问的 这是一个老生常谈的问题 之
  • c++ java rgb与nv21互转

    目录 jni函数 c rgb转nv21 可以转 不报错 但是转完只有黑白图 java yuv420保存图片 先转nv21 再保存ok c yuv420月bgr互转 测试ok jni函数 JNIEXPORT void JNICALL Java
  • 装X指南之Xposed安装与配置

    一 前言 Xposed 能干嘛 我可以告诉你 Root Xposed 真的可以为所欲为 而 Android 开源 为 搞机 带了更多的乐趣的同时 当然也引入安全性问题 部分流氓软件在 Root 下 会盗取用户私密信息 例如 号码 照片 短信
  • Compose 动画边学边做 - 夏日彩虹

    引言 Compose 在动画方面下足了功夫 提供了种类丰富的 API 但也正由于 API 种类繁多 如果想一气儿学下来 可能会消化不良导致似懂非懂 结合例子学习是一个不错的方法 本文就带大家边学边做 通过高仿微博长按点赞的彩虹动画 学习和实
  • Android Studio Debug:编码五分钟,调试俩小时

    前言 整理并积累Android开发过程中用到的一些调试技巧 通过技巧性的调试技能 辅助增强代码的健壮性 安全性 正确性 案例一 抛出明显异常 常见的 除数为0问题 class MainActivty AppCompatActivity ov
  • ScrollView默认位置不是最顶部

    场景描述 在scrollview中套用了一个recycleview 发现 recycleview上面的部分TextView不能被显示 直接显示的是recycleview的底部 分析原因 在Activity计算窗口的高度时 是在listvie
  • RxJava 事件流之聚合

    Aggregation 前面介绍了如何过滤掉不需要的数据 如何根据各种条件停止发射数据 如何检查数据是否符合某个条件 这些操作对数据流来说都是非常有意义的 本节介绍如何根据数据流中的数据来生成新的有意义的数据 本节的操作函数会使用源 Obs
  • Android安卓webview,网页端生成安卓项目(极速生成)教程

    Android安卓webview 网页端生成安卓项目 极速生成 教程 一 前言 当自己做了一个PC端的页面 也就是前端的页面 或者已经上服的页面 但也想生成一个安卓端供用户使用 本教程详细讲解如何把前端html页面或者链接生成安卓端项目 本
  • 使用Flutter之后,我们的CPU占用率降了50%

    近年来 移动互联网迅猛发展 业务需求频繁更新 业务内容动态化需求急剧增加 纯原生开发已经无法满足业务快速增长的需求 因此诞生了多种跨平台开发框架 如 H5 原生开发 React Native 和 Weex 但这两年最受开发者青睐的莫过于 F
  • Flutter 完整示例

    经过这一段对 Flutter 的了解和接触 掌握如何完整使用 Flutter 开发一个项目 实际上 在 Flutter 中 一切皆 widget 我们的界面都是由各种 widget 堆叠出来的 一个 Flutter 工程涉及以下几个要点 工
  • 校园社区app

    此项目是面向在校大学生开发的一个集预约购物 组织活动 实事热帖于一体的社区app 前后台交互数据采用的是json数据格式 网络请求采用的是volley 后台采用mysql数据库 如果有写的不好的地方还望大家指正 主要功能为 预约购物 组织活
  • Android内存如何优化?阿里技术员工整理亲授,建议收藏

    作者 山鱿鱼说 链接 https juejin cn post 7106289745499521054 基础知识 内存概念 VSS Virtual Set Size 虚拟耗用内存 包含共享库占用的内存 RSS Resident Set Si
  • Android mob(sharesdk)微信分享/微信朋友圈分享/QQ分享/QQ空间分享/新浪微博分享(自定义)

    使用场景 H5混合开发转Android 原生开发 之前也是用的友盟分享 微信原生 QQ原生 微博原生分享 今天这个项目恰好是用的mob的sharesdk分享 老实说 还是第一次使用 一开始接手项目的时候 还以为mob是个后台 来一张效果图
  • Android Studio :Could not find com.android.tools.build:aapt2

    Android Studio 又一次升级 从Android Studio3 2升级到Android Studio3 3 每次升级都是抱着必死的很大的决心进行升级 就怕Android Studio罢工 到时候一番乱搞 问题大概是下面这个样子的
  • Android面试题最新整理,2022年最新版

    每年的9月和10月 是互联网大厂疯狂招人的时期 也是程序员们跳槽的黄金期 不知道你有没有幻想过这样一个场景 大厂的面试官说 恭喜你通过面试 明天来办理入职吧 今天 为大家整理了2022年Android大厂面试真题 刷企业历年真题 助你轻松搞
  • Android客户端apk自动检测更新自动下载自动安装的实现方法

    改进了一个可以检测版本更新自动下载自动安装的客户端升级方案 在下载之前删除之前的历史下载文件 减少垃圾数据 先给出核心类 public class DownloadService extends Service private Downlo
  • 小米手机无法调试应用解决Installation failed with message Failed to establish session.

    小米手机性价比高 有些问题也很尖锐 比如我的5S用了黑科技 试验品 超声波指纹解锁 识别率就很低 每次解锁都要哈口气 真后悔 而且最近又遇到新问题 我的小米5S无法通过android studio调试应用 卖批啊 但即使这样也比蓝绿工程的O
  • Android的基础开发

    基础开发 listView ListView就是列表条目 可以向下滚动 也可以点击 首先设置两个视图布局 activity main2 xml 充当容器 ListView

随机推荐

  • 华为OD机试真题 Java 实现【最远足迹】【2022Q4 100分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 一 题目描述 某探险队负责对地下洞穴进行探险 探险队成员在进行探险任务时 随身携带的记录
  • Java基础小测总结

    1 非抽象实现接口后 实现接口中方法的原则 两同两小一大原则 方法名相同 参数类型相同 子类返回类型小于等于父类方法返回类型 子类抛出异常小于父类方法抛出异常 子类访问权限大于等于父类方法访问权限 2 volatile关键字 被volati
  • 踩坑 calendar.getActualMaximum(calendar.DAY_OF_MONTH)函数

    当使用calendar getActualMaximum calendar DAY OF MONTH 获取每月最后一天时或者获取当季的最后一天时 会出现在二月的时候获取的不准确的情况 问题出现原因 代码没有动过 之前一直是使用这个时间函数来
  • 如何使用数字孪生和人工智能优化制造

    将数字孪生 digital twin 与人工智能 AI 相结合 可以减少甚至消除产品制造过程中的 臆测 几率 降低因不合理的想法实施带来的损失 那么 到底什么是数字孪生 它又是如何使现实中的生产过程变得更加高效的 CXO TALK采访了西门
  • 白嫖 IBM LinuxOne 服务器教程

    白嫖 IBM LinuxOne 教程 1 介绍 1 1前言 LinuxONE Community Cloud是IBM联合Marist大学为学生提供的用于测试应用程序和网站的平台 提供长达120天的免费VPS 温馨提醒 这个 VPS 是 S3
  • 游戏中关于跳跃的函数图像的推导以及应用

    跳跃应该是游戏开发中一个最常见的功能之一 实现的方法也有很多 这里我来讲一个我以前用的一个方法 正常的跳跃 如果使用物理引擎的话 就直接给一个向上的力就可以了 但是有一些游戏 例如跑酷 角色的移动速度都是越来越快的 而如果还是只给一个向上的
  • 【第2篇】VGG——引用最多的论文

    文章目录 摘要 1 引言 2 ConvNet配置 2 1 架构 2 2 配置 2 3 讨论 3 分类框架 3 1 训练 3 2 测试 3 3 实现细节
  • 什么是TPS,什么是QPS,区别是什么?

    一 TPS Transactions Per Second 每秒传输的事物处理个数 即服务器每秒处理的事务数 TPS包括一条消息入和一条消息出 加上一次用户数据库访问 业务TPS CAPS 每个呼叫平均TPS TPS是软件测试结果的测量单位
  • SpringBoot项目jwt生成token集成redis

    业务逻辑 1 用户登录 使用jwt生成token 2 后端把这个token返回给前端 同时把这个token作为key存储在redis中 用户对象作为value 并设置一个过期时间 3 用户以后每次访问都携带这个token 如果这个token
  • Redis--基础知识点--17--rdb_aof

    1 持久化 1 1 什么是持久化 持久化 Persistence 即把数据 如内存中的对象 保存到可永久保存的存储设备中 如磁盘 持久化Redis所有数据保持在内存中 对数据的更新将异步地保存到磁盘上 1 2 持久化的实现方式 快照方式持久
  • Jenkins 自由风格项目 更新网站静态文件

    要想去更新网站必须先创建新的任务 任务名写上网站的名字 现在去更新静态的logo图片是不需要编译的 所以这里不会用到创建maven项目 这里选择构建自由风格的软件项目 无需使用make ant maven去编译 创建好任务之后需要做一些配置
  • Java Controller层异常处理示例【含面试题】

    AI绘画关于SD MJ GPT SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 A
  • vscode 内置了 Settings Sync功能

    preface 好尴尬 昨天 刚写完了 通过 settings sync 插件 来同步 vscode 扩展配置 今早 刷 twitter 发现 微软内置了 同步插件 Settings Sync 同步的内容更多 操作更简单 1 客户机A 更新
  • 【C++】list 的使用

    如有侵权 请联系删除 目录 常用操作 要点总结 相关参考资料 常用操作 C 中的list是一种双向链表容器 提供了高效的插入和删除操作 下面是使用list的一些基本操作 包含头文件 在使用list之前 需要包含以下头文件 include
  • Explicit 关键字简介

    Explicit 关键字简介 explicit关键字用来修饰类的构造函数 表明构造函数是显示的 相对的是implicit关键字 首先这个关键字只能用在类内部的构造函数声明上 而不能用在类外部的函数定义上 它的作用是不能进行隐式转换 clas
  • ntp服务器不稳定,NTP服务器的管理如何保持如此准确?

    我们中的许多人对我们的计算机和其他设备偶尔出现问题 保留了准确的时间设置 但是与NTP服务器的快速同步使得一切顺利 但是如果我们自己的设备丢失准确性 NTP服务器如何保持这样准确 今天的问题 照片由LEOL30 Flickr 提供 问题 S
  • 信息化和数字化的本质区别有哪些?

    信息化和数字化的本质区别在于信息化以流程为中心 而数字化以业务为中心 数字化转型与传统信息化的主要区别在于 一方面传统信息化主要涵义是 流程 的信息化 而数字化的主要含义是构建 业务数字化 数字资产化 资产服务化 服务业务化 闭环 通过数字
  • Qt断开信号与槽

    关于信号与槽的研究 DisConnect bool QObject disconnect const QObject sender const char signal const QObject receiver const char me
  • git的安装配置与操作

    一 git 安装与配置 1 git 安装 windows 搜索 git for windows linux yum install y git 查看安装完成 git version git help 2 git 配置 A 配置用户信息 每一
  • android使用隐藏api的方法(使用被@hide的api)

    前言 一开始需要说明的是 Google之所以要将一些API隐藏 指加上 hide标记的public类 方法或常量 是有原因的 其中很大的原因就是Android系统本身还在不断的进化发展中 从1 0 1 1到现在即将问世的Android 2