android系统休眠唤醒服务修改

2019-07-14 03:20发布

此文档是结合MTK平台AC8321项目源码编写,结合8321平台源码阅读效果更佳。
一、GPS 休眠失败修改
frameworksaseservicescorejavacomandroidserverlocationGpsLocationProvider.java
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 函数中修改以下内容 else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)
|| PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action)
|| Intent.ACTION_SCREEN_OFF.equals(action)
|| Intent.ACTION_SCREEN_ON.equals(action)) {
Log.d(TAG, “mWakeLock.release();”);
if(Intent.ACTION_SCREEN_OFF.equals(action)){
if(mWakeLock!=null){
mWakeLock.setReferenceCounted(false);
mWakeLock.release();
}
}
updateLowPowerMode();
} else if (action.equals(SIM_STATE_CHANGED)) {
subscriptionOrSimChanged(context);
二、MediaScannerService 服务休眠失败修改
修改文件packagesprovidersMediaProvidersrccomandroidprovidersmediaMediaScannerService.java public static final String ACTION_QB_POWERON = “android.intent.action.SCREEN_ON”; public static final String ACTION_QB_POWEROFF = “android.intent.action.SCREEN_OFF”;
onCreate()函数增加以下内容
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(ACTION_QB_POWEROFF);
iFilter.addAction(ACTION_QB_POWERON);
registerReceiver(mPowerOnOffReceiver, iFilter);
增加广播处理函数
private BroadcastReceiver mPowerOnOffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (ACTION_QB_POWEROFF.equals(action)) {
MtkLog.i(TAG, “receivePowroff– wakelockrelease”);
mWakeLock.setReferenceCounted(false);
mWakeLock.release();
}else if (ACTION_QB_POWERON.equals(action)) {
MtkLog.i(TAG, “receivePowron– wakelockrelease”);
}
}
};
//——————————————–
onDestroy()函数中增加
unregisterReceiver(mPowerOnOffReceiver);
说明:也可以通过不启动此服务方式来解决休眠问题,目前大部分应用程序都已经不通过此服务来获取媒体文件信息。
目前 8321 项目不启动此服务。
三、修改 WIFI导致不能休眠问题
frameworksaseservicescorejavacomandroidserverConnectivityService.java
requestNetworkTransitionWakelock,这个函数会在 Default Network lost 的时候被调用,意图是阻止设备进入休眠,好让设
备在休眠之前切换到另外一个网络上面。所以会先通过 mNetTransitionWakeLock.acquire 获取一把锁,防止设备休眠,让
设定一个 60s 的定时器,60s 如果没有新的网络就会清除这把锁。这个是 Google Default 行为
修改:屏蔽 requestNetworkTransitionWakelock()函数中的
//mNetTransitionWakeLock.acquire();
四、基带释放锁
RIL.java (frameworksopt elephonysrcjavacomandroidinternal elephony)
BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {函数中增加释放锁处理 else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
if(mWakeLock!=null){
Rlog.d(RILJ_LOG_TAG, “x—-mWakeLock.release()–start”);
mWakeLockCount = 0;
mWakeLock.setReferenceCounted(false);
mWakeLock.release();
mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
Rlog.d(RILJ_LOG_TAG, ” —–mWakeLock.release()–end”);
}else{
Rlog.d(RILJ_LOG_TAG, “—–mWakeLock–>null”);
}
}//——
五、关闭四合一模块电源(8321 通过关闭 GPS 来实现,8127 通过关闭 BT 来实现) import android.location.LocationManager;
import android.provider.Settings;
private void SetGpsEnable(boolean bStatus){
Settings.Secure.setLocationProviderEnabled(mContext.getContentResolver(), LocationManager.GPS_PROVIDER, bStatus);
Log.v(TAG, “SetGpsEnable—–>”+bStatus);
}
六、解决第三方应用极限省电时使 ARM 休眠问题
PowerManagerService.java (v1frameworksaseservicescorejavacomandroidserverpower)
修改函数 goToSleepNoUpdateLocked()增加过滤
if (reason != PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON) {
Slog.e(TAG, “———–Goto sleep——————–”);
Slog.e(TAG, “———–Goto sleep——————–”);
Slog.e(TAG, “———–Goto sleep——————–”);
Slog.e(TAG, “uid=” + uid);
Slog.e(TAG, “reason=” + reason);
Slog.e(TAG, “———–Goto return——————–”);
Slog.e(TAG, “———–Goto return——————–”);
Slog.e(TAG, “———–Goto return——————–”);
return;
}
七、其他参考 8321 源码 Opandora.java 中的 HandleSleep()函数。
八、查找休眠锁方法
1、应用层休眠锁
通过执行 dumpsys power 命令获取当前阻止休眠的锁
具体操作步骤:
1)断 ACC
2)等待 20 秒左右。
3)以命令行的方式输入下列指令:
dumpsys power
4)查看是否有 PARTIAL_WAKE_LOCK Wake Locks: size=1
PARTIAL_WAKE_LOCK ‘AudioIn’ (uid=1013, pid=0, ws=WorkSource{10070})
5)每隔 2 秒钟重复一次第 3 步,共重复 5 至 10 次。 如果结果相同,说明 AudioIn可能释放失败了。
也可以用以下命令自动循环打印
while true
do
dumpsys power
sleep 2
done
2、底层休眠失败查询
执行 cat /proc/kmsg 打开底层打印,当底层阻止休眠时一般有 wakeup类字符打印或某个中断唤醒。 另附上android电源服务相关文献,以便以后自己查阅: http://blog.csdn.net/fskwypfsk/article/details/8629577
http://blog.csdn.net/kitty_landon/article/details/48654589
http://blog.csdn.net/myarrow/article/details/8136691 http://blog.sina.com.cn/s/blog_6240123301015zk3.html
http://www.cnblogs.com/tangdoudou/p/3807936.html
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075fc4d5bedfb6079370123b598938f4a85ac925f75ce786a6459db0144dc5bf0dc4755d627e44de8df4aa0fcad7384afa28d880311dd52756d87849c5b704f9634b6&p=c933cc16d9c116f51ebd9b7d0a13cd&newp=8366c54ad5c444e411b3c22d0214cf231610db2151d6db10349dcd1e&user=baidu&fm=sc&query=pm_autosleep_init&qid=&p1=1