\documentclass[a4paper,12pt]{article}
\usepackage{ctex}    % 支持中文
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{listings}
\usepackage{color}
\usepackage{geometry}
\usepackage{setspace}  % 用于调整行距
\usepackage{float}  % 添加到导言区
\usepackage{longtable}
\usepackage{multirow}  % 添加这一行
\usepackage{array}    % 添加这一行，支持表格中的多行单元格
\usepackage{subcaption}
\usepackage{caption}



\hypersetup{
colorlinks=true,
linkcolor=black
}

% 设置页面边距
\geometry{left=2.0cm,right=2.0cm,top=2.0cm,bottom=2.0cm}

% 代码块设置
\lstset{
    basicstyle=\ttfamily\small,
    numbers=left,
    numberstyle=\tiny,
    frame=single,
    breaklines=true
}

% 重定义摘要环境
\renewenvironment{abstract}{
    \begin{center}
        \vspace*{0.1cm}  % 调整摘要标题与正文的距离
        \textbf{\Large 摘要}
    \end{center}
    \vspace{0.1cm}  % 标题和内容之间的间距
    \normalsize  % 使用正常的字体
    \begin{spacing}{1.5}  % 增加行距
}{
    \end{spacing}
}

\title{\textbf{小米便签应用代码泛读、标注和维护报告}}
\author{黄泽楷 \quad 秦薪淇}

\setlength{\parindent}{2em}  % 设置段落缩进
\setlength{\parskip}{0.5em}  % 设置段落间距
\tolerance=1000  % 允许更宽松的断行
\emergencystretch=2em  % 在紧急情况下允许更大的字间距

\begin{document}

\maketitle
\vspace{0.1cm}  % 在标题和摘要之间添加一些垂直空间

% 摘要
\begin{abstract}
    MiCode便签是由MIUI团队开发的开源Android应用项目，采用Java语言实现。项目具有完整的代码结构，涵盖用户界面、数据存储、系统服务等Android应用的核心模块，总计约13000行代码，包含6个功能包和39个类，基于MIT开源协议。尽管应用功能相对简单，但其模块设计清晰、结构合理，是学习和研究Android开发的优秀参考。

    本报告围绕MiCode便签项目展开，对其进行了全面的代码泛读、标注和功能维护，并取得了以下详细成果：
    
    \begin{enumerate}
        \item \textbf{代码泛读}：
        分析了项目的整体架构和主要功能模块，明确了MVC分层设计（界面层、业务层、模型层、数据层）的实现思路。
        
        梳理了类与类之间的交互关系，聚焦核心功能（如便签创建、删除、移动）的实现路径，为后续功能扩展奠定了基础。
        
        \item \textbf{代码标注}：   
        对6个包中39个类的源码完成了2350行详细注释，包括类的功能说明、关键方法逻辑解析及重要变量定义，增强了代码的可读性和可维护性。
        
        \item \textbf{功能扩展与维护}：
        在项目的基础上新增了16项功能，涵盖文本处理、界面优化、隐私保护、文本处理、语音交互、翻译等领域，显著提升了应用的实用性与用户体验。

        新增代码量约7000行，优化了代码质量并通过质量检测工具验证，确保结构清晰、逻辑一致。
    \end{enumerate}
    
    通过本次实践，我们不仅掌握了针对大型项目的代码分析和优化方法，还在功能设计、模块实现及质量控制方面积累了宝贵经验。同时，团队在协作开发和任务分工中得到了磨合与提升。这些成果为我们后续的软件工程实践提供了丰富的借鉴和坚实的基础。
\end{abstract}

\newpage
% 目录
\tableofcontents
\newpage



\section{小米便签的代码泛读}
\subsection{功能描述}
根据对开源软件的使用以及对代码的阅读和理解，
该软件的整体功能描述如下，其软件需求的用例模型如图1所示。

%插入图片
\begin{figure}[h]
    \centering
    \includegraphics[width=0.8\textwidth]{picture/1.1.png}
    \caption{小米便签的软件需求用例图}
    
\end{figure}

下面根据用例图详细阐述小米便签的功能: \newline
\begin{itemize}
    \item 功能1：新建/删除/移动便签
    
    \begin{enumerate}
        \item 新建便签：通过小米便签软件的主界面下方的"写便签"快捷键和文件夹、便签视图下的选项"新建便签"可以在当前目录创建一个便签并打开进入文本编辑。其中主界面下的快速创建方式可以迅速创建一个待编辑的便签，用于满足临时迅速记录的需求。
        \item 删除便签：通过长按便签并选择删除选项可以删除已创建的便签，用于对便签集进行有效的管理。
        \item 移动便签：通过长按便签并选择移动选项可以将已创建的便签移动到某个文件夹中，用于在快速创建便签后对便签集进行有效的管理。
    \end{enumerate}
    
    \item 功能2：文件管理\newline
    在当前目录下新建、查看、删除一个文件夹用于分类管理便签。用户在主界面的选项中可以选择“新建文件夹”创建一个文件夹，
    根据create参数值设置对话框标题（创建或是修改文件夹），设置对话框的正确定按钮和取消按钮。
    \item 功能3：导出文本\newline
    在主界面的选项中可以选择"导出文件"，在Android手机提供SD卡支持的情况下，将小米便签中的便签内容逐个转化为.txt的文本文档。
    \item 功能4：同步 \newline
    在主界面的选项中可以选择"同步"，与Google Task中的备忘录事项，将本地的事项上传到服务器，或将Google服务器上的表单下载到本地。
    
    \item 功能5：检索便签 \newline
    在主界面的选项中可以选择 "搜索"，通过关键词查找到包含该关键词的便签，显示在界面上。
    \item 功能6：修改字体大小 \newline
    在便签编辑的界面，在选项中选择"字体大小"，可以将当前便签的所有字体进行放大和缩小，其中包括4中字体大小：小、正常、大、超大。
    
    \item 功能7：进入清单模式 \newline
    在便签编辑的页面，可以选择进入清单模式的选项。
    选择后，在便签的每一行（段内部的自动换行除外）行首出现一个勾选框，
    用于当前便签下标记某事项的完成情况。如果该事项已完成，
    则用户在勾选框中轻触，此时勾选框中将出现一个对勾，框后的陈述文字被添加了中央删除线。
    （外侧文件夹并不能显示事项的完成状态，可优化）

    \item 功能8：发送到桌面 \newline
    在Android操作系统的桌面创建小米便签的小部件后，在编写便签完成后，使用选项"发送至桌面"，便可在便签小部件上显示当前便签的内容。
    
    \item 功能9：添加/删除提醒
    \begin{enumerate}
        \item 添加提醒：在便签编辑界面可以选择"添加提醒"选项，然后弹出一个对话框用于选择提醒的时间（包括月、日、星期、时、分），之后会在便签上显示一个闹钟的图标，标志提醒时间，到了提醒时间时，操作系统便会弹出一个对话框显示便签的内容并响铃，闹钟图表标志变为"已过期"。
        \item 删除提醒：在便签编辑界面可以选择"删除提醒"选项。
    \end{enumerate}
    
    \item 功能10：分享\newline
    在便签编辑页面上可以选择"分享"选项，之后可以将便签内容分享给GTask、QQ、微信等应用程序，其过程以纯文本格式进行。
    
    \item 功能11：识别便签文本
    \begin{enumerate}
        \item 识别邮箱：小米便签可识别文本中邮箱，点击可复制相应的邮箱
        \item 识别网站：小米便签可识别文本中网站，点击可直接打开网站
        \item 识别电话：小米便签可识别文本中电话，可直接复制或者呼叫
    \end{enumerate}
  
  
\end{itemize}



\subsection{小米便签的软件架构以及各个包和类的作用}

\subsubsection{小米便签的软件架构}
小米便签整体上是一个层次性的体系结构，由界面层、业务层、模型层和数据层 4
层构成，每层包含若干个程序包。相邻层次的程序包之间存在交互。小米便签的体系结
构图见图2。
\begin{itemize}
    \item 界面层：根据表格（在前置动作部分）中出的主要功能，我们可以很轻松地将ui和
    widget填入其中，而res包含了所有的xml文件和相对应图片，属于MVC架构里面
    View部分，所以也应该填入界面部分。
    \item 业务层：根据MVC架构的逻辑，个人判断它应该担任是C（Control控制器）的角
    色：处理用户输入的信息。负责从视图读取数据，控制用户输入，并向模型发送
    数据，是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。
    \item 模型层：该层负责对小米便签的单个便签项进行建模，提供了便签项的基本操作
    功能和对应业务, 并与数据层进行交互，以支持便签的创建、访问和修改。该层主
    要通过 model 程序包中的 Note 类、WorkingNote 类等加以实现。
    \item 数据层：该层负责组织和存储小米便签的相关数据,提供数据访问、数据合法性检
    验、数据访问缺失异常处理等功能和服务。该层主要通过 data 和 gtask.data 程序
    包加以实现。
