Android5.1--电源管理之省电模式分析

2023-05-16

 一、如何开启5.0省电模式

打开安卓5.0设备的设置选项,然后前往电池菜单,点击菜单键,弹出并选择“节电助手”,随后点击顶部的开关便可。

此外,要是用户运行的是原生版安卓,可以下拉安卓通知中心,然后点击电池按钮,便可进入电池界面,找到“省电模式”。

            

开启此模式后,屏幕亮度会调低,后台数据(大部分)关闭,动画全部取消,震动关闭,基本上和厂商们的省电模式行为差不多,都是以牺牲可用性来换取使用时间

不同的是,开启此模式后,Android 5.0除了一个通知图标之外,还会用无处不在的亮橙色来提醒你:顶部状态栏、底部通知栏全部变为橙色,很多图标等素材资源增加橙色,甚至一些应用的顶部栏里也会变色。

二、相关代码

设置应用入口文件:

./packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverSettings.java

 

托盘显示:

./frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java

 

托盘中callback回调函数onPowerSaveChanged():

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java

 

onPowerSaveChanged():(systemui内部处理)

./frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeService.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java

 

GPS根据mode 更新处理:

./frameworks/base/services/core/java/com/android/server/location/GpsLocationProvider.java:

 

发送模式切换ing/切换 广播:

./frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

 

voice根据mode 更新处理:

./frameworks/base/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java

三、省电模式流程分析

1、设置应用入口文件:

./packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverSettings.java

节能助手开启或关闭时,调用onSwitchChanged方法,参数isChecked表示节能助手处于开启(true)或关闭(false)状态。开启时isChecked为true,发送消息mStartMode开启新线程开启省电模式;否则关闭省电模式。

2、提供调用接口文件:

.\frameworks\base\core\java\android\os\PowerManager.java

3、发送模式切换广播:

./frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

mIsPowered变量表示充电状态,true表示正在充电(已接入电源),否则为false;setLowPowerModeInternal方法中首先判断mIsPowered是否处于充电状态,如果正在充电则直接返回false,表示不允许设置省电模式(省电模式会在设备充电时自动关闭)。

接着根据参数mode的值设置系统变量”low_power”(LOW_POWER_MODE),并设置变量mLowPowerModeSetting(Current state of the low power mode setting.表示设置低电模式的当前状态;从系统设置中获取的值,即数据库字段“low_power”的值)。

接下来设置变量mAutoLowPowerModeSnoozingThe user turnedoff low power mode below the trigger level表示电量低于省电模式的触发点时,关闭省电模式)。该变量值是由mAutoLowPowerModeConfigured(自动开启省电模式的当前状态,即数据库字段“low_power_trigger_level”是否为0的值;不为0时表示打开了自动开启功能,该变量为true)和mBatteryLevelLowTrue if the battery level is currentlyconsidered low.如果电池电量低为true)这两个变量决定的。当电量低并且允许自动设置省电模式时,如果此时省电模式是开启的,就要设置mAutoLowPowerModeSnoozing的值为false;如果省电模式是关闭的,就要设置mAutoLowPowerModeSnoozing的值为true。就是要求mAutoLowPowerModeSnoozing变量与省电模式的逻辑保持一致。

调用updateLowPowerModeLocked方法。

最后直接返回true,表示省电模式设置成功。

首先判断如果当前正在充电并且开启了省电模式,则关闭省电模式,将“low_power”字段设置为0,mLowPowerModeSetting置为false。

接着创建两个临时变量autoLowPowerModeEnabled和lowPowerModeEnabled。autoLowPowerModeEnabled(当前没有充电,自动开启省电模式,电量低于省电模式的电量触发点时不关闭省电模式,电池电量低,以上条件均满足时为true);lowPowerModeEnabled(当mLowPowerModeSetting或autoLowPowerModeEnabled为真时,则设置为true);根据lowPowerModeEnabled临时变量值和mLowPowerModeEnabled(true表示设备处于省电模式,全局变量)判断是否执行省电模式的功能。当两者状态不一致时,更新mLowPowerModeEnabled状态值。

