首页 文章 精选 留言 我的

精选列表

搜索[主题管理],共10000篇文章
优秀的个人博客,低调大师

Android电源管理系列之PowerManagerService(二)

WakeLock机制 PowerManager.WakeLock 为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,直至停止CPU进入休眠。WakeLock是Android提供的唤醒锁机制,用来保持CPU运行或避免屏幕变暗/关闭以及避免键盘背光灯熄灭 唤醒锁的类型: Flag CPU Screen Keyboard PARTIAL_WAKE_LOCK on off off SCREEN_DIM_WAKE_LOCK on Dim off SCREEN_BRIGHT_WAKE_LOCK on Bright off FULL_WAKE_LOCK on Bright on 如果是PARTIAL_WAKE_LOCK,无论屏幕的状态或是按下电源键, CPU都将正常工作。如果是其它的唤醒锁,设备会在用户按下电源钮后停止工作进入休眠状态。以上四种锁,除了PARTIAL_WAKE_LOCK,其余的锁在API level 17已经被deprecated了。 唤醒锁的使用方法 代码使用: PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); wl.acquire(); //acquire时尽量申明timeout时间// ... do work...wl.release(); 权限申明: <uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.DEVICE_POWER"/> 在应用程序中使用WakeLock时必须申明权限,acquire请求唤醒锁时尽量设置timeout时间释放WakeLock,以避免长时间持有WakeLock导致系统无法休眠。 唤醒锁的实现:frameworks/base/core/java/android/os/PowerManager.java public final class WakeLock { private int mFlags; private String mTag; private final String mPackageName; private final IBinder mToken; private int mCount; private boolean mRefCounted = true; private boolean mHeld; private WorkSource mWorkSource; private String mHistoryTag; private final String mTraceName; ...... WakeLock(int flags, String tag, String packageName) { mFlags = flags; mTag = tag; mPackageName = packageName; mToken = new Binder(); mTraceName = "WakeLock (" + mTag + ")"; } ...... } updatePowerStateLocked frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java protected void updatePowerStateLocked() { // 服务没有ready,mDirty值没有设置情况下不做更新操作 if (!mSystemReady || mDirty == 0) { return; } if (!Thread.holdsLock(mLock)) { Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked"); } try { // Phase 0: 更新基本状态 updateIsPoweredLocked(mDirty); updateStayOnLocked(mDirty); updateScreenBrightnessBoostLocked(mDirty); // Phase 1: Update wakefulness. // Loop because the wake lock and user activity computations are influenced // by changes in wakefulness. final long now = SystemClock.uptimeMillis(); int dirtyPhase2 = 0; for (;;) { int dirtyPhase1 = mDirty; dirtyPhase2 |= dirtyPhase1; mDirty = 0; updateWakeLockSummaryLocked(dirtyPhase1); updateUserActivitySummaryLocked(now, dirtyPhase1); if (!updateWakefulnessLocked(dirtyPhase1)) { break; } } // Phase 2: Update display power state. boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2); // Phase 3: Update dream state (depends on display ready signal). updateDreamLocked(dirtyPhase2, displayBecameReady); // Phase 4: Send notifications, if needed. finishWakefulnessChangeIfNeededLocked(); // Phase 5: Update suspend blocker. // Because we might release the last suspend blocker here, we need to make sure // we finished everything else first! updateSuspendBlockerLocked(); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } } 首先来看updateIsPoweredLocked(mDirty); private void updateIsPoweredLocked(int dirty) { if ((dirty & DIRTY_BATTERY_STATE) != 0) { final boolean wasPowered = mIsPowered; final int oldPlugType = mPlugType; final boolean oldLevelLow = mBatteryLevelLow; mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY); mPlugType = mBatteryManagerInternal.getPlugType(); mBatteryLevel = mBatteryManagerInternal.getBatteryLevel(); mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow(); if (wasPowered != mIsPowered || oldPlugType != mPlugType) { mDirty |= DIRTY_IS_POWERED; // Update wireless dock detection state. final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update( mIsPowered, mPlugType, mBatteryLevel); // Treat plugging and unplugging the devices as a user activity. // Users find it disconcerting when they plug or unplug the device // and it shuts off right away. // Some devices also wake the device when plugged or unplugged because // they don't have a charging LED. final long now = SystemClock.uptimeMillis(); if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType, dockedOnWirelessCharger)) { wakeUpNoUpdateLocked(now, "android.server.power:POWER", Process.SYSTEM_UID, mContext.getOpPackageName(), Process.SYSTEM_UID); } userActivityNoUpdateLocked( now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); // Tell the notifier whether wireless charging has started so that // it can provide feedback to the user. //Bug293654, zhanghong.wt, modify, 20170914, modify no notificatin ring while plugging USB if (dockedOnWirelessCharger || (mIsPowered && oldPlugType != mPlugType&&("1".equals(SystemProperties.get("sys.boot_completed"))))) { mNotifier.onWirelessChargingStarted(); } } if (wasPowered != mIsPowered || oldLevelLow != mBatteryLevelLow) { if (oldLevelLow != mBatteryLevelLow && !mBatteryLevelLow) { if (DEBUG_SPEW) { Slog.d(TAG, "updateIsPoweredLocked: resetting low power snooze"); } mAutoLowPowerModeSnoozing = false; } updateLowPowerModeLocked(); } } } 最后附上PowerManagerService 总结图