\end{itemize}

\begin{figure}[h!]
    \centering
    \includegraphics[width=0.8\textwidth]{picture/2.png}
    \caption{小米便签的软件架构图}
    
\end{figure}
\subsubsection{各个包内的关系图}
该开源软件的类组织成7个子系统(6个源代码包，1个资源文件包)，这些子系统之间的关系如图2所示。

虚线表示包与包之间存在依赖关系。

Res包用于存放应用程序的资源文件。res是"resources"的缩写，这个包主要包含了应用程序使用的各种资源，例如图像、布局文件、字符串、颜色等。这些资源文件在应用程序的开发和运行过程中起到重要的作用，可以提供界面展示、用户交互、美化等功能。通过使用这些资源文件，开发人员可以更方便地进行界面设计和开发。

Data包用于存储和处理备忘录应用程序的数据。通过将数据处理和管理相关的类放置在Data包中，可以使代码结构更加清晰，方便开发人员对数据进行操作和管理。

Model包用于存放数据模型相关的类，它主要负责定义应用程序中所需的数据结构、业务逻辑和数据操作的接口。通过将数据模型相关的类放置在model包中，可以使代码结构更加清晰，方便开发人员对数据进行管理和操作。

Widget包用于存放与应用程序桌面小部件（Widget）相关的类和方法。桌面小部件是一种能够在Android设备的主屏幕上显示内容的组件，它们可以提供快捷操作、实时信息展示等功能，为用户带来便利。

Tool包用于存放与工具类和辅助功能相关的类和方法。这个包通常用于处理一些通用的功能模块和工具方法，以提供开发人员更便捷的开发和实现。

Ui包用于存放与用户界面相关的类、布局和资源文件，比如闹钟提醒。通过将与用户界面相关的类和资源文件放置在ui包中，可以使代码结构更加清晰，方便开发人员对界面进行管理和操作。

Gtask包用于存放与数据更新，同步，检测异常相关的类和方法。这个包通常用于实现应用程序中数据更新，网络同步功能。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{picture/46.png}
    \caption{小米便签的包间关系图}
\end{figure}


下面我将对每个类进行单独分析，以便更好地理解小米便签的代码结构。
\begin{itemize}
    \item data包：\newline
    如图4所示，Data包当中： \newline
    Contact类独立，Notes类和NotesDatabaseHelper类关联，NotesDatabaseHelper类和NotesProvider类是聚合关系(后者为整体，前者为部分)。
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/4.png}
        \caption{data子系统中的类图}
    \end{figure}
    \item model包：\newline
    如图5所示，Model包当中： \newline
    Note类和WorkingNote类是聚合关系(Note为部分，WorkingNote为整体)。
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/7.png}
        \caption{model子系统中的类图}
    \end{figure}
    \item widget包： 
    \newline
    如图6所示，Widget包当中： \newline
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/8.png}
        \caption{widget子系统中的类图}
    \end{figure}
    NoteWidgetProvider\_4x类和NoteWidgetProvider类是泛化关系(前者是对后者的泛化或继承)。
    NoteWidgetProvider\_2x类和NoteWidgetProvider类是泛化关系(前者是对后者的泛化或继承)。

    \item tool包：\newline
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.6\textwidth]{picture/47.png}
        \caption{tool子系统中的类图}
    \end{figure}
    如图7所示，Tool包中：
    四个类独立并列，彼此之间没有明显的相关关系。


    \item ui包：\newline
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/9.png}
        \caption{ui子系统中的类图}
    \end{figure}
    如图8所示，Ui包中：
    \begin{enumerate}
        \item DateTimePicker类和DateTimePickerDialog类是聚合关系(前者为部分，后者为整体)；NoteItemData类和NotesListActivity类是聚合关系(前者为部分，后者为整体)；NoteListAdapter类和NotesListActivity类是聚合关系(前者为部分，后者为整体)。
        \item AlarmInitReceiver类关联AlarmReceiver类；
        \item AlarmReceiver类关联AlarmAlertActivity类；
        \item NoteEditActivity类关联AlarmReceiver类，DateTimePickerDialog类NotesPreferenceActivity类和NoteEditText类；
        \item NoteEditActivity类和NotesListActivity类双向相互关联。
        \item NoteItemData类关联NoteEditActivity类；
        \item NotesListActivity类关联DropdownMenu类和FoldersListAdapter类；
        \item NoteListAdapter类关联NoteItemData类和NotesListItem类。
        \item NotesListItem类关联NoteItemData类。
    \end{enumerate}

    \item Gtask包：\newline
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/48.png}
        \caption{Gtask子系统中的类图}
    \end{figure}
    如图9所示，Gtask包中：
    \begin{enumerate}
        \item MetaData类是对Task类的泛化或继承；Task类是对Node类的泛化或继承；TaskList类是对Node类的泛化或继承；
        \item Task类和TaskList类是聚合关系(前者为部分，后者为整体)；
        \item MetaData类关联SqlNote类；SqlNote类关联SqlData类；GTaskSyncService类关联GTaskASyncTask类；GTaskASyncTask类关联GTaskManager类；GTaskManager类关联GTaskClient类；
        \item SqlNote类依赖ActionFailureException类；
        \item SqlData类依赖ActionFailureException类；
        \item TaskList类依赖ActionFailureException类；
        \item Task类依赖ActionFailureException类；
        \item GTaskManager类依赖MetaData类，SqlNote类，Task类，Node类和TaskList类；
        \item GTaskClient类依赖ActionFailureException类，NetworkFailureException类和Node类；
    \end{enumerate}


\end{itemize}





\subsection{软件功能与类间的对应关系}


软件功能与类的实现对应关系见表1

\begin{longtable}{|p{0.06\textwidth}|p{0.15\textwidth}|p{0.25\textwidth}|p{0.4\textwidth}|}
    \caption{软件功能与类的实现对应关系}  \\
    
    \hline
    \small 序号 & \small 功能名称 & \small 实现模块 & \small 主要实现方法 \\
    \hline
    \endfirsthead
    
    \multicolumn{4}{c}{\small 续表 \thetable：软件功能与类的实现对应关系} \\
    \hline
    \small 序号 & \small 功能名称 & \small 实现模块 & \small 实现方法 \\
    \hline
    \endhead
    
    \hline
    \multicolumn{4}{r}{\small 下页继续} \\
    \endfoot
    
    \hline
    \endlastfoot
    
    \small 1 & \small 新建便签 & \small NoteEditActivity & \small createNewNote() \newline startActivityForResult() \newline onOptionsItemSelected()\\
    \hline
    2 & 删除便签 & NoteEditActivity &deleteCurrentNote() \newline setNegativeButton() \newline onOptionsItemSelected() \\
    \hline
    3 & 移动便签 & DataUtils & moveNoteFolder() \newline batchMoveToFolder() \\
    \hline
    4 & 新建文件夹 & NoteListActivity & showCreateOrModifyFolderDialog() \newline mContentResolver.update() \newline mContentResolver.insert()\\
    \hline
    5 & 查看文件夹 & NoteListActivity & openFolder() \newline startAsyncNotesListQuery()\\
    \hline
    6 & 删除文件夹 & NoteListActivity & deleteFolder() \newline DataUtils.batchDeleteNotes() \newline DataUtils.batchMoveToFolder\\
    \hline
    7 & 修改文件夹名称 & NoteListActivity & showCreateOrModifyFolderDialog() \\
    \hline
    8 & 导出文本 & NoteListActivity & exporNoteToText() \\
    \hline
    9 & 同步 & GTaskSyncService & startSync() \\
    \hline
    10 & 搜索 & NoteListActivity & onSearchRequest() \newline startSearch()\\
    \hline
    11 & 修改字体大小 & NoteEditActivity & onOptionsItemSelected() \\
    \hline
    12 & 修改便签背景颜色 & WorkingNote & setBgColorId() \\
    \hline
    13 & 进入清单模式 & WorkingNote & setCheckListMode() \\
    \hline
    14 & 发送到桌面 & NoteEditActivity & sendToDestop() \\
    \hline
    15 & 添加提醒 & NoteEditActivity & setAlertData() \\
    \hline
    16 & 删除提醒 & WorkingNote & setAlertData() \\
    \hline
    17 & 识别电话号码 & Contact & getContact() \\
    \hline
    18 & 分享 & NoteEditActivity & getWorkingText(),sendTo() \\
    \hline
    19 & 保存便签 & WorkingNote & saveNote() \\
    
\end{longtable}