接着调用powerHintInternal方法;之后使用后台线程BackgroundThread处理事件,会先后发送action为ACTION_POWER_SAVE_MODE_CHANGING和ACTION_POWER_SAVE_MODE_CHANGED的广播,注意这两个广播中设置了addFlags为Intent.FLAG_RECEIVER_REGISTERED_ONLY,表示只有动态定义的广播接收器才能接收到该广播,在发送ACTION_POWER_SAVE_MODE_CHANGING广播的时候传递数据“mode”的值。在发送这两个广播中间设置LowPowerModeListener,调用该接口的onLowPowerModeChanged方法(此处下文介绍)。

这里先分析一下powerHintInternal方法的处理。

powerHintInternal(POWER_HINT_LOW_POWER,lowPowerModeEnabled ? 1 : 0)。注意:POWER_HINT_LOW_POWER是在hardware/libhardware/include/hardware/power.h中定义的。

4、JNI层函数调用

frameworks\base\services\core\jni\com_android_server_power_PowerManagerService.cpp。

调用静态方法nativeSendPowerHint,gPowerModule是power_module类型的结构体,

下面分析一下power_module(电源模块)结构体。每个硬件模块必须有一个名为HAL_MODULE_INFO_SYM的数据结构,这个数据结构的字段必须以hw_module_t开始后跟模块的详细信息。该结构体中定义了一个hw_module_t结构体(common)和三个函数(init,setInteractive,powerHint)。Power_module的定义如下:

Typedefstruct power_module {

         Struct hw_module_t common;

         Void (*init) (struct power_module*module);

         Void (*setInteractive)(structpower_module *module, int on);

         Void (*powerHint)(struct power_module*module, power_hint_t hint, void *data);

}power_module_t;

1)        (*init)():设置电源管理在运行时启动的设置动作,例如设置默认的CPU频率参数。只供由PowerManagerService加载的Power HAL实例调用。

2)        (*setInteractive)():该方法用来执行关闭屏幕后进入非交互状态,同时打开屏幕之前进入交互状态;参数on表示当系统转变为交互状态或唤醒状态时是一个非0值,当转变为非交互状态或asleep状态时为0;该方法典型的操作就是打开或关闭设备,调整CPU频率参数。当系统进入非交互状态时该函数还可以调用相应接口允许内核挂起系统进入低电睡眠状态;当系统进入交互状态时禁止低电挂起。

3)        (*powerHint)():根据电源需求传递提示信息,这可能会导致  CPU频率的调整和一些控制项的功耗/性能的调整。可能的提示是:

POWER_HINT_VSYNC(垂直同步):前台应用从SurfaceFlinger中启动或停止请求一个VSYNC脉冲。如果该应用已开始请求VSYNC,然后CPU和GPU很快加载,可能会适当加快CPU和存储器速度。该参数为非0值表示需要请求VSYNC,若为0表示不再需要请求VSYNC。

POWER_HINT_INTERACTION:用户与设备交互,例如触摸屏事件。CPU和GPU会加速加载,适当提高CPU频率,存储器总线,此参数暂时没有使用。

POWER_HINT_LOW_POWER:省电模式的激活或关闭。省电模式是以消耗性能为代价的。非0值表示开启省电模式,为0时表示已关闭省电模式。

5、Native层函数调用IPowerManager.cpp

frameworks\native\services\powermanager\IPowerManager.cpp

采用binder通信方式,将POWER_HINT_LOW_POWER和开启标志发送到服务端处理。

ACTION_POWER_SAVE_MODE_CHANGING广播接收器

1、BatteryController.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java

