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:包含各种的对设备上的数据进 ...
随机推荐
- UNP学习第13章 守护进程和inetd超级服务器
Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行. 源自Berkeley的syslogd实现在启动时执行以下步骤. (1)读取配置文件.通常为/etc/s ...
- kubernetes批量删除pod
监控页面出现看到有运行失败的pod 1) 查看有哪些不运行的podcustom-metrics-apiserver日志占满空间被驱逐 [root@hadoop03 ~]# kubectl get po ...
- 1.zabbix编译安装(环境lnmp)
zabbix服务端安装 1.使用脚本安装.脚本内容如下.安装完用http://192.168.159.20/zabbix #!/bin/bash #使用说明,此版本是针对程序安装路径不在/opt/下的 ...
- IDEA @Override is not allowed when implementing interface method(转载)
近期研究idea,在编码过程发现报错:@Override is not allowed when implementing interface method .找到一个老外的回答,感觉挺有用的,记录下 ...
- API参考文档
Android 中文版:http://www.apiref.com/android-zh/index.html Bootstrap3 教程:http://www.apiref.com/bootstra ...
- ubuntu18.04 点击启动器实现窗口最小化
gsettings set org.gnome.shell.extensions.dash-to-dock click-action 'minimize'
- 前端之间的url 传值
转自:https://www.cnblogs.com/candy-Yao/p/8858166.html
- C. Ancient Berland Circus(三点确定最小多边形)
题目链接:https://codeforces.com/problemset/problem/1/C 题意:对于一个正多边形,只给出了其中三点的坐标,求这个多边形可能的最小面积,给出的三个点一定能够组 ...
- h5唤醒手机拨打电话
jquery : $("#a").attr("href","tel:110");
- Cocos2d-x之Node
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 节点是cocosd-x游戏引擎中的重要元素,是其他重要游戏元素的基类,例如,场景Scene,图层Layer,菜单Menu和精灵sprite ...