<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>项目问题 on Luoj`s Markdown</title>
    <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/</link>
    <description>Recent content in 项目问题 on Luoj`s Markdown</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 08 Jun 2026 16:37:00 +0800</lastBuildDate>
    <atom:link href="https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>预置APK</title>
      <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E9%A2%84%E7%BD%AEapk/</link>
      <pubDate>Mon, 08 Jun 2026 16:37:00 +0800</pubDate>
      <guid>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E9%A2%84%E7%BD%AEapk/</guid>
      <description>&lt;h3 id=&#34;1-目录结构扫描与功能说明&#34;&gt;&lt;strong&gt;1. 目录结构扫描与功能说明&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;一级目录&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;二级目录 (关键)&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;作用说明&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;APP 相关标注&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;amlogic/&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;common/apps/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Amlogic 通用第三方或预置 APP (如 Netflix)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;APP 源码/APK 存放地&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;reference/apps/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Amlogic 参考应用 (如 TVInput, DLNA)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;APP 源码存放地&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;common/sepolicy/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Amlogic 通用 SELinux 策略&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;权限配置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;giec/&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;apps/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;GIEC 厂商自定义 APP (如 Glauncher, OTAClient)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心 APP 存放地&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;common/sepolicy/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;GIEC 厂商自定义 SELinux 策略&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;权限配置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;android-certs/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;厂商签名密钥 (platform, shared 等)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;签名资源&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;executable/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;厂商自定义脚本与二进制工具&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;运行辅助&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;widevine/&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;libwvdrmengine/&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Widevine DRM 相关组件&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;辅助组件&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-构建文件-androidmkandroidbp-分析&#34;&gt;&lt;strong&gt;2. 构建文件 (Android.mk/Android.bp) 分析&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;1-预置-apk-模式-以-glauncher-为例&#34;&gt;&lt;strong&gt;(1) 预置 APK 模式 (以 Glauncher 为例)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;在 &lt;a href=&#34;&#34;&gt;Glauncher/Android.mk&lt;/a&gt; 中：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Android 系统 Build 阶段 APK 签名机制（通俗笔记）</title>
      <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E7%AD%BE%E5%90%8D%E7%9B%B8%E5%85%B3/</link>
      <pubDate>Mon, 08 Jun 2026 16:36:00 +0800</pubDate>
      <guid>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E7%AD%BE%E5%90%8D%E7%9B%B8%E5%85%B3/</guid>
      <description>&lt;h1 id=&#34;android-系统-build-阶段-apk-签名机制通俗笔记&#34;&gt;Android 系统 Build 阶段 APK 签名机制（通俗笔记）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;面向：刚接触 AOSP/系统应用开发、需要“系统签名 / system 权限”概念的人&lt;br&gt;
目标：用更直白的方式理解 &lt;strong&gt;AOSP 在编译（build）时如何给 APK 签名&lt;/strong&gt;，以及 &lt;strong&gt;如何自定义签名 key&lt;/strong&gt;、&lt;strong&gt;如何让 APK 以 system UID 运行&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;原文参考：&lt;a href=&#34;https://maoao530.github.io/2017/01/31/android-build-sign/&#34;&gt;https://maoao530.github.io/2017/01/31/android-build-sign/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-你需要先知道的-3-个概念&#34;&gt;0. 你需要先知道的 3 个概念&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;签名是干什么的？&lt;/strong&gt;&lt;br&gt;
Android 用签名来确认“这个 APK 是谁发布/构建的”，并据此决定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否允许共享 UID（sharedUserId）&lt;/li&gt;
&lt;li&gt;是否允许同签名应用间共享数据/权限&lt;/li&gt;
&lt;li&gt;系统应用/特权能力是否能被授予（取决于场景与版本策略）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;非对称加密（公钥/私钥）一句话版&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;私钥&lt;/strong&gt;：必须保密，用来“签名”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公钥&lt;/strong&gt;：可以公开，用来“验签”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build 阶段签名 ≠ Android Studio 打包签名&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里讲的是 &lt;strong&gt;AOSP 源码编译&lt;/strong&gt;（make/soong）时，系统在构建流程中对 APK 进行签名。&lt;/li&gt;
&lt;li&gt;Android Studio 的 keystore/gradle 签名属于另一条链路，但原理相通。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-aosp-默认有哪些签名-key&#34;&gt;1. AOSP 默认有哪些签名 Key？&lt;/h2&gt;
&lt;p&gt;系统源码里默认准备了 &lt;strong&gt;4 组 key&lt;/strong&gt;，用于在 build 阶段给不同类型的 APK 签名。它们默认位于：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;build/target/product/security/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;每组 key 都有两类文件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>更换开机动画LOGO</title>
      <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E6%9B%B4%E6%8D%A2%E5%BC%80%E6%9C%BA%E5%8A%A8%E7%94%BBlogo/</link>
      <pubDate>Mon, 08 Jun 2026 16:35:00 +0800</pubDate>
      <guid>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E6%9B%B4%E6%8D%A2%E5%BC%80%E6%9C%BA%E5%8A%A8%E7%94%BBlogo/</guid>
      <description>&lt;p&gt;开机LOGO&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Z:\android\aml\s905x5\aml-s905x5-androidu-v2\device\amlogic\ross\logo_img_files
