Android P我的设备中增加开机时间显示

本文介绍了一个用于增加设备开机时间显示功能的代码实现。通过在MtkSettings应用中新增BootTimePreferenceController类,实现在设备信息页面展示自上次开机以来的运行时间。此功能通过监听系统时间变化并更新UI来保持开机时间的实时性。

增加开机时间的类:

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/BootTimePreferenceController.java

/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.deviceinfo;

import android.app.Activity;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.BidiFormatter;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnResume;

import com.mediatek.settings.UtilsExt;
import com.mediatek.settings.ext.IDeviceInfoSettingsExt;

public class BootTimePreferenceController extends AbstractPreferenceController implements
        LifecycleObserver, OnResume {

    private static final boolean DEBUG = true;		
    private static final String TAG = "cytest";	
    private static final int EVENT_UPDATE_STATS = 500;

    private static final String KEY_UP_TIME = "boot_time";

    private final Activity mActivity;
    private Fragment mFragment;
    private Preference preference;
    private IDeviceInfoSettingsExt mExt;
	
    private Handler mUpdateTimeHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case EVENT_UPDATE_STATS:
                    updateTimes();
                    sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
                    break;
            }
        }
    };

    public BootTimePreferenceController(Context context, Activity activity, Fragment fragment,
            Lifecycle lifecycle) {
        super(context);
        mActivity = activity;
        mFragment = fragment;
        mExt = UtilsExt.getDeviceInfoSettingsExt(mActivity);
    }
    
    public void setUpTimes(Fragment hostFragment) {
        mFragment = hostFragment;
        mUpdateTimeHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        preference = screen.findPreference(KEY_UP_TIME);   
        if (preference != null) {
            try {             	
                preference.setEnabled(true);
                mUpdateTimeHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
            } catch (Exception e) {
                preference.setSummary(R.string.device_info_default);
            }
        }
    }

    @Override
    public String getPreferenceKey() {
        return KEY_UP_TIME;
    }

    @Override
    public boolean isAvailable() {
        return true;
    }

    @Override
    public void onResume() {
    }
	
    private void updateTimes() {
        long at = SystemClock.uptimeMillis() / 1000;
        long ut = SystemClock.elapsedRealtime() / 1000;

        if (ut == 0) {
            ut = 1;
        }

        preference.setSummary(convert(ut));
    }

    private String calcTimes() {
        long at = SystemClock.uptimeMillis() / 1000;
        long ut = SystemClock.elapsedRealtime() / 1000;

        if (ut == 0) {
            ut = 1;
        }

        return convert(ut);
    }

    private String pad(int n) {
        if (n >= 10) {
            return String.valueOf(n);
        } else {
            return "0" + String.valueOf(n);
        }
    }

    private String convert(long t) {
        int s = (int)(t % 60);
        int m = (int)((t / 60) % 60);
        int h = (int)((t / 3600));

        return h + ":" + pad(m) + ":" + pad(s);
    }    
}

vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\deviceinfo\aboutphone\MyDeviceInfoFragment.java中:

import com.android.settings.deviceinfo.BootTimePreferenceController;//add

private static List<AbstractPreferenceController> buildPreferenceControllers(
            Context context,
            Activity activity,
            MyDeviceInfoFragment fragment,
            Lifecycle lifecycle) {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        .
        .
        .
    controllers.add(new BootTimePreferenceController(context, activity, fragment, lifecycle));//add
        .
        .
        .
       return controllers;
    }

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/DeviceInfoSettings.java中:

 //by begin
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(BootTimePreferenceController.class).setUpTimes(this);
+    }
+    //end

vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml中:

//add begin
<Preference
        android:key="boot_time"
        android:order="47"
        android:title="@string/boot_time"
        android:summary="@string/summary_placeholder"
        settings:allowDividerAbove="true"/>
//end

其他需要在vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings和vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings中配置文字