这部分的工作主要是通过增加断点进行代码调试工作才确认类对应的功能。主要涉及到的功能界面有两个，对应的类为NotesListActivity和NoteEditActivity。

像某些功能对应两种实现方式的需要特别注意。例如：新建便签和删除便签，在主界面和便签菜单栏都可以实现。因此调试的方法才更有必要，只有通过断点调试才能确定其中的正确的对应关系。

另外还有一些功能，在AS虚拟机上并不能实现。例如：导出文本功能，该功能需要手机装备SD卡；又例如同步功能和分享功能，该功能需要进行联网并备有Google等平台的账号，用来进一步的操作。

有一些功能无法进行断点调试。例如：识别电话号码、邮箱功能，在便签内输入类似电话、邮箱的文字后，会在文字产生下划线，并附有超链接，可以进行点击操作，但在调试过程中并没有出现中断现象。




\section{小米便签的代码标注}
小组对6个包中共39个类的代码进行了标注，标注的代码行数共有2350行。
具体的，这些代码注释的分部如表2所示。

\begin{longtable}{|p{0.05\textwidth}|p{0.15\textwidth}|p{0.27\textwidth}|p{0.4\textwidth}|}
    \caption{代码标注分布情况}  \\
    
    \hline
    \footnotesize 序号 & \footnotesize 包名称 & \footnotesize 类名称 & \footnotesize 标注的代码行数 \\
    \hline
    \endfirsthead
    
    \multicolumn{4}{c}{\footnotesize 续表 \thetable：代码标注分布情况} \\
    \hline
    \footnotesize 序号 & \footnotesize 包名称 & \footnotesize 类名称 & \footnotesize 标注的代码行数 \\
    \hline
    \endhead
    
    \hline
    \multicolumn{4}{r}{\footnotesize 下页继续} \\
    \endfoot
    
    \hline
    \endlastfoot
    
    \footnotesize 1 & \footnotesize data & \footnotesize Contact & \footnotesize 48行。在该类中分布在类的总体介绍(2,3)；引入库文件的说明(8,9)；类的静态变量说明(23,32-36)；方法中关键语句(39,44,49) \\
    \hline
    \footnotesize 2 & \footnotesize data & \footnotesize Notes & \footnotesize 172行。在该类中分布在静态变量说明(23到49为int类型,之后为final string类型) \\
    \hline
    \footnotesize 3 & \footnotesize data & \footnotesize NotesDatabaseHelper & \footnotesize 104行。在该类中分布在静态成员变量(18,21,25...)和对各种具体格式(SQL语句和uri接口)中 \\
    \hline
    \footnotesize 4 & \footnotesize data & \footnotesize NotesProvider & \footnotesize 47行。对各种变量、数据的sql语句进行了标注 \\
    \hline
    \footnotesize 5 & \footnotesize gtask.data & \footnotesize MetaData & \footnotesize 50行。在该类中分布在对元数据的定义、获取、传输、同步等方法中 \\
    \hline
    \footnotesize 6 & \footnotesize gtask.data & \footnotesize Node & \footnotesize 54行。对节点同步动作的常量、JSON动作、设置节点的相关内容方法进行了标注 \\
    \hline
    \footnotesize 7 & \footnotesize gtask.data & \footnotesize SqlData & \footnotesize 108行。对数据库管理类sqldata进行了说明，包括Cursor操作,属性说明,标签定义,以及重要方法sqlData构造函数的标注 \\
    \hline
    \footnotesize 8 & \footnotesize gtask.data & \footnotesize SqlNote & \footnotesize 127行。对静态变量进行了标注，对重要方法如获取、更新、记录变迁属性的功能进行了标注 \\
    \hline
    \footnotesize 9 & \footnotesize gtask.data & \footnotesize Task & \footnotesize 127行。对任务类task的成员变量tag等进行了标注，对JSON等方法进行了标注 \\
    \hline
    \footnotesize 10 & \footnotesize gtask.data & \footnotesize TaskList & \footnotesize 139行。任务列表类，继承自Node类。用于管理一组任务(Task)对象。对task任务列表的静态常量如标签、索引列表等静态常量做了标注。定义了类的构造函数，更新列表的重要方法的标注 \\
    \hline
    \footnotesize 11 & \footnotesize gtask.exception & \footnotesize ActionFailureException & \footnotesize 38行。该异常类是运行时异常的子类，用于表示操作失败的异常情况。它可以包含一个错误消息和导致异常的Throwable对象。解释了抛出异常的具体信息 \\
    \hline
    \footnotesize 12 & \footnotesize gtask.exception & \footnotesize NetworkFailureException & \footnotesize 34行。主要对网络操作失败异常类作用进行了注释，对构造函数进行了注释 \\
    \hline
    \footnotesize 13 & \footnotesize gtask.remote & \footnotesize GTaskASyncTask & \footnotesize 65行。对静态常量如同步通知栏ID等进行了标注，对重要方法如构造函数、发布、显示更新进度的方法等进行了标注 \\
    \hline
    \small 14 &gtask.remote& GTaskClient & 172行。接下来的注释说明了GTaskClient类的作用，它用于与Google任务服务进行远程交互，并提供了登录、获取任务列表、添加任务等操作的方法。注释还解释了类的各种属性，如日志标签、基础URL、请求URL、单例模式实例、HTTP客户端、版本号、登录状态和操作ID等。对于GTaskClient的私有构造方法，注释说明了其用途是初始化各种属性。提供了getGTaskClient方法来获取GTaskClient的单例实例，并确保只创建一个实例 \\
    \hline
    \small 15 &gtask.remote & GTaskManager & 221行。说明了GTaskManager类的用途，包括日志标签、任务状态常量(如成功、网络错误、内部错误、同步进行中和同步已取消)。注释描述了类的各种属性，例如单例实例、关联的Activity对象、上下文对象、内容解析器、同步状态标记、任务列表和任务的HashMap、元数据的HashMap等 \\
    \hline
    \small 16 &gtask.remote & GTaskSyncService & 62行。注释描述了类中定义的同步操作类型常量，加后台同步、取消同步和无效操作。提供了服务广播的名称、标志以及广播的同步进度消息 \\
    \hline
    \small 17 & model & Note & 56行。描述了为数据库中添加新笔记生成一个新的笔记ID，创建一个新的笔记等方法 \\
    \hline
    \small 18 &model & WorkingNote & 230行。描述了类中的各种属性，如笔记对象、笔记的唯一标识符、笔记的内容、笔记的模式、提醒日期的时间戳、笔记最后修改日期的时间戳、笔记背景颜色的资源ID、小部件的ID和小部件的类型等。描述了构造函数、设置提醒日期、标记笔记为已删除、设置笔记背景颜色ID、等方法 \\
    \hline
    \small 19 & tool & BackupUtils & 120行。主要对备份工具类和内部类TextExport等进行了说明 \\
    \hline
    \small 20 & tool& DataUtils & 134行。描述了批量删除笔记的方法。描述了将笔记移动到指定文件夹的方法。描述了批量将笔记移动到指定文件夹的方法 \\
    \hline
    \small 21 & tool& GtaskStringUtils & 34行。描述了批量删除笔记的方法、将笔记移动到指定文件夹的方法、批量将笔记移动到指定文件夹的方法。获取删除系统文件夹外的所有用户文件夹数量的方法。描述了检查指定类型的笔记在数据库中是否可见的方法等等方法 \\
    \hline
    \small 22 & tool& ResourceParser & 72行。描述了定义笔记背景颜色的常量，获取默认笔记背景id、笔记背景资源头、提供获取不同背景资源的方法 \\
    \hline
    \small 23 & ui& AlarmAlertActivity & 150行。提醒界面 \\
    \hline
    \small 24 & ui& AlarmInitReceiver & 51行。后台消息接收器 \\
    \hline
    \small 25 & ui& AlarmReceiver & 39行。间接提醒接收器 \\
    \hline
    \small 26 & ui& DateTimePicker & 130行。设置提醒时间的部件 \\
    \hline
    \small 27 & ui& DateTimePickerDialog & 32行。设置提醒时间的对话提示界面 \\
    \hline
    \small 28 & ui& DropdownMenu & 26行。下拉菜单界面 \\
    \hline
    \small 29 & ui& FoldersListAdapter & 32行。文件夹列表链接器(链接数据库) \\
    \hline
    \small 30 & ui& NoteEditActivity & 485行。便签编辑活动 \\
    \hline
    \small 31 & ui& NoteEditText & 120行。便签的文本编辑界面 \\
    \hline
    \small 32 & ui& NoteItemData & 39行。便签项数据 \\
    \hline
    \small 33 & ui& NotesListActivity & 111 主界面，实现处理文件夹列表的活动 \\
    \hline
    \small 34 & ui& NotesListAdapter & 便签列表链接器(链接数据库) \\
    \hline
    \small 35 &ui & NotesListItem &23  便签列表项 \\
    \hline
    \small 36 & ui& NotesPreferenceActivity &187  便签同步的设置界面 \\
    \hline
    \small 37 & widget& NoteWidgetProvider & 桌面挂件 \\
    \hline
    \small 38 & widget& NoteWidgetProvider\_2x & 12行。NoteWidgetProvider,负责处理2x大小的小部件更新和其他操作 \\
    \hline
    \small 39 & widget& NoteWidgetProvider\_4x & 12，4倍大小挂件 \\
    \hline
    \small 合计 & 6个包 & 39个类 & 大约3924行左右代码标注 \\