OR
Z:\android\aml\s905x5\aml-s905x5-androidu-v2\device\amlogic\common\logo_img_files
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;取决于TARGET_AMLOGIC_RES_PACKAGE的值&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Z:\android\aml\s905x5\aml-s905x5-androidu-v2\device\amlogic\planck\BoardConfig.mk
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;开机动画路径定义以及查找优先级相关都在这个文件内&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Z:\android\aml\s905x5\aml-s905x5-androidu-v2\frameworks\base\cmds\bootanimation\BootAnimation.cpp
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Android Init 开机脚本编写指南</title>
      <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E5%BC%80%E6%9C%BA%E8%84%9A%E6%9C%AC/</link>
      <pubDate>Mon, 08 Jun 2026 16:34:00 +0800</pubDate>
      <guid>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E5%BC%80%E6%9C%BA%E8%84%9A%E6%9C%AC/</guid>
      <description>&lt;h1 id=&#34;android-init-开机脚本编写指南&#34;&gt;Android Init 开机脚本编写指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以 TiviMateCustom 首启自动安装为例，覆盖 init.rc 编写、shell 脚本编写、SELinux 策略和调试全流程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一android-init-基础&#34;&gt;一、Android Init 基础&lt;/h2&gt;
&lt;h3 id=&#34;11-init-进程的阶段事件&#34;&gt;1.1 Init 进程的阶段事件&lt;/h3&gt;
&lt;p&gt;Android init（PID 1）按固定阶段推进，每个阶段发射一个不可重复的事件：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;first_stage
    └── selinux_setup
        └── second_stage
              ├── early-init
              ├── init
              ├── late-init
              │     ├── early-fs
              │     ├── fs
              │     ├── post-fs
              │     ├── late-fs
              │     └── post-fs-data
              ├── early-boot
              ├── boot              ← 文件系统就绪，核心服务准备启动
              └── ...               （Zygote、system_server 等启动）
                                    
              运行时:
              sys.boot_completed=1  ← 开机动画结束，Launcher 就绪
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键区别：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;事件类型&lt;/th&gt;
          &lt;th&gt;触发方式&lt;/th&gt;
          &lt;th&gt;重放机制&lt;/th&gt;
          &lt;th&gt;适用场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段事件（&lt;code&gt;on boot&lt;/code&gt;, &lt;code&gt;on late-init&lt;/code&gt; 等）&lt;/td&gt;
          &lt;td&gt;init 内部发射&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;有&lt;/strong&gt; — rc 晚加载也会追溯执行&lt;/td&gt;
          &lt;td&gt;不依赖属性的初始化&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;property trigger（&lt;code&gt;on property:xxx=y&lt;/code&gt;）&lt;/td&gt;
          &lt;td&gt;属性值变化&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;无&lt;/strong&gt; — 错过就永远错过&lt;/td&gt;
          &lt;td&gt;rc 必须比属性变化早加载&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;12-rc-文件的加载路径&#34;&gt;1.2 RC 文件的加载路径&lt;/h3&gt;
&lt;p&gt;Init 自动 &lt;code&gt;import&lt;/code&gt; 以下目录的 &lt;code&gt;.rc&lt;/code&gt; 文件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Android STB 长按 Power 键弹出关机对话框 — 定位过程总结</title>
      <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E4%BF%AE%E6%94%B9%E9%81%A5%E6%8E%A7%E5%99%A8power%E6%8C%89%E9%94%AE%E7%9A%84%E9%80%BB%E8%BE%91/</link>
      <pubDate>Mon, 08 Jun 2026 16:33:00 +0800</pubDate>
      <guid>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/%E4%BF%AE%E6%94%B9%E9%81%A5%E6%8E%A7%E5%99%A8power%E6%8C%89%E9%94%AE%E7%9A%84%E9%80%BB%E8%BE%91/</guid>
      <description>&lt;h1 id=&#34;android-stb-长按-power-键弹出关机对话框--定位过程总结&#34;&gt;Android STB 长按 Power 键弹出关机对话框 — 定位过程总结&lt;/h1&gt;
