唤醒对齐是Android 4.4的一个新特性,小米的MIUI V5中也有类似的特性。在Android 4.4的唤醒机制中,为了省电,AlarmManager会把唤醒的请求进行对齐。细节可参考SDK中AlarmManager的说明。坏处是以前要求8点准时的闹钟,现在可能会被调整到8点10。应用程序可通过setWindow或setExact来要求大概齐时间定时或精确定时。
但Android 4.4的对齐唤醒仅仅针对使用SDK level 19编译出的应用有效,之前SDK编译出的应用是无效的。我们可以通过反编译framework来修改AlarmManager,让其对之前版本SDK编译的应用也生效。
通过阅读Android4.4的源码 ,我们可以知道AlarmManager类中,mAlwaysExact这个变量是控制是否使用对齐唤醒的关键,mAlwaysExact的值为false则可以使用对其唤醒。mAlwaysExact又是根据应用程序的上下文的targetSdkVersion来确定值的。
AlarmManager(IAlarmManager service, Context ctx) {
mService = service;
final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion;
mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KITKAT);
}
下面我们就来对AlarmManager动手,来强制使用对齐唤醒。
首先手机必须有root权限,提取出/system/framework/framework.jar,然后使用baksmali对其进行反编译。
java -jar baks