\end{longtable}

\section{小米便签的代码维护}
\subsection{维护的内容}
对小米便签进行了如表3所示的维护，包括增加新的功能等等。

\begin{longtable}{|p{0.05\textwidth}|p{0.12\textwidth}|p{0.15\textwidth}|p{0.53\textwidth}|}
    \caption{维护内容列表}  \\
    
    \hline
    \footnotesize 序号 & \footnotesize 维护类别 & \footnotesize 名称 & \footnotesize 描述 \\
    \hline
    \endfirsthead
    
    \multicolumn{4}{c}{\footnotesize 续表 \thetable：维护内容列表} \\
    \hline
    \footnotesize 序号 & \footnotesize 维护类别 & \footnotesize 名称 & \footnotesize 描述 \\
    \hline
    \endhead
    
    \hline
    \multicolumn{4}{r}{\footnotesize 下页继续} \\
    \endfoot
    
    \hline
    \endlastfoot
    
    \footnotesize 1 & 新增功能 & \footnotesize 设置界面背景 & \footnotesize 修改小米便签初始背景，并可以进行切换操作。 \\
    \hline
    \footnotesize 2 &新增功能 & \footnotesize 欢迎界面 & \footnotesize 打开小米便签时，会有短暂的欢迎界面，2s 后界面自动消失，此时进入小米便签。 \\
    \hline
    \footnotesize 3 &新增功能 & \footnotesize 登录密码 & \footnotesize 登录界面，在进入主界面时需要输入密码，设置了一个开放的密码锁保护隐私。可以进行密码的增添、删除和替换操作。 \\
    \hline
    \footnotesize 4 & 新增功能& \footnotesize 翻译功能 & \footnotesize 在学习生活中，我们会经常使用英汉互译功能，将英汉互译功能添加到小米便签里面，可以方便我们在特定条件下的使用。 \\
    \hline
    \footnotesize 5 &新增功能& \footnotesize 插入图片 & \footnotesize 现在主流便签都有插入图片功能，这方便用户记录图片信息。 \\
    \hline
    \footnotesize 6 & 新增功能& \footnotesize 统计字符个数 & \footnotesize 在主流编辑软件里面，可以统计带空格的字符数，这方便用户知道自己写作的篇幅。 \\
    \hline
    
    \footnotesize 7 & 新增功能& \footnotesize 富文本功能 & \footnotesize 在主流的便签类软件都有富文本功能，可以方便用户对文本中的内容进行加粗、斜体、删除线以及高亮等。 \\
    \hline
    \footnotesize 8 & 新增功能& \footnotesize 朗读功能 & \footnotesize 在学习生活中，我们会经常使用英汉互译功能，将英汉互译功能添加到小米便签里面，可以方便我们在特定条件下的使用。 \\
    \hline
    \footnotesize 9 & 新增功能& \footnotesize 私密模式 & \footnotesize 在便签的初始界面会显示便签的第一行内容，这样一定程度上容易泄露个人的隐私，进入私密模式后可以设定第一行内容，这样可以起到一定的保密作用。 \\
    \hline
    \footnotesize 10 &新增功能 & \footnotesize 笔记编辑内搜索 & \footnotesize 在笔记编辑界面，可以进行搜索操作，如果没有搜索到内容会显示未找到相关内容，如果搜索到内容会高亮所有搜索到的内容。 \\
    \hline
    \footnotesize 11 &新增功能 & \footnotesize 模板便签 & \footnotesize 每个用户都有特定的笔记编辑习惯，提前输入好模板，可以便捷用户记录便签。 \\
    \hline
    \footnotesize 12 &新增功能 & \footnotesize 语音听写 & \footnotesize 在学习生活中，语音输入可以方便用户快速输入内容。 \\
    \hline
    \footnotesize 13 &新增功能 & \footnotesize 语音合成 & \footnotesize 基于讯飞星火AI的语音合成功能，支持多语种、多声色和智能调控音调、节奏等丰富功能。 \\
    \hline
    \footnotesize 14 &新增功能 & \footnotesize 对话式大模型 & \footnotesize 如今市面上主流的软件都内置了大模型，可以方便用户基于便签文本的上下文进行对话，获取帮助。 \\
    \hline
    \footnotesize 15 &新增功能 & \footnotesize 撤回功能 & \footnotesize 用户在对便签进行编辑时，往往可能会误触删除一部分文本，撤回功能可以撤销误删除的操作。 \\
    \hline
    \footnotesize 16 &新增功能 & \footnotesize 获取地理位置 & \footnotesize 一些软件需要获取地理位置权限才可以正常运行，为小米便签植入获取地理位置的功能，可以帮助用户及时定位自己的位置。 \\
\end{longtable}

\newpage
\subsection{开源软件维护后所产生的设计}
\noindent维护后的小米便签主要增加和更改类的类图见图10,维护后产生的体系架构图见图11。

\begin{figure}[H]
    \centering
    \includegraphics[width=1.0\textwidth]{picture/packet.png}
    \caption{维护后的小米便签的类图}
\end{figure}


\subsubsection{类解释}

此类图展示了项目中的主要类及其相互关系。项目采用了模块化设计，每个类负责特定的功能，同时通过接口和继承实现代码的复用和扩展性。以下是对主要类的详细解释：

\paragraph{1. Activity 类的继承层次结构}
\begin{itemize}
    \item \textbf{Activity}: 这是Android框架的核心组件，多个自定义Activity类继承自 \texttt{Activity}。
    \item \textbf{SplashActivity}: 实现了应用启动界面，持有一个 \texttt{Handler} 对象，用于处理异步任务和延时操作。
    \item \textbf{NotesListActivity}: 显示笔记列表的主界面，核心字段包括：
        \begin{itemize}
            \item \texttt{background}: 用于管理背景显示。
            \item \texttt{secret\_mode}: 一个整数，用于标识是否处于加密模式。
            \item \texttt{mState} 和 \texttt{mNotesListAdapter}: 分别用于记录当前界面的状态和管理笔记列表的适配器。
        \end{itemize}
        它通过方法 \texttt{initResources()} 初始化资源，并处理按钮点击事件 (\texttt{onClick(View)} 方法)。
    \item \textbf{NotesPreferenceActivity}: 用于管理应用的设置选项，持有 \texttt{SharedPreferences} 对象以存储用户设置。
    \item \textbf{NoteEditActivity}: 提供对笔记内容的编辑功能，字段包括：
        \begin{itemize}
            \item \texttt{mHeadViewPanel} 和 \texttt{mNoteBgColorSelector}: 分别用于界面头部视图和背景颜色选择器。
            \item \texttt{mNoteEditor} 和 \texttt{mWorkingNote}: 分别表示编辑框和当前正在编辑的笔记。
        \end{itemize}
        它还支持语音合成功能（通过字段 \texttt{mTTS: TextToSpeech} 实现），并重写 \texttt{onCreate(Bundle)} 和 \texttt{onClick(View)} 方法处理界面初始化和点击事件。
\end{itemize}

\paragraph{2. 笔记列表相关类}
\begin{itemize}
    \item \textbf{NotesListItem} 和 \textbf{NoteItemData}: 这两个类分别用于表示笔记列表中的单个条目及其具体数据。通过对象之间的组合关系，\texttt{NotesListItem} 可以获取并管理 \texttt{NoteItemData}。
    \item \textbf{NotesListAdapter}: 用于适配笔记列表到用户界面。其主要字段包括 \texttt{mContext}（上下文对象）和 \texttt{mNoteDataList}（笔记列表数据数组）。它通过 \texttt{getView()} 方法为每个笔记条目生成对应的视图。
\end{itemize}

\paragraph{3. 密码管理功能类}
\begin{itemize}
    \item \textbf{SetPassword}: 负责设置密码，其字段包括 \texttt{mPassword}，并提供 \texttt{setPassword(String)} 方法设置新密码。
    \item \textbf{ChangePassword}: 允许用户更改密码，核心字段包括 \texttt{mOldPassword} 和 \texttt{mNewPassword}，方法 \texttt{changePassword(String, String)} 用于实现密码的更新。
    \item \textbf{DeletePassword}: 提供删除密码的功能，通过方法 \texttt{deletePassword()} 实现。