&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;在 Android STB（Amlogic S905X5 平台）上，长按遥控器 Power 键会弹出一个系统级关机确认对话框，提示文字为 &amp;ldquo;Do you want to shut down?&amp;quot;。本文记录如何从现象出发，逐步定位到该对话框的源码位置和触发逻辑。&lt;/p&gt;
&lt;h2 id=&#34;第一步通过-dumpsys-获取窗口信息&#34;&gt;第一步：通过 dumpsys 获取窗口信息&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;adb shell&lt;/code&gt; 中执行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 查看当前焦点窗口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dumpsys window | grep mCurrentFocus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 输出: mCurrentFocus=Window{8fd2b64 u0 android}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 根据窗口 ID 查看详细信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dumpsys window windows | grep -A &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt; -B &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8fd2b64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键输出分析&#34;&gt;关键输出分析&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;属性&lt;/th&gt;
          &lt;th&gt;值&lt;/th&gt;
          &lt;th&gt;含义&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;package=android&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;属于 &lt;code&gt;android&lt;/code&gt; 包&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;这是 Framework 系统级窗口，非第三方 App&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mOwnerUid=1000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;system 进程&lt;/td&gt;
          &lt;td&gt;进一步确认是系统级&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;type=KEYGUARD_DIALOG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;2009&lt;/td&gt;
          &lt;td&gt;锁屏级对话框，在所有用户上可见&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fl=DIM_BEHIND ALT_FOCUSABLE_IM ...&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;半透明背景 + 可获取焦点&lt;/td&gt;
          &lt;td&gt;典型的模态对话框特征&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Window{8fd2b64 u0 android}&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;u0 = user 0&lt;/td&gt;
          &lt;td&gt;系统用户&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：对话框是 Android Framework 中的系统级代码弹出的，不是任何 App 的行为。&lt;/p&gt;</description>
    </item>
    <item>
      <title>recovery模式下的reset逻辑修改</title>
      <link>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/recovery%E6%A8%A1%E5%BC%8F%E4%B8%8B%E7%9A%84reset%E9%80%BB%E8%BE%91%E4%BF%AE%E6%94%B9/</link>
      <pubDate>Mon, 08 Jun 2026 16:32:00 +0800</pubDate>
      <guid>https://luojmarkdown.pages.dev/posts/%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/recovery%E6%A8%A1%E5%BC%8F%E4%B8%8B%E7%9A%84reset%E9%80%BB%E8%BE%91%E4%BF%AE%E6%94%B9/</guid>
      <description>&lt;p&gt;对应到目录&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Z:\android\aml\s905x5\aml-s905x5-androidu-v2\bootable\recovery\recovery_ui\ui.cpp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对应代码&lt;/p&gt;
&lt;p&gt;这里在对返回的按键做判定，判定之后根据需求返回信号&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;RecoveryUI::KeyAction RecoveryUI::CheckKey(int key, bool is_long_press) 
{
    ...
    //这是目前reset键的判定，这个if判定成功说明按下了reset，返回了TOGGLE
    if ((key == KEY_VOLUMEUP || key == KEY_UP) &amp;amp;&amp;amp; IsKeyPressed(KEY_POWER)) 
    {
      return TOGGLE;
    }
    ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在这里对返回的信号进行处理&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;​	原有的逻辑是现实/关闭UI文字，现在修改为移动索引，由于之前索引的移动是按下KEY_DOWN，所以可以直接复用逻辑，直接发送KEY_DOWN即可。另外还需要实现一个长按3s确认的功能。所以在接收到这个信号的时候进行一次判定如果是长按到来的信号，那么就走KEY_ENTER逻辑，否则就走KEY_DOWN逻辑&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void RecoveryUI::ProcessKey(int key_code, int updown) 
{
    ...
    case RecoveryUI::TOGGLE:
        ShowText(!IsTextVisible());
        break;
    ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void RecoveryUI::ProcessKey(int key_code, int updown) 
{
    ...
    case RecoveryUI::TOGGLE:
        ShowText(true);
        if (long_press) 
        {
            EnqueueKey(KEY_ENTER);  // 长按确认
        } 
    	else
        {
            EnqueueKey(KEY_DOWN);   // 短按下移
        }
        break;
    ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;另外对应到长按的逻辑在&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void RecoveryUI::TimeKey(int key_code, int count) 
{
  ...
  std::this_thread::sleep_for(750ms);  // 750 ms == &amp;#34;long&amp;#34;
  ...
}
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
  </channel>
</rss>
