Android中的隐藏API和Internal包的使用之获取应用电量排行
今天老大安排一个任务叫我获取手机中应用耗电排行(时间是前天晚上7点到第二天早上10点),所以在网上各种搜索,没想到这种资料还是很多的,发现了一个主要的类:PowerProfile,但是可以的是,这个类没有曝光给我们开发者,所以我们不能调用它
那怎么办呀?,还是有办法的,这个类是藏在:com.android.internal.os.PowerProfile
com.android.internal.os.PowerProfile.PowerProfile这个类就是负责解析记录文件,我们可以创建一个它的对象,通过该对象来获取具体信息。具体耗电计算比较复杂
下面来看一下案例:Demo是对2.3.3的settings源码修改的
(Demo下载地址:http://download.csdn.net/detail/jiangwei0910410003/7357717)
主要是给那些没有研究过这部分源码的同学。
settings中获取手机电量排行的原理主要是通过读取电池记录文件来实现的。主要用到了android.os.BatteryStats这个隐藏类和com.android.internal这特殊的个包。
隐藏类都好解决,主要是internal包,该包不但android.jar中没有,及时你找到该包,把它放到android.jar中,你会发现也是用不了的。原因是ADT对这个包加了限制。不让使用。
一种解决办法是修改ADT,将该限制去掉。(这种方式是很难实现的)
另外一种就是不把internal放到android.jar中,把他单独作为一个包导入到工程中,这样就不会被限制了
我们采用第二种方案去解决,这种方法也是最简单的
就是将这个包直接导入我们的工程,在工程中就可以使用隐藏API和Internal包了。
我们可以使用该包单独做一个平台,这在后面再讲。
注意:该包不能直接放在libs目录里面,请放到其他地方。因为ADT屏蔽了Internal包,直接放在libs下ADT会检测到。且放在外面的文件是不会打包到我们的apk文件中的,所以还可以减小了apk文件的体积。同理得出非系统包就一定要放在libs下,否则程序运行的时候就会报找不到包的错误。
下面就来看看到底如何制作这个jar包:
首先我们要明白为什么隐藏API(有@hide标记)和Internal包不能使用。
当我们使用android的SDK进行开发的时候都会用到一个非常重要的jar文件--android.jar(Android SDK目录/platforms/platform-X/android.jar,X是API等级)。这个包中移除了所有被标记的尾@hide的类、方法、枚举、字段和Internal包。当我们的程序在设备上运行的时候会加载设备上的一个framework.jar的文件,它包含了移除的部分。
所以我们的思路是想办法得到framework.jar将那些缺少的API拿出来放到android.jar中。当然这些都可以通过编译源码来解决,但那样太过麻烦。下面我介绍一种简单的方法来获取这些内容。
1,获取framework.jar
刚才也说了,设备上有这个文件,那么我们就从设备上来取。通过adb pull命令(也可以用DDMS):
adb pull /system/framework/framework.jar
我们需要该包中的classes.dex文件。这里从2.3.3以下模拟器上取,真机上一般是经过优化了的.odex文件,而2.3.3以上的模拟器中的这个文件中没有classes.dex文件。注意:真机中获取不到classes.dex文件的,所以要到模拟器中获取!
2,将framework.jar改成framework.zip,解压,得到里面的classes.dex文件。
3,将.dex文件转换成.jar格式。这里用到了dex2jar这个工具,知道反编译的同学都知道这个工具,下载地址:
http://download.csdn.net/detail/jiangwei0910410003/7346527
转换结束后会得到一个classes.dex.dex2jar.jar文件。
4,重命名classes.dex.dex2jar.jar成classes.dex.dex2jar.zip,解压。
5,将Android SDK目录/platforms/platform-X/中的android.jar拷贝出来,使用WinRAR打开,如图:
这里一定要注意,我们在android.jar的基础上添加classes-dex2.jar中的文件,同时要记得将更新方式选择为:跳过已经存在的文件:
然后点击确定,这时候android.jar就是我们需要的jar了,上面的操作有些人可能有些奇怪,为什么不将文件先都解压了,然后合并在进行压缩成zip,这里我们不知道为什么,反正我之前是这么做的,最后合成的jar的话,使用有问题,所以就纠结出了这种方法。
同时这里一定要记得选择是zip方式的,不然会报错:
OK,完成。
下面来看一下效果图:
这里面socket就是我们的应用,耗电量还是可以的。。。
总结:Android中很多的api我们是用不了的,后面我还会说到怎么使用反射的技术去访问那些隐藏和有访问限制的api,这个方式很使用的,后面用到的会很多。。
Android中的隐藏API和Internal包的使用之获取应用电量排行的更多相关文章
- Android中使用隐藏API(大量图解)
Android SDK的很多API是隐藏的,我无法直接使用.但是我们通过编译Android系统源码可以得到完整的API. 编译Android系统源码后可以在out\target\common\obj\ ...
- PHP 在 Laravel 中动态隐藏 API 字段
我最近在 Laravel Brasil 社区看到一个问题,结果比看起来更有趣.想象一下你有一个 UsersResource 用下面的实现: <?php namespace App\Http\Re ...
- Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解
在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...
- Android中使用HTTP服务
在Android中,除了使用java.net包下的API访问HTTP服务之外,我们还可以换一种途径去完成工作.Android SDK附带了Apache的HttpClient API.Apache Ht ...
- Android应用开发中如何使用隐藏API(转)
一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类.方法或常量)是有原因的.其中很大的原因就是Android系统本身还在不断的进化发展中.从1.0.1.1到 ...
- android 如何调用 隐藏的 API 接口
怎样查看并且使用 Android 隐藏 API 和内部 APIhttps://www.jianshu.com/p/fbf45770ecc8 android 隐藏API显式调用以及内部资源使用方法htt ...
- Android中获取应用程序(包)的信息----PackageManager
本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下: 第一部分: 获取应用程序的packagena ...
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
通过第一部分<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>的介绍,对PackageManager以及 AndroidMani ...
- Android中常见功能包描述(转)
在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进 ...
随机推荐
- 深入了解 Flink 网络栈(二):监控、指标和处理背压
在之前的文章中,我们从高级抽象到底层细节各个层面全面介绍了 Flink 网络栈的工作机制.作为这一系列的第二篇文章,本文将在第一篇的基础上更进一步,主要探讨如何监视与网络相关的指标,从而识别背压等因素 ...
- 【LeetCode 32】最长有效括号
题目链接 [题解] 设dp[i]表示以第i个字符结尾的最长有效括号的长度. 显然只要考虑s[i]==')'的情况 则如果s[i-1]=='(',则dp[i] = dp[i-2]+2; 如果s[i-1] ...
- mysql数据库优化学习
目的避免出现页面访问错误慢查询造成页面无法加载阻塞造成数据无法提交优化从sql及索引,数据库结构,系统配置,硬件 日志慢查询日志: show variables like 'slow_query_ ...
- IP地址的定义和划分
IP地址分类: IP地址根据首首字节开始位可以分为5大类: 分类 首字节开始位 首字节数字范围 ...
- [NOIP模拟测试31]题解
A.math 考场乱搞拿了95,2333. 考虑裴蜀定理:$ax+by=z$存在整数解,当且仅当$gcd(a,b)|z$. 那么如果某个数能够被拼出来,就必须满足所有$a_i$的$gcd$是它的因子. ...
- 探索Redis设计与实现5:Redis内部数据结构详解——quicklist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!
老生常谈 什么是 Retrofit ? Retrofit 早已不是什么新技术了,想必看到这篇博客的大家都早已熟知,这里就不啰嗦了,简单介绍下: Retrofit 是一个针对 Java 和 Androi ...
- HTML-参考手册: HTML 拾色器
ylbtech-HTML-参考手册: HTML 拾色器 1.返回顶部 1. HTML 拾色器 选取颜色: 或输入颜色值: OK 或使用 HTML5: 选择的颜色: 黑色文本 阴影 白色文本 阴 ...
- Nginx网络架构实战学习笔记(五):大访问量优化整体思路、ab压力测试及nginx性能统计模块、nginx单机1w并发优化
文章目录 大访问量优化整体思路 ab压力测试及nginx性能统计模块 ab压力测试及nginx性能统计模块 ab压力测试 nginx性能统计模块 nginx单机1w并发优化 整装待发: socket ...
- upc组队赛3 T-net【贪心】
T-net 题目描述 T-net which is a new telecommunications company, plans to install its base stations in th ...