<think>我们正在讨论的是Android10.0中调整关机动画显示时间以及设置播放完关机动画后黑屏的问题。根据之前提供的系统配置信息,我们可以从系统配置文件和属性控制两个方面入手。1.**关机动画显示时间调整**:-关机动画的持续时间通常由系统属性控制,常见属性包括`ro.build.shutdown_timeout`或`vendor.shutdown.timeout`。这些属性定义了从开始关机到系统断电的总时间,其中包括动画播放时间。-在Android系统中,关机动画的存放路径一般是`/system/media/shutdownanimation.zip`(有些设备可能在`/system/product/media/`等目录)。但调整动画显示时间并非直接修改动画文件,而是通过系统属性或配置文件来设置超时时间。2.**设置黑屏**:-关机动画播放完毕后,系统会自动关闭屏幕。如果希望在动画播放完后立即黑屏,我们需要确保没有其他进程在关机过程中延误,并且可能需要调整关机超时时间使其足够播放动画但又不留多余黑屏时间。###关键配置文件路径根据之前的信息,我们可以通过以下方式调整关机超时时间:-**系统级配置文件**:在`/system/etc/init/`目录下的`.rc`文件中设置属性。例如,在`/system/etc/init/boot.rc`或`/system/etc/init/power.rc`文件中添加:```bashsetpropvendor.shutdown.timeout10#设置关机超时时间10秒```-**厂商级配置文件**:在`/vendor/etc/init/`目录下的`.rc`文件中设置(如果设备有vendor分区)。例如,在`/vendor/etc/init/hw/init.rc`或自定义的rc文件中添加:```bashsetpropvendor.shutdown.timeout10```###调整关机动画显示时间的具体步骤假设我们希望关机动画显示5秒,然后立即黑屏关机,可以这样设置:1.**设置关机超时时间**:设置系统属性`vendor.shutdown.timeout`为5(秒),这个时间包括动画播放时间和关机过程其他部分的时间。```bash#在initrc文件中写入setpropvendor.shutdown.timeout5```2.**确保动画时长匹配**:关机动画本身有一个时长,我们应该确保动画的时长不超过5秒。如果动画时长超过设置的超时时间,动画会被中断,系统强制关机。###设置播放完关机动画后黑屏实际上,系统在关机动画播放完毕后会自动关闭屏幕(黑屏)。但是,如果关机超时时间设置过长,动画播放完后会有一段黑屏等待时间。为了减少这段等待时间,我们应该将关机超时时间设置为略大于动画实际时长(例如,动画时长4秒,则设置超时时间为5秒)。###操作步骤(需要root)1.**挂载系统分区为可写**:```bashadbrootadbremount```2.**创建或修改init脚本**:如果设备有`/vendor/etc/init/`目录,通常建议在该目录下创建自定义rc文件,例如`/vendor/etc/init/custom_shutdown.rc`,然后添加以下内容:```bashonproperty:sys.powerctl=*#设置关机超时时间(单位:秒)setpropvendor.shutdown.timeout5```或者直接在已有的rc文件中添加。3.**如果设备支持,也可以使用adb设置属性(临时)**:```bashadbshellsetpropvendor.shutdown.timeout5```但是这种设置重启会失效。永久设置必须修改rc文件。4.**重启生效**:```bashadbreboot```###验证-查看属性值:```bashadbshellgetpropvendor.shutdown.timeout```-测试关机过程,观察关机动画是否显示5秒后黑屏关机。###注意事项-**权限问题**:修改`/system`或`/vendor`分区需要root权限或解锁system分区。-**动画文件**:关机动画的压缩包文件(shutdownanimation.zip)中通常包含一个`desc.txt`文件,其中定义了动画的播放参数(如分辨率、帧率、循环次数等)。如果希望精确控制动画播放时长,也可以调整动画文件本身,但这与系统设置超时时间相互独立。系统超时时间应该大于动画播放总时间,否则动画可能无法完整播放。###设置关机后黑屏(立即断电)除了调整超时时间,还可以通过其他内核参数控制关机行为。在Android系统中,关机流程最终会调用`kernel_restart_prepare`和`machine_restart`等函数,并发送信号给硬件。如果希望在关机动画后立即断电,可以尝试修改内核参数,但这通常需要定制内核。对于一般用户,调整超时时间是最直接的方法。###总结-**调整关机动画显示时间**:通过设置`vendor.shutdown.timeout`属性(在initrc文件中)控制关机过程的超时时间。-**路径**:`/system/etc/init/`或`/vendor/etc/init/`下的rc文件。-**设置黑屏**:只需确保超时时间足够播放动画但又不留多余时间即可。###相关问题1.如何修改Android设备开机动画?2.如何调整关机动画的分辨率和帧率?3.安卓系统关机过程中会执行哪些任务?4.如何查看安卓关机流程的日志?</think> ### 安卓10.0调整关机动画时间与设置黑屏的方案 #### 1. **关机动画时间调整文件路径** 在Android 10中,关机动画的时长主要由以下系统属性控制: - **核心配置文件路径** `/system/etc/init/*.rc` 或 `/vendor/etc/init/*.rc` 例如: ```bash /vendor/etc/init/android.hardware.power@1.0-service.rc ``` 文件中会包含: ```rc setprop vendor.shutdown.timeout 8 # 设置关机超时8秒(含动画时间) ``` - **关键属性** 修改系统属性`ro.build.shutdown_timeout`或`vendor.shutdown.timeout`控制总关机时间: ```bash # 查看当前值 adb shell getprop vendor.shutdown.timeout # 临时修改(需root) adb shell setprop vendor.shutdown.timeout 10 # 单位:秒 ``` #### 2. **设置动画后立即黑屏** 通过调整**关机电平信号时序**实现: 1. **修改内核关机流程** 在设备树文件中调整PMIC(电源管理芯片)配置: `内核路径:/kernel/drivers/power/supply/qcom/qpnp-smb5.c` ```c // 找到shutdown流程 static void smb5_shutdown(struct platform_device *pdev) { // 添加:强制关闭背光 qpnp_display_backlight_override(0); // 原有关机代码 } ``` 2. **背光控制文件(非root方案)** 通过亮度文件强制关闭背光: ```bash adb shell "echo 0 > /sys/class/backlight/panel0-backlight/brightness" ``` #### 3. **完整操作步骤(需Root)** ```bash # 1. 挂载系统分区可写 adb root adb remount # 2. 添加关机时间配置(示例:12秒) adb shell "echo 'setprop vendor.shutdown.timeout 12' >> /vendor/etc/init/custom_shutdown.rc" # 3. 添加背光关闭指令(测试前执行) adb shell "echo 'echo 0 > /sys/class/backlight/panel0-backlight/brightness' >> /vendor/bin/pre-shutdown.sh" # 4. 重启生效 adb reboot ``` #### 4. **验证方法** ```bash # 触发关机并抓取日志 adb shell reboot -p adb logcat | grep -E "shutdown|backlight" # 检查属性值 adb shell getprop vendor.shutdown.timeout ``` > **注意事项**: > 1. 不同厂商的背光路径可能为`/sys/class/leds/lcd-backlight/brightness` > 2. 高通平台设备可尝试修改`/vendor/bin/sh`中的关机脚本[^1] > 3. 完整关机时间 = 动画时长 + 系统清理时间 ### 相关问题 1. 如何在非Root设备上调试关机动画流程? 2. 安卓关机动画的存放路径和格式是什么? 3. 如何缩短系统清理阶段的时间? 4. 怎样自定义安卓关机动画内容? [^1]: 系统级修改需结合内核驱动,具体路径需根据芯片平台确定 [^2]: 背光控制路径可通过`adb shell ls -l /sys/class/backlight/*`验证 [^3]: 完整关机流程参考AOSP源码:`/frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值