今天老大安排一个任务叫我获取手机中应用耗电排行(时间是前天晚上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包的使用之获取应用电量排行的更多相关文章

  1. Android中使用隐藏API(大量图解)

    Android SDK的很多API是隐藏的,我无法直接使用.但是我们通过编译Android系统源码可以得到完整的API. 编译Android系统源码后可以在out\target\common\obj\ ...

  2. PHP 在 Laravel 中动态隐藏 API 字段

    我最近在 Laravel Brasil 社区看到一个问题,结果比看起来更有趣.想象一下你有一个 UsersResource 用下面的实现: <?php namespace App\Http\Re ...

  3. Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解

    在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...

  4. Android中使用HTTP服务

    在Android中,除了使用java.net包下的API访问HTTP服务之外,我们还可以换一种途径去完成工作.Android SDK附带了Apache的HttpClient API.Apache Ht ...

  5. Android应用开发中如何使用隐藏API(转)

    一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类.方法或常量)是有原因的.其中很大的原因就是Android系统本身还在不断的进化发展中.从1.0.1.1到 ...

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

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

  7. Android中获取应用程序(包)的信息----PackageManager

    本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:   第一部分: 获取应用程序的packagena ...

  8. Android中获取应用程序(包)的大小-----PackageManager的使用(二)

    通过第一部分<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>的介绍,对PackageManager以及 AndroidMani ...

  9. Android中常见功能包描述(转)

    在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进 ...

随机推荐

  1. mac终端命令--常用快捷键

    Ctrl + c        取消当前行输入的命令,进入下一行.或者中止一个错误的或者发疯的命令 Ctrl + a        光标移动到行首(Ahead of line),相当于通常的Home ...

  2. cocos2D-X call JNIHelper

    #ifndef _WIN32 JNIEnv *j = JniHelper::getEnv(); if (j == nullptr || j == NULL) {test += "JNIEnv ...

  3. Mybatis基于XML配置SQL映射器(二)

    Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档  sysUse ...

  4. UVa 839 Not so Mobile (递归思想处理树)

    Before being an ubiquous communications gadget, a mobilewas just a structure made of strings and wir ...

  5. 项目质量管理—七种基本质量工具

    出处:PMBOK(第五版) P236 1.因果图,又称鱼骨图或石川图 用来追溯问题来源,回推到可行动的根本原因.(找根本原因) 2.流程图,也称过程图 用来显示在一个或多个输入转化成一个或多个输出的过 ...

  6. 一起探讨下POST、GET请求

    以下的讨论都是基于java和Spring MVC,主要记录自己的一些练习心得. 做web网站开发HTTP请求必不可少,一直在使用写好的Utils没有考虑过如何以及为什么,现在闲下来想着捋一捋java的 ...

  7. 2019ccpc秦皇岛/Gym102361 D - Decimal 签到

    题意: 给定n,判断1/n是否在十进制下无限循环 题解:判断n的是否包含除2,5以外的因数即可 #include<iostream> #include<cstdio> #inc ...

  8. C++ pair

    C++ pair Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一 ...

  9. HTML-参考手册: HTML ISO-8859-1

    ylbtech-HTML-参考手册: HTML ISO-8859-1 1.返回顶部 1. HTML ISO-8859-1 参考手册 现代的浏览器支持的字符集: ASCII 字符集 标准 ISO 字符集 ...

  10. Python Tuple元组的操作说明

    Tuple的特性在于,它的元素是不可变的(immutable),一旦设定,就不能使用索引去修改. >>> t1=1,2,3,4,5 #给Tuple赋值 >>> t1 ...