\end{itemize}

\paragraph{4. 第三方服务和工具类}
\begin{itemize}
    \item \textbf{BaiduTranslateService}: 封装百度翻译API的调用，提供方法 \texttt{translate()} 和 \texttt{getTranslateResult()} 实现翻译功能。
    \item \textbf{MD5Utils}: 提供生成MD5哈希值的工具方法 \texttt{getMD5Code()}，可能用于对密码或文件进行加密校验。
    \item \textbf{XmlParser}: 处理 XML 数据解析的工具类，方法 \texttt{parseXmlResult()} 用于解析返回的字符串数据。
    \item \textbf{FucUtil}: 提供通用文件管理功能，包括 \texttt{copyFile()} 方法。
\end{itemize}

\paragraph{5. 语音识别和语音合成相关类}
\begin{itemize}
    \item \textbf{IATActivity} 和 \textbf{IflytekActivity}: 处理语音输入功能，通过字段 \texttt{mIat: SpeechRecognizer} 初始化语音识别功能 (\texttt{initSpeech()} 方法)。
    \item \textbf{TtsDemo} 和 \textbf{TtsSettings}: 提供语音合成功能，其核心方法 \texttt{initSpeechSynthesizer()} 用于初始化语音合成引擎。
    \item \textbf{SpeechApp}: 用作全局应用类，管理与语音相关的初始化参数，如 \texttt{PRIVACY\_KEY} 和 \texttt{msInitialize}。
\end{itemize}

\paragraph{6. 通用对话框类}
\begin{itemize}
    \item \textbf{DateTimePickerDialog}: 提供日期和时间选择功能，通常用于笔记的创建或修改时间管理。
\end{itemize}

\paragraph{7. 类之间的关系}
\begin{itemize}
    \item \textbf{继承关系}: 多个Activity类继承自Android框架的 \texttt{Activity} 类（如 \texttt{NotesListActivity}、\texttt{NoteEditActivity}）。
    \item \textbf{组合关系}: 类之间通过组合关系实现模块化，例如 \texttt{NotesListAdapter} 组合了 \texttt{NoteItemData} 以生成笔记列表视图。
    \item \textbf{关联关系}: \texttt{NoteEditActivity} 通过字段和方法调用与 \texttt{BaiduTranslateService}、\texttt{MD5Utils} 等类进行功能交互。
    \item \textbf{接口实现}: 部分类（如 \texttt{NotesListActivity} 和 \texttt{NoteEditActivity}）通过实现接口（如 \texttt{OnClickListener}）来处理用户交互事件。
\end{itemize}

\paragraph{总结}
类图中的模块设计体现了单一职责原则（SRP），通过继承和组合的方式实现了代码复用与模块化。各个类的功能划分清晰，既包括核心的笔记管理功能（如 \texttt{NotesListActivity}、\texttt{NoteEditActivity}），又包含工具类和第三方API集成模块（如 \texttt{BaiduTranslateService} 和 \texttt{XmlParser}）。整体架构设计合理，具有良好的可扩展性和可维护性。


\newpage
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{picture/Structure Package.png}
    \caption{维护后的小米便签的架构图}
\end{figure}

\newpage
\subsubsection{架构解释}

该项目采用分层架构设计，各层职责明确，模块化程度高。这种架构提高了代码的可读性、可维护性和可扩展性。以下是各层的详细解释：

\paragraph{1. 界面层（UI Layer）}
界面层负责用户界面的显示和交互，主要包含以下模块：
\begin{itemize}
    \item \textbf{ui}: 实现具体的界面功能，如 \texttt{Activity}、\texttt{Fragment}，用于响应用户操作。
    \item \textbf{res}: 包含资源文件（如布局文件、图片、字符串资源等），通过 \texttt{R} 类引用。
    \item \textbf{widget}: 提供自定义控件或组件，用于增强 UI 的可复用性或满足特定的 UI 需求。
\end{itemize}

\textbf{连接}：界面层通过调用业务层获取数据并渲染到 UI 中，\texttt{widget} 模块可能直接与业务层交互以更新自定义组件的行为。

\paragraph{2. 第三方 API 层（Third-party API Layer）}
该层主要负责与外部第三方服务或库的交互，包含以下模块：
\begin{itemize}
    \item \textbf{speech}: 封装与语音识别或语音合成相关的第三方 API。
    \item \textbf{translate\_demo}: 调用第三方翻译服务（如 Google Translate 或其他翻译 API）。
    \item \textbf{SparkChain}: 处理区块链相关操作的模块，可能用于数据记录、身份验证或交易管理。
\end{itemize}

\textbf{连接}：第三方 API 层通过封装对外部 API 的调用，为业务层提供统一接口，避免业务逻辑直接依赖第三方库。

\paragraph{3. 业务层（Business Layer）}
业务层负责实现核心的应用逻辑和功能，主要包含以下模块：
\begin{itemize}
    \item \textbf{tool}: 提供通用工具类和辅助功能，例如数据格式转换、日志工具等。
    \item \textbf{gtask.remote}: 处理远程通信，例如通过网络请求与后端服务器交互（可能使用 \texttt{Retrofit} 或 \texttt{OkHttp}）。
    \item \textbf{gtask.exception}: 用于定义和处理全局异常，确保应用中错误管理的一致性。
\end{itemize}

\textbf{连接}：业务层从第三方 API 层获取数据，处理后传递给界面层或模型层。同时，\texttt{exception} 模块与 \texttt{remote} 模块紧密结合，统一处理网络或业务逻辑中的异常。

\paragraph{4. 模型层（Model Layer）}
模型层定义和操作核心数据结构，主要包含以下模块：
\begin{itemize}
    \item \textbf{model}: 定义应用中的核心数据模型，例如用于表示用户、商品或订单的 Java 或 Kotlin 类。
    \item \textbf{gtask.data}: 管理本地数据或缓存，例如 \texttt{SQLite} 数据库、\texttt{SharedPreferences} 或 \texttt{Room} 框架。
\end{itemize}

\textbf{连接}：模型层为业务层和界面层提供统一接口，通过封装数据操作实现与其他层的解耦。

\paragraph{5. 数据层（Data Layer）}
数据层负责存储和管理应用程序的数据，包含以下模块：
\begin{itemize}
    \item \textbf{data}: 封装了数据的持久化操作，例如数据库管理（如 SQL、\texttt{Room ORM}）或文件系统管理。
\end{itemize}

\textbf{连接}：数据层通过模型层提供数据接口，将数据存储到本地或从本地读取，并向业务层提供支持。

\paragraph{总体架构特性总结}
\begin{itemize}
    \item \textbf{分层解耦}：每一层职责明确，界面层专注于用户交互，业务层专注于逻辑处理，数据层专注于数据管理。
    \item \textbf{模块化设计}：各层进一步划分为多个模块（如 \texttt{tool}、\texttt{gtask.remote}），增强了代码的复用性和维护性。
    \item \textbf{良好的扩展性}：通过第三方 API 层封装，便于未来替换或增加新的第三方服务（如增加新的翻译 API）。
    \item \textbf{异常管理}：在业务层中通过 \texttt{gtask.exception} 模块统一处理异常，提升了应用的稳定性。
    \item \textbf{清晰的数据流向}：从数据层到界面层，数据流向清晰明确，各层通过特定接口交互，避免直接依赖。
\end{itemize}

\paragraph{适用场景和优势}
\begin{itemize}
    \item 适用于中大型 Android 项目，尤其是需要与多个第三方服务交互的场景（如语音识别、多语言翻译等）。
    \item 便于团队协作：不同开发者可以分别专注于某一层的开发，减少冲突和耦合。
    \item 易于测试：每一层都可以独立进行单元测试，例如测试业务逻辑或第三方 API 的封装。
\end{itemize}


\newpage

\subsection{维护代码数量以及质量情况}


