android中如何使用隐藏的api和internal包

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([email protected])和Internal包不能使用。

当我们使用android的SDK进行开发的时候都会用到一个非常重要的jar文件--android.jar(Android SDK目录/platforms/platform-X/android.jar,X是API等级)。这个包中[email protected]段和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,完成。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值