优秀的个人博客,低调大师

用python(pyvmomi)管理vmware ESXi/vCenter

环境 开发环境:Ubuntu 18.04 + python3.7以下环境经过测试都可以使用:centos 6/7 + python3.4/3.6/3.7 和windows 7/2016 +python3.4/3.6/3.7 安装必要模块pyvmomi pip install pyvmomi 如果是linux系统有pip2和pip3 两个版本,需要使用 pip3 install pyvmomi 代码 host='ESXi 机器ip' user='root' password='密码' port=443#端口 context = None if hasattr(ssl, '_create_unverified_context'): context = ssl._create_unverified_context() si = SmartConnect(host=host,user=user,pwd=password,port=port,sslContext=context) if not si: print("帐号密码有问题") atexit.register(Disconnect, si) ################################################################################################### def WaitForTasks(tasks, si):#任务 pc = si.content.propertyCollector taskList = [str(task) for task in tasks] objSpecs = [vmodl.query.PropertyCollector.ObjectSpec(obj=task) for task in tasks] propSpec = vmodl.query.PropertyCollector.PropertySpec(type=vim.Task,pathSet=[], all=True) filterSpec = vmodl.query.PropertyCollector.FilterSpec() filterSpec.objectSet = objSpecs filterSpec.propSet = [propSpec] filter = pc.CreateFilter(filterSpec, True) try: version, state = None, None while len(taskList): update = pc.WaitForUpdates(version) for filterSet in update.filterSet: for objSet in filterSet.objectSet: task = objSet.obj for change in objSet.changeSet: if change.name == 'info': state = change.val.state elif change.name == 'info.state': state = change.val else: continue if not str(task) in taskList: continue if state == vim.TaskInfo.State.success: taskList.remove(str(task)) elif state == vim.TaskInfo.State.error: raise task.info.error version = update.version finally: if filter: filter.Destroy() def getvmname():#打印所有虚拟机名 content = si.RetrieveContent() for child in content.rootFolder.childEntity: if hasattr(child, 'vmFolder'): datacenter = child vmFolder = datacenter.vmFolder vmList = vmFolder.childEntity for vm in vmList: print(vm.summary.config.name) print(vm.name) def getvmstatus(vm_name):#获取虚拟机状态 content = si.RetrieveContent() for child in content.rootFolder.childEntity: if hasattr(child, 'vmFolder'): datacenter = child vmFolder = datacenter.vmFolder vmList = vmFolder.childEntity for vm in vmList: if vm.summary.config.name == vm_name : print(vm.summary.runtime.powerState) def poweronvm(vm_name):#打开虚拟机 content = si.content objView = content.viewManager.CreateContainerView(content.rootFolder,[vim.VirtualMachine],True) vmList = objView.view objView.Destroy() tasks = [vm.PowerOn() for vm in vmList if vm.name in vm_name] print(tasks) WaitForTasks(tasks, si) print("虚拟机启动成功") def get_vmsnapshotinfo(vm_name):#查看快照信息 content = si.RetrieveContent() container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True) for c in container.view: if c.name == vm_name: snapshots = c.snapshot.rootSnapshotList return snapshots def get_vmlist():#获取虚拟机列表 content = si.RetrieveContent() for child in content.rootFolder.childEntity: if hasattr(child, 'vmFolder'): datacenter = child vmFolder = datacenter.vmFolder vmList = vmFolder.childEntity return vmList def re_snapshot(vm_name,snapshot_name):##恢复快照 for vm in get_vmlist(): pass #print(vm.name) if vm.name == vm_name: snapshots = vm.snapshot.rootSnapshotList for snapshot in snapshots: print(snapshot.name) if snapshot_name == snapshot.name: snap_obj = snapshot.snapshot print ("恢复快照", snapshot.name) task = [snap_obj.RevertToSnapshot_Task()] WaitForTasks(task, si) #re_snapshot("虚拟机名","快照名") #恢复快照 #print(get_vmsnapshotinfo("虚拟机名")) #获取虚拟机快照信息 #print(get_vmsnapshotinfo("虚拟机名"))#查看虚拟机快照 #poweronvm("虚拟机名") #打开虚拟机 其它功能我闲了就增加如果有其它着急需求或者使用方法可以回帖寻求帮助

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册