\subsubsection{维护代码数量}
在完成小米便签的维护工作之后，我们使用一个插件统计小米便签项目的代码数量情况，从java文件和xml文件两个方面
进行统计，分别从总行数、源代码数量、注释行数、注释行数的百分比、空行数、空行数的百分比进行统计。
\begin{enumerate}
    \item 首先是维护之前的数据，见图12、图13。
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/xml-1.png }
        \caption{维护之前xml文件数量}
    \end{figure}
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/java-1.png}
        \caption{维护之前java文件数量}
    \end{figure}
    \item 其次是维护之后的数据，见图14、图15。
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/xml-2.png}
        \caption{维护之后xml文件数量}
    \end{figure}
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/java-2.png}
        \caption{维护之后java文件数量}
    \end{figure}
    
    \item 最后将java文件和xml文件的数据绘制成图，见图16、图17、图18、图19。
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/Data bar Chart -java.png}
        \caption{维护前后java文件数量对比——柱状图}
    \end{figure}
    \begin{figure}[H]
        \centering
        \includegraphics[width=0.8\textwidth]{picture/Data bar Chart -xml.png}
        \caption{维护前后xml文件数量对比——柱状图}
    \end{figure}
    \begin{figure}[H]
        \centering
        \includegraphics[width=1.0\textwidth]{picture/Data pie Chart -java.png}
        \caption{维护前后java文件数量对比——饼状图}
    \end{figure}
    \begin{figure}[H]
        \centering
        \includegraphics[width=1.0\textwidth]{picture/Data pie Chart -xml.png}
        \caption{维护前后xml文件数量对比——饼状图}
    \end{figure}

    \newpage
    \item 最后将项目代码数量汇总，我们维护增加的代码数量接近7000行，注释的代码行数有3500行左右，见图20、图21。
    \begin{figure}[H]
        \centering
        \includegraphics[width=1.0\textwidth]{picture/Merge data bar chart.png}
        \caption{维护前后代码数量对比——柱状图}
    \end{figure}
    \begin{figure}[H]
        \centering
        \includegraphics[width=1.0\textwidth]{picture/Merge data pie charts.png}
        \caption{维护前后代码数量对比——饼状图}
    \end{figure}
\end{enumerate}

\newpage
\subsubsection{维护后的质量分析}
在代码维护之后，我们小组再次对代码进行了质量分析，使用CodeArts中的代码审查功能对代码的质量进行分析。
分析结果见图22、图23。
\begin{figure}[H]
    \centering
    \includegraphics[width=1.0\textwidth]{picture/CodeArts-lastest-1.png}
    \caption{代码审查结果}
\end{figure}


\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{picture/CodeArts-master.png}
    \caption{代码审查结果}
\end{figure}

\begin{itemize}
    \item 总体情况
    
    \begin{enumerate}
        \item 未解决问题数：880
        \item 已解决问题数：0
        \item 代码行数：7,879
        \item 代码重复率：1.9\%
        \item 代码平均复杂度：3.22
    \end{enumerate}

    \item 问题分析
    
    \begin{enumerate}
        \item 问题数量：
        880个未解决的问题是一个相对较高的数字，表明代码中存在较多的潜在问题，可能影响代码的可维护性和可读性。
        \item 问题类型：
        
        G.CMT.01（270个）：涉及public或protected修饰符的元素未添加JavaDoc注释。这表明代码文档化不足，可能导致后续维护和理解困难。

        G.CMT.06（122个）：注释与代码之间存在不一致性，可能导致误解。
        \item 代码复杂度：
        平均复杂度为3.22，虽然不算高，但仍需关注复杂度较高的部分，可能需要重构以提高可读性和可维护性。
        \item 代码重复率：
        1.9\%的重复率相对较低，表明代码的重复使用情况良好，但仍需定期检查以避免潜在的重复代码问题。
    \end{enumerate}


    \item 详细的分析结果汇总见表4，如下所示：
    \begin{longtable}{|p{0.15\textwidth}|p{0.1\textwidth}|p{0.65\textwidth}|}
        \caption{代码质量分析详细结果}  \\
        
        \hline
        \footnotesize 规则编号 & \footnotesize 违规数量 & \footnotesize 规则说明 \\
        \hline
        \endfirsthead
        
        \multicolumn{3}{c}{\footnotesize 续表 \thetable：代码质量分析详细结果} \\
        \hline
        \footnotesize 规则编号 & \footnotesize 违规数量 & \footnotesize 规则说明 \\
        \hline
        \endhead
        
        \hline
        \multicolumn{3}{r}{\footnotesize 下页继续} \\
        \endfoot
        
        \hline
        \endlastfoot
        
        \footnotesize G.CMT.02 & \footnotesize 45 & \footnotesize 顶层public类的Javadoc应该包含功能说明和创建日期/版本信息 \\
        \hline
        \footnotesize G.FMT.05 & \footnotesize 24 & \footnotesize 在条件语句和循环块中应该使用大括号 \\
        \hline
        \footnotesize G.FMT.18 & \footnotesize 20 & \footnotesize 快注释的缩进级别应与上下文代码相同 \\
        \hline
        \footnotesize G.EXP.04 & \footnotesize 7 & \footnotesize 表达式的比较，应该遵循左侧倾向于变化、右侧倾向于不变的原则--使用equals方法进行字符串比较 \\
        \hline
        \footnotesize G.FMT.12 & \footnotesize 46 & \footnotesize 减少不必要的空行，保持代码紧凑 \\
        \hline
        \footnotesize G.OBJ.10 & \footnotesize 27 & \footnotesize 接口定义中去掉多余的修饰词 \\
        \hline
        \footnotesize G.FMT.04 & \footnotesize 34 & \footnotesize 一个类或接口的声明部分应该按照类变量、静态初始化块、实例变量、构造器、方法的顺序出现，且用空行分隔 \\
        \hline
        \footnotesize G.CMT.03 & \footnotesize 3 & \footnotesize 方法的Javadoc中应该包含功能说明，根据实际需要按顺序使用@param、@return、@throws标签对参数、返回值、异常进行注释 \\
        \hline
        \footnotesize G.EXP.04 & \footnotesize 4 & \footnotesize 表达式的比较，应该遵循左侧倾向于变化、右侧倾向于不变的原则--表达式比较左变右不变 \\
        \hline
        \footnotesize G.OBJ.08 & \footnotesize 1 & \footnotesize 正确实现单例模式 \\
        \hline
        \footnotesize G.FMT.20 & \footnotesize 3 & \footnotesize 数字字面量应该设置合适的后缀，long类型应该使用L作为后缀 \\
        \hline
        \footnotesize G.DCL.03 & \footnotesize 5 & \footnotesize 禁止C风格的数组声明 \\
        \hline
        \footnotesize G.FMT.06 & \footnotesize 11 & \footnotesize 对于非空块结构，左大括号应该放在行尾，右大括号应该另起一行 \\
        \footnotesize G.OBJ.07 & \footnotesize 13 & \footnotesize 子类覆写父类方法或实现接口时必须加上@Override注解 \\
        \hline
        \footnotesize G.ERR.03 & \footnotesize 6 & \footnotesize 不要直接捕获可通过预检查进行处理的RuntimeException，如NullPointerException、IndexOutOfBoundsException等 \\
        \hline
        \footnotesize G.FMT.08 & \footnotesize 6 & \footnotesize 使用空格进行缩进，每次缩进4个空格 \\
        \hline
        \footnotesize G.CTL.01 & \footnotesize 14 & \footnotesize 不要在控制性条件表达式中执行赋值操作或执行复杂的条件判断 \\
        \hline
        \footnotesize G.OTH.01 & \footnotesize 1 & \footnotesize 安全场景下必须使用密码学意义上的安全随机数 \\
        \hline
        \footnotesize G.NAM.04 & \footnotesize 5 & \footnotesize 方法名应采用小驼峰命名 \\
        \hline
        \footnotesize G.CMT.06 & \footnotesize 122 & \footnotesize 注释与代码之间应该有空行或空格，注释符与注释内容之间应该有空格 \\
        \hline
        \footnotesize G.CMT.01 & \footnotesize 270 & \footnotesize public或protected修饰的元素应添加Javadoc注释 \\
        \hline
        \footnotesize G.TYP.13 & \footnotesize 51 & \footnotesize 在引用类型向下转换前用instanceof进行判断 \\
        \hline
        \footnotesize G.OTH.03 & \footnotesize 15 & \footnotesize 不用的代码段包括import，直接删除，不要注释掉--不用的代码段，直接删除，不要注释掉 \\
        \hline
        \footnotesize G.FMT.10 & \footnotesize 8 & \footnotesize 行宽不超过120个字符符 \\
        \hline
        \footnotesize G.NAM.03 & \footnotesize 2 & \footnotesize 类、枚举和接口名应采用大驼峰命名 \\
        \hline
        \footnotesize G.FMT.07 & \footnotesize 1 & \footnotesize 应该避免空块，必须使用空块时，应采用统一的大括号换行风格 \\
        \hline
        \footnotesize G.CMT.03 & \footnotesize 2 & \footnotesize 方法的Javadoc中应该包含功能说明，根据实际需要按顺序使用@param、@return、@throws标签对参数、返回值、异常进行注释--功能描述和标签之间要有一个空行 \\
        \hline
        \footnotesize G.MET.01 & \footnotesize 15 & \footnotesize 方法要简短--方法的代码块深度不应超过4层 \\
        \hline
        \footnotesize G.OTH.03 & \footnotesize 9 & \footnotesize 不用的代码段包括import，直接删除，不要注释掉--不用的import语句，直接删除，不要注释掉 \\
        \hline
        \footnotesize G.MET.01 & \footnotesize 13 & \footnotesize 方法要简短--方法行数不应超过50行 \\
        \hline
        \footnotesize G.MET.01 & \footnotesize 1 & \footnotesize 方法要简短--方法的参数不应超过5个 \\
        \hline
        \footnotesize G.NAM.05 & \footnotesize 1 & \footnotesize 常量名采用全大写单词，单词间以下划线分隔 \\
        \hline
        \footnotesize G.CON.12 & \footnotesize 3 & \footnotesize 避免不加控制地创建新线程，应该使用线程池来管控资源 \\
        \hline
        \footnotesize G.FMT.13 & \footnotesize 92 & \footnotesize 用空格突出关键字和重要信息 \\

        \hline
        \footnotesize 总计 & \footnotesize 880 & \footnotesize  \\
    \end{longtable}
    
    
