安卓源代码修改之framework下面长按power键,修改安卓原生的关机、重启界面(一)

前几天工作中遇到一个问题,修改安卓源代码中的长按Power键之后弹出的界面,以及点击事件。下面给大家说一下我自己的一些心得。
我的需求是这样的,仿造华为手机,长按power之后出来一个Activity,然后四个图片,省电模式、情景模式、重启、关机。点击重启或关机按钮,其他三个按钮就会渐变的往后移动,直至消失,然后点击的按钮自己移动到中间。然后点击一下除了按钮之外的任何一个地方就要返回到上一级菜单。点击一下情景模式,其他三个按钮也会渐变消失,然后跳出一个dialog,让用户选择响铃、震动、静音。

刚开始,接到这个任务的时候,根本就没有想到过,自己能去改源代码。。但是上面给我限制了时间,让我必须得完成,所以就一股脑的认真对待这个任务了。其实修改源代码,改成自己想要的需求,只要认真做,真的一点也不难,不要总觉得自己没有涉及过源代码,觉得自己做不来啥的,你又没有尝试着去做,你怎么知道自己不行?是吧,所以下面我回归正题上!
主要修改代码的路径是frameworks\base\services\core\java\com\android\server\policy中的GlobalActions.java。
现在我们从头看一下长按power键的那个操作在哪里。frameworks\base\services\core\java\com\android\server\policy中的PhoneWindowManager这个类中有一个方法叫showGlobalActionsInternal()。只要长按power键就系统就会调用这个方法。代码不多,如下:
void showGlobalActionsInternal() {
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
if (mGlobalActions == null) {
mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);
}
final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();
mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());
if (keyguardShowing) {
// since it took two seconds of long press to bring this up,
// poke the wake lock so they have some time to see the dialog.
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
}
好好看一下这段代码,就会知道,最终调用的是GlobalActions这个类,因为他new了一个GlobalActions类。(接下来就是无限的调用了,A方法调用B方法,B方法调用C方法,C方法调用D方法。。。。最终调用出了我们想要出来的界面。耐心一点就好了!)
然后我们看到了一句最重要的代码— mGlobalActions.showDialog,我们再跳转到GlobalActions类,找一下 showDialog这个方法。
public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned) {
mKeyguardShowing = keyguardShowing;
mDeviceProvisioned = isDeviceProvisioned;
if (mDialog != null) {
mDialog.dismiss();
mDialog = null;
// Show delayed, so that the dismiss of the previous dialog completes
mHandler.sendEmptyMessage(MESSAGE_SHOW);
} else {
handleShow();
}
}
这段代码中我们看到了handleShow();这个方法,那我们就再跳转到handleShow();这个方法看一下,然后我们看到createDialog();这个最终调用的方法。好好看完这个方法之后发现,原先长按power之后跳出来的Dialog,其实不是我们想象的那么建的的一个对话框,说白点就是,他不是Dialog,他是ListView,然后适配器填充了所有的数据之后显示在这个ListView上,让我们第一眼看的时候误以为是Dialog。。然后这个ListView是怎么显示的呢?这里他又new了一个新的类,GlobalActionsDialog,他是继承于Dialog的,但是这个太复杂了,说实话,我也没搞明白为什么要写的这么复杂。。。
好,废话少说,现在我们整体看一下,长按power键之后系统走的流程。phoneWindowManager–>showGlobalActionsInternal()—>showDialog()—>这时已经跑到GlobalActions.java中去了—>handleShow()—>createDialog()—>GlobalActionsDialog()。因为GlobalActionsDialog()太复杂,我不可能会把他改来改去然后改成我自己想要的,要是去改这个,给我一个月的时间我都不一定能做得来,所以我索性,把handleShow()这个方法中的所有代码都注释掉了,代码不多,不会影响其他,当然createDialog()就不会再被我调用了,然后我在handleShow()这个方法里重新startActivity了一个新的Activity。也就是说长按power键之后,就会startActivity,然后跳转到新的Activity上。然后这个Activity的布局,就不用我多说了吧,自己在eclipse上写好直接复制进去frameworks\base\core\res\res\layout这个路径下面就ok了。
下面是我在handleShow()这个方法中,把原先的注释掉之后,自己写的几行代码:
private void handleShow() {
Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(mContext, Dialog_Activity2.class);
mContext.startActivity(intent);
}
把这几行代码一写,长按power键之后就会跳出一个Activity,上面显示的就是你自己写好的布局。当然,在这个成功出现之前,当然会报很多错误。所有报过的错误以及修改方法都列在下面:
1、把你自己写好的Activity,这里就是Dialog_Activity2了,把这个Activity放到指定的目录下,frameworks\base\services\core\java\com\android\server。
2、在AndroidManifest.xml文件中(frameworks\base\core\res路径下)定义你这个Activity。
activity android:name=”com.android.server.Dialog_Activity2”
android:taskAffinity=”com.xjp”
android:theme=”@style/Transparent”
Activity放到了哪里,就在这个文件中也要写好他的路径,不然也会报错,说找不到对应的Activity!!!
3、在上面的handleShow()方法中的intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)这一行以及2标题中的 android:taskAffinity=”com.xjp”这一行代码,这两行代码是必须要写进去的。不然就会编译不过,报错的大概意思就是说,“你startActivity跳转的时候,你当前的页面不是Activity,你必须给他设置属性这样才能跳转,intent需要setFlags”,至于这两行代码是啥意思,搞安卓的人大概都能明白,Activity的启动方式有四种,我写的这个NEW_TASK就是其中的一种(不懂得可以多查查资料),总之这两行是必须要加的!
4、然后framework有一个很独特的地方,你给他加了一个布局对不对,就是你自己写的那个布局,然后放进layout文件夹中的那个xml 。记住的一点就是必须给frameworks\base\core\res\res\values中的symbol.xml中给他定义,不然也是会报错的。以及你在你的这个布局中定义的所有的id、drawable、string等等都在这个文件中定义。例如:
< java-symbol type=”id” name=”textView4”
java-symbol type=”id” name=”imageButton1”
java-symbol type=”color” name=”transparent_background”
java-symbol type=”style” name=”Transparent”
java-symbol type=”layout” name=”long_press_activity”
java-symbol type=”anim” name=”single1”
java-symbol type=”drawable” name=”qingjing”
java-symbol type=”string” name=”shengdian”
眼尖的同学也看到了吧,color、style这种的也要定义的!!!!
5、因为这个需求还有渐变,移动,消失这些动画效果,所以在frameworks\base\core\res\res中的anim文件中,把自己所有的动画的XML文件也是要放进去的!