在BatteryController类中接收到ACTION_POWER_SAVE_MODE_CHANGING广播后获取传递的“mode”数据值,作为setPowerSave方法的参数,如果mode值与当前mPowerSave值相等,则直接返回,若不相等则赋值给当前mPowerSave值;并调用firePowerSaveChanged方法。

在firePowerSaveChanged方法中,遍历BatteryStateChangeCallback对象,并调用接口的onPowerSaveChanged方法。这里为什么是一个列表呢? (凡实现了该接口的类,均在这个列表中保存)。

ArrayList<BatteryStateChangeCallback>mChangeCallbacks =newArrayList<>();

2、BatteryMeterView.java(电池计量器)

frameworks\base\packages\SystemUI\src\com\android\systemui\BatteryMeterView.java

BatteryMeterView类实现了BatteryController.BatteryStateChangeCallback接口,回调onPowerSaveChanged方法,在onPowerSaveChanged方法中调用invalidate方法会刷新界面。

在getColorForLevel方法中,如果处于省电模式,则返回省电模式设置的颜色值:battery_saver_mode_color(#fff4511e)

3、PowerUI.java

在PowerUI.java中注册广播接收器,监听省电模式设置,分别接收action为POWER_SAVE_MODE_CHANGING和POWER_SAVE_MODE_CHANGED的广播,接收到广播后分别调用setSaverMode方法和updateSaverMode方法。

在setSaverMode方法中调用内部接口WarningsUI的showSaverMode方法。PowerNotificationWarning实现了WarningsUI接口,因此调用PowerNotificationWarnings的showSaverMode方法。

4、设置通知:PowerNotificationWarnings.java

frameworks\base\packages\SystemUI\src\com\android\systemui\power\PowerNotificationWarning.java

PowerNotificationWarnings中有几个变量:mSaver表示是否开启了省电模式;mInvalidCharger表示无效充电器;mWarning表示

mSaver为true时,showSaverNotification()方法被调用,显示节电助手已开启的通知。

在节电助手通知栏中添加一个Action,触发一个动作为ACTION_STOP_SAVER(PNW.stopSaver)的广播事件,这个事件用来关闭省电模式。

接着判断hasSaverSettings方法返回值,在该方法中调用了Intent.resolveActivity方法,该方法的含义是:如果当前设备上不存在可接收某种隐式Intent的应用程序,则调用startActivity()的应用程序将会崩溃。为了预先判断一下是否存在可接收Intent的应用程序,调用Intent对象的resolveActivity方法。如果结果非空,则表示至少存在一个可处理该Intent的应用程序,并且可安全调用startActivity方法。如果结果为null,请勿再使用该Intent,并尽可能关闭那些会发起该Intent的功能。

为该Notification添加一个PendingIntent(android.settings.BATTERY_SAVER_SETTINGS),因此调用Notification.Builder.setContentIntent方法。目前没有该action的广播接收器。 因此点击该通知时没有反应。

最后调用mNoMan.notifyAsUser(TAG_NOTIFICATION,ID_NOTIFICATION, nb.build(), UserHandle.CURRENT); 发出这个通知。

5、降低屏幕亮度

在PowerManagerService中更新电源状态的时候调用updateDisplayPowerStateLocked方法时,会获取省电模式状态,保存在DisplayPowerRequest的lowPowerMode属性中。

mDisplayPowerRequest.lowPowerMode =mLowPowerModeEnabled;

最终调用到DisplayPowerController类中,在updatePowerState方法中设置屏幕亮度值,如果处于省电模式状态,设置屏幕亮度值减半处理;

PowerMnagerInternal.LowPowerModeListener

此处回过头来看看PowerManagerService的updateLowPowerModeLocked方法中生成的PowerMnagerInternal.LowPowerModeListener数组。

该数组是由所有实现PowerMnagerInternal.LowPowerModeListener接口的类组成的。

1、取消震动效果:VibratorService.java

frameworks\base\services\core\java\com\android\server\VibratorService.java

在systemReady方法中注册省电模式监听器,当省电模式发生改变时回调onLowPowerModeChanged方法,该方法中调用updateInputDeviceVibrators方法。

在updateInputDeviceVibrators方法中获取省电模式状态。

mLowPowerMode = mPowerManagerInternal.getLowPowerModeEnabled();

VibratorService类中startVibrationLocked方法负责震动效果,首先判断是否处于省电模式,若为省电模式直接返回,不再做震动操作。

2、取消动画设置:WindowManagerService.java

frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

         在WindowManagerService的构造方法中,注册省电模式的监听器,当回调onLowPowerModeChanged方法时,比较mAnimationDisabled(窗口动画的使能状态)与省电模式使能状态,如果不相等则为mAnimationDisabled赋值并调用dispatchNewAnimatorScaleLocked方法。

在diapatchNewAnimatorScaleLocked方法中发送H.NEW_ANIMATOR_SCALE消息。

mH接收到H.NEW_ANIMATOR_SCALE消息时,是如何处理的呢?首先调用getCurrentAnimatorScale方法获取当前动画持续时间比,如果处于省电模式状态则返回0,不再开启动画效果。

ACTION_POWER_SAVE_MODE_CHANGED广播接收器

1、PowerUI.java

         接收到ACTION_POWER_SAVE_MODE_CHANGED广播后,更新省电模式状态。

此时调用到PowerNotificationWarning的setSaverMode方法中,如下

以下处理流程同接收到ACTION_POWER_SAVE_MODE_CHANGING广播后一样,只是当省电模式状态相等时就会return。

2、BatteryController.java

接收ACTION_POWER_SAVE_MODE_CHANGED广播,更新省电模式状态。

此时if语句成立,直接返回。

3、KeyguardStatusBarView.java、StatusBarHeaderView.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java

在KeyguardStatusBarView类和StatusBarHeaderView类中onPowerSaveChanged方法中暂时没有处理。

4、PhoneStatusBar.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

5、关闭GPS功能:GpsLocationProvider.java

./frameworks/base/services/core/java/com/android/server/location/GpsLocationProvider.java

         变量:

mDisableGps:使gps失效时为true,用来支持设置中的省电模式。

BATTERY_SAVER_GPS_MODE= “batterySaverGpsMode”;开启省电模式时安全设置GPS动作。

BATTERY_SAVER_MODE_NO_CHANGE:设置batterySaverGpsMode的值,例如不受省电模式的影响。

BATTERY_SAVER_MODE_DISABLED_WHEN_SCREEN_OFF:batterySaverGpsMode的值,例如省电模式开启并处于待机状态时使GPS功能失效。

该类中接收到广播android.os.action.POWER_SAVE_MODE_CHANGED时,调用updateLowPowerMode方法。

获取系统设置中设置的“batterySaverGpsMode”字段值,默认返回BATTERY_SAVER_MODE_DISABLED_WHEN_SCREEN_OFF的值;如果返回的是默认值,则定义临时变量disableGps,如果与全局变量mDisbaleGps不等,赋值给mDisableGps,并调用updateRequirements方法。

在updateRequirements方法中,如果开启的省电模式并待机状态下关闭GPS。

6、关闭语音识别:SoundTriggerHelper.java

./frameworks/base/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java

PowerManagerService中发送ACTION_POWER_SAVE_MODE_CHANGED广播后,在SoundTriggerHelper中定义广播接收器,接收ACTION_POWER_SAVE_MODE_CHANGED。并获取是否处于省电模式的状态值。

如果action不为ACTION_POWER_SAVE_MODE_CHANGED,直接退出;获取省电模式的状态,并调用onPowerSaveModeChangedLocked方法。

如果省电模式状态值没有改变,直接退出;否则将新获取的状态值赋值给全局变量mIsPowerSaveMode,并调用updateRecognitionLocked(true)方法。

在updateRecognitionLocked方法中,判断如果是省电模式,则停止语音识别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android5.1--电源管理之省电模式分析 的相关文章

  • linux 自动关机 计划任务

    设置192 168 67 232 231在21 xff1a 30自动关机 1 xff09 手动命令方式 xff03 shutdown h 21 30 2 xff09 计划任务方式 xff0c 定时关机 1 添加定时任务 root 64 se
  • 微信自动回复(python)

    前言 xff1a 自从微信禁止网页版登陆之后 xff0c itchat 库也就都不能用了 xff0c 新号不能再登录网页版 xff0c 而且itchat 库在headers里面只放了UserAgent xff0c 其他字段都没有放 所以在你
  • linux下性能监控shell脚本实现系列一(服务器整体性能监控)

    在实现监控脚本前 xff0c 我们先了解下一些已经成型的监控程序 xff0c 比如大名鼎鼎的nmon nmon官网 http nmon sourceforge net pmwiki php nmon使用简单说明 http www ibm c
  • python utf-8转汉字

    其实也不麻烦 xff0c 看下边的代码 汉字编码转换 testgbk 61 39 汉字 39 testunit 61 testgbk decode 39 gbk 39 汉字解码 testutf8 61 testgbk encode 39 u
  • linux中如何查看进程启动时间,持续时长

    root 64 gasdb2 Transsoft ps eo pid lstart etime grep 5359 5359 Tue Sep 16 14 47 22 2014 00 43 其中5359为进程号 xff0c 方便做过滤用的 T
  • 错误: 程序包org.apache.log4j不存在问题处理

    将maven中依赖修改如下 xff1a lt dependency gt lt groupId gt log4j lt groupId gt lt artifactId gt log4j lt artifactId gt lt versio
  • 构建maven项目失败解决办法

    通过eclipse的maven插件新建maven项目时 xff0c 出现如下错误 Unable to create project from archetype org apache maven archetypes maven arche
  • 关于java中的非静态代码块和静态代码块

    非静态代码块如 xff1a System out println 34 2 34 以上代码块就是非静态的代码块 xff0c 请注意这里的方法名 作用域 返回值 参数一概没有 xff0c 非静态代码块会在每次类被调用或者被实例化时就会被执行
  • jsoninclude.include.non_null 不起作用问题

    在开发过程中 xff0c 遇到在属性上加jsoninclude include non null注解 xff0c 有些属性起了作用 xff0c 有些却没有起作用 xff0c 下面使用代码简要说明一下 xff1a 64 Data public
  • 再次认识java的序列化

    首先是我们为什么要序列化 xff1f 我们可以来想想游戏的场景 xff0c 一个游戏有很多关卡 xff0c 并不是一次性能够打完的 如果我们打完一关 xff0c 这时候需要退出游戏休息了 当我们再次进入游戏之后发现这个游戏竟然需要重新打起
  • 控制actionbar中的向上键

    android中会给配置了 android parentActivityName 的activity默认加入一个向上返回键 xff0c 如下 xff1a 当点击向上返回后 xff0c 默认的行为是finish自身 xff0c startac
  • Android Studio快捷键

    Alt 43 回车 导入包 自动修正 Ctrl 43 N 查找类 Ctrl 43 Shift 43 N 查找文件 Ctrl 43 Alt 43 L 格式化代码 Ctrl 43 Alt 43 O 优化导入的类和包 Alt 43 Insert
  • Ubuntu 16.04 出现E: Problem executing scripts E: Sub-process returned an error code处理办法

    E Problem executing scripts APT Update Post Invoke Success 39 if usr bin test w var cache app info a e usr bin appstream
  • android studio “leaked window“ 错误

    昨天玩我做的app 发现app运行没问题 xff0c 但log里面出现下面的错误 xff1a Activity com example thirdversionclock MainActivity welcome has leaked wi
  • Archlinux 安装桌面环境 dwm + polybar

    Archlinux 安装桌面环境 dwm 43 polybar 关于git一 安装一些必要软件1 壁纸 状态栏等软件2 安装dwm和st 三 安装Polybar四 Fish Shell五 登录管理器六 一些个人使用的工具 2023 1 31
  • Arch Linux 安装和配置(陆续更新)

    Arch Linux 安装和配置 陆续更新 南国一年一度的回南天到来 xff0c 周末百无聊赖 xff0c 研究一下Arch Linux xff0c 整理此文 xff0c 其他使用笔记陆续补充 一 在Vmware中安装Arch Linux
  • ASP.NET Core MemoryCache 缓存

    ASP NET Core 中的缓存内存 xff08 MemoryCache xff09 ASP NET Core 中的缓存内存 ASP NET Core 中的分布式缓存 xff08 SQL Server 和 Redis 分布式缓存 xff0
  • FFmpeg In Android - 多媒体文件解封装/解码/保存Yuv

    FFMPEG视音频编解码零基础学习方法 100行代码实现最简单的基于FFMPEG 43 SDL的视频播放器 本文例子的源码 demuxing decoding cpp 修改自源码自带的例子ffmpeg源码 doc example demux
  • 【Java篇】多线程详解

    Java 多线程基础详解 文章目录 Java 多线程基础详解线程的相关概念一 创建线程的几种方式1 继承Thread类2 实现Runnable接口3 实现Callable接口4 推荐使用Runnable接口 二 线程安全1 线程安全问题引入
  • NotePad++ XMLTools 插件离线安装

    在使用NotePad 43 43 时 xff0c 在某些情形下 xff0c 需要格式化Xml格式内容 xff0c 可以使用Xml Tools插件 xff0c 注意下载安装包时 xff0c 需下载与NotePad 43 43 像匹配版本的插件

随机推荐

  • 【Windows逆向】【Qt】日志信息打印

    目录 x1f6eb 导读需求开发环境 1 示例程序Demo2 编写功能 xff08 QtCreator版本 xff09 3 编写功能 xff08 VS版本 xff09 x1f6ec 文章小结 x1f4d6 参考资料 x1f6eb 导读 需求
  • Ubuntu 18.04 安装ROS melodic文件错误问题broken packages

    反复多次尝试安装ros melodic xff0c 一直报错 xff0c 有文件损坏或者安装依赖问题 直接进入安装阶段 xff0c 前面的请看其他详细帖子 sudo apt span class token operator span ge
  • 在虚拟机安装Archlinux

    最近花了挺长一段时间练习在虚拟机安装archlinux的 xff0c 在这里跟大家分享一下经验 xff0c 如有错误 xff0c 欢迎大家指出 xff0c 谢谢大家 准备工作 archlinux镜像 43 vmware workstatio
  • Linux系统启动流程及系统裁剪

    一 内核管理简要理论 1 内核的功能 xff08 1 xff09 进程管理 xff08 2 xff09 内存管理 xff08 内核管理代码中代码量最大的部分 xff09 xff08 3 xff09 I O管理 xff1a 中断及中断处理 x
  • UNIX环境高级编程习题——第三章

    第三章习题 3 1 当读 写磁盘文件时 xff0c 本章中描述的函数确实是不带缓冲机制的吗 xff1f 请说明原因 xff1a span class hljs number 1 span 本章中描述的read和write函数都是系统调用 x
  • Ubuntu 16.04 安装Vmware Workstation12

    1 安装Vmware Workstation12 1 从官网上获取http www vmware com products workstation workstation evaluation html 2 如果觉得上面的方法下载得比较慢
  • Idea2017查看Class字节码文件

    Idea查看字节码文件的原理 1 javap命令的使用 在jdk工具包的bin目录下 xff0c 有一个java可执行文件javap xff0c 该工具可以查看java编译后的class文件 使用命令如下命令进行查看 javap span
  • Idea配置Web项目路径以及使用非默认Tomcat启动

    1 Web项目发布路径配置 1 首先点击Run gt Edit Configurations 2 点击左上角绿色的加号 xff0c 选择Tomcat gt Local 3 点击Deployment 4 点击绿色的小铅笔 5 在此处设置Out
  • emacs下org-mode导出pdf时pdflatex无法找到的问题解决方案

    配置环境 Deepin15 6 Linux emacs25 2 发现的问题 系统没有找到pdflatex命令 xff0c org mode无法导出latex的pdf 解决步骤 安装texlive2018 因为pdflatex是texlive
  • 通过Flask框架封装Tushare获取的日线股票数据

    概要介绍 概要介绍 xff08 TuShare id 282782 xff09 当我们需要进行量化交易分析 xff0c 或者通过代码进行股票的数据计算 xff0c 研究金融时 xff0c 我们需要获取最基本的股票价格 xff0c 开盘价收盘
  • IBM Was 打补丁记录

    0 拷贝解压ifph52925升级包 通过FTP工具 xff0c 把压缩包传到服务器 xff0c unzip d test01 9 0 0 0 ws was ifph52925 zip 1 停掉was 服务 ps ef grep was k
  • CoreText --- 段落样子CTParagraphStyle

    在前面一篇文章中 xff0c 介绍了属性文字的基本使用 xff0c 本章节主要针对文字的段落样式展开演示说明 先定义一段演示文字 xff08 文字中有中 xff0c 英文 xff09 cpp view plain copy NSString
  • 将自己的域名解析跳转到博客主页(GitHub中的gitpage跳转)

    最近突然迷上了博客 xff0c 突然又突发奇想 xff0c 将自己几个月前买的现在限制的域名拿来跳转到自己的csdn博客 经过一番研究 xff0c 总结 把自己的购买的域名 比如我买的circleyuan top 跳转到CSDN博客 只需要
  • Python3.4简单爬虫实现之抓取糗事百科段子

    网上的python教程大都是2 X版本的 xff0c python2 X和python3 X相比较改动比较大 xff0c 好多库的用法不太一样 xff0c 我安装的是3 4 1 xff0c 就用3 4 1实现一下网页内容抓取 首先是库 xf
  • 【C++】类和对象的关系

    概念 xff1a 对象 xff1a 将数据和对数据的操作方法放在一起 xff0c 形成一个相对独立的整体 属性和操作是对象的两大要素 类 xff1a 某一类对象所共有的 本质的属性和类行为 类和对象的关系 类是抽象的 xff0c 对象是具体
  • 美团笔试题_20220409

    前言 笔试一共五道编程题 xff08 四 43 一 xff09 xff0c 一为专项编程题 xff0c 估计不同岗位有题目不一样 xff0c 使用的是赛码网 xff0c 允许跳出界面使用自己的IDE 在此感谢筱羊冰冰提供的部分题目及题解 题
  • Android应用管理一 -- APK包的安装、卸载和优化(PackageManagerService)

    Android的应用管理主要是通过PackageManagerService来完成的 PackageManagerService服务负责各种APK包的安装 卸载 优化和查询 PackageManagerService在启动时会扫描所有的AP
  • Android5.1--多用户模式

    Android中的多用户与Windows的多用户类似 xff0c 可以支持多个用户使用系统 通常 xff0c 第一个在系统中注册的用户将默认成为系统管理员 不同用户的设置各不相同 xff0c 并且不同用户安装的应用及应用数据也不相同 但是系
  • Android--应用安装卸载失败问题分析

    1 应用安装失败 xff1a does not include classes dex 08 04 17 15 23 118W dalvikvm 5253 DexOptZ zip archive 39 data app cloneit 1
  • Android5.1--电源管理之省电模式分析

    一 如何开启5 0省电模式 打开安卓5 0设备的设置选项 xff0c 然后前往电池菜单 xff0c 点击菜单键 xff0c 弹出并选择 节电助手 xff0c 随后点击顶部的开关便可 此外 xff0c 要是用户运行的是原生版安卓 xff0c