\end{itemize}


\newpage
\subsection{维护后的软件原型以及功能展示}
\subsubsection{设置界面背景}
修改了小米便签的初始背景，更具有美观性，让用户有良好的使用体验。同时，可以对背景进行切换操作，总共设计了2款不同背景。（见图24、图25、图26）


%并列图片

\begin{figure}[htbp]
		\centering
		\begin{minipage}[b]{0.3\textwidth}
			\includegraphics[width=\textwidth]{picture/12.png}
			\caption{设置背景1}
		\end{minipage}
		\hfill
		\begin{minipage}[b]{0.3\textwidth}
			\includegraphics[width=\textwidth]{picture/13.png}
			\caption{设置背景按钮}
		\end{minipage}
        
		\vspace{1em} % 添加垂直间距
		\begin{minipage}[b]{0.25\textwidth}
			\includegraphics[width=\textwidth]{picture/14.png}
			\caption{设置背景2}
		\end{minipage}
		
\end{figure}



\newpage
\subsubsection{欢迎界面}
实现进入便签前两秒钟的欢迎界面，让用户有良好的使用体验。（见图27）
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/15.png}
    \caption{欢迎界面}
\end{figure}

\subsubsection{登录密码}

在主界面菜单中，有新建登陆密码按钮、删除登陆密码按钮和修改登录密码按钮。
点击新建登陆密码会出来新建登录密码界面，里面有输入密码和确认密码，如果输入密码和确认密码不一致则要求用户重新输入。（见图28）

这一功能的时序图如图33所示。
\begin{figure}[htbp]
		\centering
		\begin{subfigure}[b]{0.45\textwidth}
			\includegraphics[width=\textwidth]{picture/16.png}
		
		\end{subfigure}
		\hfill
		\begin{subfigure}[b]{0.45\textwidth}
			\includegraphics[width=\textwidth]{picture/17.png}
			
		\end{subfigure}
		\caption{新增设置密码的操作}
	\end{figure}

\newpage
我们新建密码为“111”，再次进行登录操作可以发现，必须要输入密码才能进入应用。
输入密码之后可以成功进入。（见图29）
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/18.png}
    \caption{新增密码后的登录界面，要求输入密码}
\end{figure}

\newpage
如图30所示，我们重新设置密码的时候，需要我们输入现有的密码，然后才能设置新的密码，输入新的密码“123”，确认密码，密码进行更换。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/19.png}
    \caption{重新设置密码}
\end{figure}

\newpage
再次登录的时候，原本的密码“111”已经不再适用，输入现有密码“123”才能够成功进入。（见图31）
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/20.png}
    \caption{使用原有的密码登录失败}
\end{figure}

\newpage
同样的，要想删除设置的密码，也要先输入原有的密码。（如图32）删除之后，再次点击删除密码的按钮会提醒“没有设置密码”。

\begin{figure}[H]
		\centering
		\begin{subfigure}[b]{0.45\textwidth}
			\includegraphics[width=\textwidth]{picture/21.png}
			\caption{删除密码}
		\end{subfigure}
		\hfill
		\begin{subfigure}[b]{0.45\textwidth}
			\includegraphics[width=\textwidth]{picture/22.png}
			\caption{删除密码之后显示没有设置密码}
		\end{subfigure}
		\caption{删除设置的密码}
\end{figure}

\newpage
\begin{figure}[H]
    \centering
    \includegraphics[width=0.92\textwidth]{picture/seq3_Login.png}
    \caption{登录密码的时序图}
\end{figure}

\newpage

\subsubsection{翻译功能}
在便签编辑界面的上方，有个翻译按钮，点开之后有三个按钮可以选择：中文翻译为英文、英文翻译为中文、还原，其中还原可以将文本还原为翻译之前的内容。这一功能的时序图如图37所示。

如图34所示，可以将便签内的内容由英文转化为中文。例：“Welcome to the new world.”可以翻译为“欢迎来到新世界。”

%并列图片
\begin{figure}[htbp]
		\centering
		\begin{subfigure}[b]{0.45\textwidth}
			\includegraphics[width=\textwidth]{picture/23.png}
			
		\end{subfigure}
		\hfill
		\begin{subfigure}[b]{0.45\textwidth}
			\includegraphics[width=\textwidth]{picture/24.png}
			
		\end{subfigure}
		\caption{翻译功能中的将英文翻译为中文}
\end{figure}

\newpage
与此同时，我们也可以将便签内的内容由中文转化为英文。（见图35）例：“欢迎来到新世界。”可以翻译为“Welcome to the new world.”
%并列图片
\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=\textwidth]{picture/25.png}
        
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=\textwidth]{picture/26.png}
        
    \end{subfigure}
    \caption{翻译功能中将中文转化为英文}
\end{figure}

\newpage
另外，我们在翻译功能中还实现了，将翻译的内容进行还原，可以将翻译之后的内容再还原回去。（见图36）

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=\textwidth]{picture/27.png}
        
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=\textwidth]{picture/28.png}
        
    \end{subfigure}
    \caption{翻译功能中的还原操作}
\end{figure}

\newpage
\begin{figure}[H]
    \centering
    \includegraphics[width=1.0\textwidth]{picture/seq4_Translate.png}
    \caption{翻译功能的时序图}
\end{figure}


\newpage
\subsubsection{插入图片}

在便签编辑界面增加插入图片按钮，点击后跳转到相册，供用户选择插入图片，用户选好图片后将图片的路径插入到文本中，在将文本中的路径显示成图片。（见图38）
%插入图片29
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/29.png}
    \caption{将本地相册中的图片导入便签编辑界面中}
\end{figure}


\newpage
\subsubsection{统计字符个数}
在便签编辑页面的左上角菜单里面，添加了统计总字符数的按钮，可以实时反映便签中的字符个数。如图39所示。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/30.png}
    \caption{统计字符个数}
\end{figure}

\newpage
\subsubsection{富文本功能}

在便签编辑界面，当选中文本后，选中文本下面会显示加粗、斜体、删除线以及高亮按钮，可以对文本进行加粗、斜体、删除线以及高亮等操作。(见图40)

其中加粗功能见图41，斜体功能见图42，删除线功能见图43，高亮功能见图44。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/31.png}
    \caption{富文本功能}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/32.png}
    \caption{加粗功能}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/33.png}
    \caption{斜体功能}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/34.png}
    \caption{删除线功能}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/35.png}
    \caption{高亮功能}
\end{figure}

\newpage
\subsubsection{朗读功能}

在修改便签界面上侧有朗读按钮，点击朗读按钮就可以朗读便签文本的内容（除去了空格、换行符、图片路径），功能界面见图45。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/36.png}
    \caption{朗读功能}
\end{figure}

\newpage
\subsubsection{私密模式}
在写便签前的界面，右上角的菜单中，添加两个按钮：私密模式和退出私密模式。
点击私密模式后，所有便签的在首页的显示都是“123456789”，（见图46）防止其他人通过首页了解便签内部信息。点击退出私密模式即可退出私密模式。


%插入并列图片
\begin{figure}[H]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=\textwidth]{picture/37.png}
        \caption{私密模式按钮}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=\textwidth]{picture/38.png}
        \caption{进入私密模式}
    \end{subfigure}
    \caption{私密模式}
\end{figure}

\newpage
当我们退出私密模式时，首行内容重新显示出来。如图47所示。
\begin{figure}[H]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{picture/39.png}
        
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{picture/40.png}
        
    \end{subfigure}
    \caption{退出私密模式}
\end{figure}