以上只是长按power键之后,正确的显示你自己写好的布局,不会让他报错。至于里面的四个按钮的点击事件,后期再发布!!

以上都是本人按照自己做出来的效果写出来的心得,希望能帮助到有需要的童鞋~~如有雷同纯属巧合!

<think>好的,用户的问题是关于在Android 7.1系统中修改关机充电时显示的电量百分比。我需要先理解这个问题的背景。Android系统在关机充电时通常会进入充电模式,显示个电池图标和电量百分比。用户想要自定义这个百分比的值,可能是为了调整显示准确性或者个性化。 首先,我应该考虑系统层面的实现方式。Android的充电界面通常是由底层的Linux内核和框架层控制的,可能涉及到电源管理模块。需要找到负责显示充电信息的组件,比如内核中的驱动或者系统服务。 接下来,用户需要修改的是关机状态下的显示,这意味着系统可能没有完全启动到用户界面,而是运行在某种低功耗模式或充电模式。这种情况下,显示逻辑可能位于bootloader或者特定的充电模式服务中。例如,某些设备使用特定的充电动画,这些动画可能存储在系统的某个分区中,如/system或/vendor分区下的资源文件。 然后,需要分析Android 7.1的源代码结构。在AOSP(Android Open Source Project)中,充电相关的代码可能在 frameworks/base/services/core/java/com/android/server/power/ 或者 frameworks/base/core/res/res/ 目录下的资源文件中。此外,内核部分可能涉及到电池驱动的代码,如 drivers/power/ 目录下的文件,这些驱动负责读取电池信息并传递给上层。 可能的步骤包括: 1. 反编译或提取充电界面的相关资源文件,如图片或动画,这些可能包含电量百分比的显示逻辑。 2. 修改资源文件中的布局或文本显示方式,调整百分比的位置或数值计算。 3. 重新编译系统镜像,并将修改后的文件刷入设备。 但需要注意,不同厂商可能对充电界面有不同的定制,比如三星、华为等可能有自己的实现方式,因此可能需要针对具体设备型号进行分析。如果用户使用的是原生Android系统,修改AOSP代码可能是可行的,但如果是定制系统,可能需要逆向工程厂商的修改部分。 另外,修改系统文件需要root权限,并且可能涉及解锁bootloader,这会带来定的风险,比如设备变砖或失去保修。用户需要了解这些风险,并确保有备份和恢复的方法。 还可能涉及到修改系统服务中的电池状态更新逻辑,比如在BatteryService中调整如何计算和显示电量百分比。需要查看相关的Java类或C++代码,找到更新电量的位置,并调整显示的数值。 最后,生成相关问题时要考虑用户可能遇到的后续问题,比如如何反编译系统文件、如何重新编译和刷写系统镜像、如何针对不同设备进行适配等。这些问题可以帮助用户更深入地理解和实施修改步骤。</think>在Android 7.1系统中修改关机充电电量显示,需通过以下步骤实现: ### 、定位关资源文件 1. 充电界面资源位于`frameworks/base/core/res/res/`目录 2. 重点关注`drawable/battery_*.xml`动画文件 3. 字体配置文件在`fonts.xml`中定义 ### 二、修改电量显示逻辑 ```java // 源码路径:frameworks/base/services/core/java/com/android/server/BatteryService.java private void updateBatteryWarningLevelLocked() { final int chargeStatus = mHealthInfo.batteryStatus; if (chargeStatus == BatteryManager.BATTERY_STATUS_CHARGING) { // 在此处插入自定义电量计算逻辑 mBatteryLevel = customCalculateLevel(mHealthInfo.batteryLevel); } } ``` ### 三、图形界面适配 需修改`battery_charge.xml`动画资源: ```xml <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/battery_0" android:duration="200" /> <!-- 每10%电量对应个关帧 --> <item android:drawable="@drawable/battery_10" android:duration="200" android:visibility="%CUSTOM_LEVEL >= 10"/> </animation-list> ``` ### 四、系统编译与部署 1. 使用`mmma frameworks/base/core/res`编译资源 2. 通过`adb push`更新`/system/framework/framework-res.apk` 3. 重启进入fastboot模式刷写镜像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值