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:包含各种的对设备上的数据进 ...
随机推荐
- 学习java设计模式有用吗?懂这六个原则,编程更轻松
学习java设计模式有用吗?懂这六个原则,编程更轻松 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实 ...
- String path = request.getContextPath();报错
String path = request.getContextPath();报错 1. 右击该项目 - Build Path - Configure Build Path , 在 Libraries ...
- bzoj 2015
http://www.lydsy.com/JudgeOnline/problem.php?id=2015 裸最短路(' ' ) 不过我最初以为是mst (' ' ) #include & ...
- UNP学习第四章tcp
一.TCP简单流程图 因为对于server我已经写过一篇笔记了:http://www.cnblogs.com/ch122633/p/8315883.html 所以我想再补充一些对于client的部分的 ...
- [CSP-S模拟测试62]题解
A.Graph 因为点可以随便走,所以对于每个联通块,答案为边数/2向下取整. 用类似Tarjan的方式,对于每个联通块建立一棵搜索树,尽量让每一个节点的儿子两两配对,如果做不到就用上头顶的天线. # ...
- dos添加文件夹属性!
attrib 显示所有文件的属性:参数:+r或-r [文件名] 设置文件属性是否为只读 +h或-h [文件名] 设置文件属性是否隐含 +s或-s [文件名] 设置文件属性是否为系统文件 +a或-a [ ...
- ICO和区块链区别
区块链项目众筹(ICO)浅析 2017-07-25 原创 Fintech科普大使 ICO是区块链初创公司项目融资的重要方式类似于Kickstarter众筹,但有不同之处(具体在下一节详述),可以避开传 ...
- Nodejs-交互式版本管理
n - npm:Interactively Manage Your Node.js Versions
- Idea JAVA項目的导入JAR包和导出jar包
一.IDea项目中导入jar包 打开菜单project structure,然后选择modules/dependencies下选择右侧的+,选择jar包目录中的jar文件,导入 二.导出jar包 菜单 ...
- 快速调通支付宝当面付Demo
1.访问如下地址: https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fp ...