\newpage
\subsubsection{笔记编辑内搜索}
\begin{itemize}
    \item 在编辑笔记界面，点击搜索按钮，可以对笔记内容进行搜索。(见图48(a))
    \item 点击搜索按钮后，会弹出搜索框，输入要搜索的内容，点击确定按钮，可以搜索到所有包含该内容的内容。(见图48(b))
    \item 当搜索到内容时，会高亮所有搜索到的内容。(见图49(a))
    \item 如果搜索不到内容，会显示“未找到相关内容”。(见图49(b))
    \item 点击取消按钮，可以取消搜索，高亮的文本会恢复到原来的颜色。
\end{itemize}



\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{picture/41.png}
    \caption{搜索按钮}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{picture/42.png}
    \caption{点击搜索按钮，弹出搜索框}
    \end{subfigure}
    \caption{笔记内搜索}
\end{figure}

\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{picture/41.png}
    \caption{搜索到内容，高亮显示} 
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{picture/42.png}
    \caption{搜索不到内容，显示“未找到相关内容”}
    \end{subfigure}
    \caption{笔记内搜索}
\end{figure}

\newpage
\subsubsection{模板便签}
在便签编辑界面，点击模板按钮，可以对便签内容进行模板化。（见图50、51）
\begin{figure}[htbp]
	\centering
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/Template tag 1.png}
		\caption{模板便签(a)}
		
	\end{minipage}
	%\qquad
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/Template tag 2.png}
		\caption{模板便签(b)} 
		
	\end{minipage}
\end{figure}


模板便签功能允许用户快速选择预设的便签格式，以提高便签创建的效率。用户可以在编辑界面中点击模板按钮，系统将展示可用的模板列表。选择一个模板后，便签内容将自动填充为该模板的格式，用户只需进行必要的修改即可。此功能特别适合需要频繁使用相似格式的用户，能够有效节省时间并保持便签的一致性。




\newpage
\subsubsection{语音听写}

在便签编辑界面，点击语音听写按钮，可以对便签内容进行语音听写。（见图52、53）

时序图如图54所示。

\begin{figure}[htbp]
	\centering
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/linsten1.png}
		\caption{语音听写(a)}
		
	\end{minipage}
	%\qquad
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/linsten2.png}
		\caption{语音听写(b)} 
	
	\end{minipage}
\end{figure}

通过语音听写功能,用户可以直接通过语音输入内容,无需手动输入文字。具体使用步骤如下:
\begin{enumerate}
    \item 在便签编辑界面点击语音听写按钮,进入语音听写模式
    \item 系统会调用手机麦克风,用户可以开始说话
    \item 语音识别引擎会实时将用户的语音转换为文字
    \item 转换后的文字会自动插入到当前光标位置
    \item 用户可以随时暂停或结束语音输入
\end{enumerate}

该功能支持中文普通话识别,可以较为准确地识别日常用语和专业术语。语音识别过程在本地完成,保护用户隐私。同时支持实时预览识别结果,方便用户及时纠错。这大大提高了便签记录的效率,特别适合需要快速记录想法或无法使用手写输入的场景。

\newpage

\begin{figure}[H]
    \centering
    \includegraphics[width=1.0\textwidth]{picture/seq12_Iat.png}
    \caption{语音听写的时序图}
\end{figure}


\newpage
\subsubsection{语音合成}
在便签编辑界面，点击语音合成按钮，可以对便签内容进行语音合成。（见图55）
点击语音合成按钮后，会弹出语音合成界面，输入要合成的内容，点击确定按钮，可以合成语音。（见图56、57）

时序图如图58所示。
\begin{figure}[htbp]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/Speech synthesis diagram 1.png}
    \caption{语音合成}
\end{figure}

该语音合成功能，还支持语音类型和音频类型，见图56、57。
\begin{figure}[H]
	\centering
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/Speech synthesis diagram 2.png}
		\caption{语音类型}
	
	\end{minipage}
	%\qquad
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/Speech synthesis diagram 3.png}
		\caption{音频类型} 
		
	\end{minipage}
\end{figure}

\newpage
\begin{figure}[H]
    \centering
    \includegraphics[width=0.9\textwidth]{picture/seq13_Tts.png}
    \caption{语音合成的时序图}
\end{figure}
\newpage

\subsubsection{对话式大模型}
在便签编辑界面和接入了对话式大模型，可以对便签内容进行对话式大模型交互。（见图59）

对话式大模型的流程图见图60，时序图见图61。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/Dialogue-based large models.png}
    \caption{对话式大模型}
\end{figure}

\newpage
\begin{figure}[H]
    \centering
    \includegraphics[width=1.1\textwidth]{picture/seq14-LL.png}
    \caption{对话式大模型的流程图}
\end{figure}
\newpage
\begin{figure}[H]
    \centering
    \includegraphics[width=1.0\textwidth]{picture/seq14-LLM.png}
    \caption{对话式大模型的时序图}
\end{figure}



\newpage
\subsubsection{撤回功能}
在进行便签编辑时，有时候会不小心错误的操作，这时候就需要撤回功能来恢复之前的状态。（见图62）
点击菜单栏中的撤回按钮，可以恢复到上一个状态。
\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{picture/Undo function1.png}
    \caption{撤回功能}
\end{figure}





\newpage
\subsubsection{获取地理位置}
在编辑编辑的下方，有一个获取地理位置按钮，点击该按钮，弹出功能界面，有两个选项获取地理位置和清楚地理位置。

点击获取地理位置按钮，可以获取当前的地理位置。（见图63）

点击清楚地理位置按钮，可以清除当前的地理位置。（见图64）
\begin{figure}[H]
	\centering
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/Obtain the geographical location schematic diagram 1.png}
		\caption{获取地理位置}
		
	\end{minipage}
	%\qquad
	\begin{minipage}{0.49\linewidth}
		\centering
		\includegraphics[width=0.9\linewidth]{picture/Obtain the geographical location schematic diagram 2.png}
		\caption{清除地理位置} 
		
	\end{minipage}
\end{figure}












\section{实践收获和体会}

\subsection{收获}
\begin{enumerate}
    \item \textbf{对代码分析方法的深入掌握} \\
    从面对大规模代码的初步略读到精读，再到实际的维护，实现了完整的开发流程实践。通过逐步分析代码的用例、各个包和类之间的逻辑关系，熟悉了复杂软件架构的设计理念。在代码标注过程中，提升了对代码细节的把控能力，包括对重要变量、方法功能的精确说明和逻辑梳理。

    \item \textbf{Java语言和软件工程能力的提升} \\
    学会了Java语言的使用规范，能够撰写符合高质量标准的代码。熟练掌握了对Java代码的深度阅读与优化方法，能够独立完成对代码功能的扩展与维护。

    \item \textbf{代码质量分析能力的提升} \\
    熟悉了多种代码质量分析方法，包括手工分析和工具辅助分析（如Sonarqube）。特别是通过工具发现和修复代码中的潜在问题，从而提高了代码的可维护性与稳定性。

    \item \textbf{团队协作能力的提高} \\
    通过将大规模工作细分为具体任务，合理分工并协调团队成员的进度，确保了项目的顺利完成。在项目推进过程中，学会了如何高效沟通与协作，特别是在问题集中处理和解决上形成了有效的团队策略。

    \item \textbf{用户体验设计的优化意识} \\
    在维护工作中新增了大量以用户需求为导向的功能，如翻译功能、语音听写、模板便签等，这些实践增强了对用户体验设计的理解与感知。
\end{enumerate}

\subsection{体会}
\begin{enumerate}
    \item \textbf{应对复杂代码架构的挑战} \\
    面对大规模、复杂的代码体系，初期分析时会因为包和类之间的逻辑关系复杂而产生理解偏差，需要反复调试与验证才能准确把握整体架构。在实现新功能时，需要权衡新增功能对现有系统的影响，并在开发中保持代码风格与原有代码一致，确保项目的整体性。

    \item \textbf{团队分工和协作的重要性} \\
    项目初期团队分工不够明确，导致了部分工作的重复与进度缓慢。通过明确分工和定期检查进度，有效解决了这些问题，确保了项目按计划完成。

    \item \textbf{代码维护与优化的思维转变} \\
    在实践中逐渐认识到，代码维护不仅仅是功能新增，还包括对原有代码的优化、注释的补充以及对可读性和扩展性的提升。尤其是通过代码质量工具的分析，进一步理解了高质量代码的标准与细节，并体会到提升代码质量对于后续维护的重要性。

    \item \textbf{对软件工程整体流程的深刻理解} \\
    从代码分析、功能设计到质量检验，再到最终的产品交付，整个过程强化了对软件工程开发流程的认知。体会到软件开发不仅是技术实现，还包括规划、沟通与持续优化。
\end{enumerate}


\end{document}
