You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xiaomi/doc/代码泛读、标注、维护报告/小米便签泛读、标注和维护报告文档.tex

1591 lines
79 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

\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个类的源码以及res包中部分xml文件完成了总计3924左右行详细注释包括类的功能说明、关键方法逻辑解析、关键语句和语句块功能说明以及重要变量定义增强了代码的可读性和可维护性。
\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架构的逻辑个人判断它应该担任是CControl控制器的角
色:处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送
数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。
\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个类的代码进行了标注标注的代码行数共有3924行左右。
具体的这些代码注释的分部如表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 & 311 主界面,实现处理文件夹列表的活动 \\
\hline
\small 34 & ui& NotesListAdapter & 20 便签列表链接器(链接数据库) \\
\hline
\small 35 &ui & NotesListItem &89 便签列表项 \\
\hline
\small 36 & ui& NotesPreferenceActivity &187 便签同步的设置界面 \\
\hline
\small 37 & widget& NoteWidgetProvider & 20 桌面挂件 \\
\hline
\small 38 & widget& NoteWidgetProvider\_2x & 12行。NoteWidgetProvider,负责处理2x大小的小部件更新和其他操作 \\
\hline
\small 39 & widget& NoteWidgetProvider\_4x & 124倍大小挂件 \\
\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维护后的小米便签主要更改了ui包和增加了第三方API包ui包和第三方API包中增加和更改类的类图见图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{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
\subsubsection{界面设计}
小米便签应用的界面设计从提供的两张截图来看,简洁美观,同时功能强大,下面针对截图中的界面设计进行详细分析。
\paragraph{主界面}
\begin{itemize}
\item \textbf{功能菜单设计}
主界面的功能菜单通过右上角的三点图标展开,包含多个功能选项,例如“新建文件夹”、“导出文本”、“同步”、“设置”等。这种菜单设计在布局上便于快速访问,同时保持界面整洁。
菜单中功能选项排列紧凑,功能分布清晰,例如数据管理类功能(如导出文本、同步)和个性化设置(如切换图片背景)被明确区分。
\item \textbf{便签内容列表}
主界面中部为便签的内容列表,每个便签以黄色背景块区分,突出文字内容,同时便于用户快速预览和区分各个便签。
列表设计采用块状卡片布局,用户能够直观地浏览每条便签的内容摘要,便签标题也帮助用户快速聚焦。
\item \textbf{背景设计}
背景为星空主题,搭配柔和的配色,营造出宁静的使用氛围,与便签功能的“记录灵感”定位相符。同时,下方的“写便签”按钮以皮革质感样式设计,增强界面的现代与复古结合的美感。
\end{itemize}
\paragraph{内容详情界面}
\begin{itemize}
\item \textbf{功能扩展菜单}
右上角的功能菜单通过三点图标展开,提供针对便签内容的更多功能选项,包括“添加备注”、“删除”、“字体大小调整”、“进入清单模式”、“分享”等。这些功能操作集中在内容详情界面,便于用户针对当前便签进行管理或深度编辑。
功能菜单的布局整齐清晰,同时与主界面功能菜单保持一致,增强了界面的统一性。
\item \textbf{内容显示区域}
便签内容显示在黄色背景区域中,文字清晰易读。上方还提供了“朗读”、“翻译”功能按钮,扩展了便签的应用场景,例如用户可通过语音或翻译功能处理多语言文本。
内容显示的黄色背景设计柔和,既减少视觉疲劳,又能帮助用户专注于记录的内容。
\item \textbf{底部快捷功能按钮}
界面底部设计有“星火”和“听写”按钮,这些功能可能涉及语音识别或与外部服务的集成,为用户提供便捷入口。按钮布局简洁,保持了整体界面的干净与直观。
\end{itemize}
\paragraph{界面整体布局分析}
\begin{itemize}
\item 两个界面均采用了顶部菜单、中部内容、底部功能的三段式布局,保证了使用逻辑的一致性,同时最大化利用屏幕空间。
\item 背景设计温馨,功能菜单和操作按钮布局简洁明了,为用户提供了流畅的操作体验。
\item 便签内容区域设计醒目,以黄色背景突出文字,适合内容阅读和记录场景。
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{picture/113.png}
\caption{维护后的小米便签的界面设计}
\end{figure}
\newpage
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{picture/112.png}
\caption{维护后的小米便签的界面设计}
\end{figure}
\newpage
\subsection{维护代码数量以及质量情况}
\subsubsection{维护代码数量}
在完成小米便签的维护工作之后我们使用一个插件统计小米便签项目的代码数量情况从java文件和xml文件两个方面
进行统计,分别从总行数、源代码数量、注释行数、注释行数的百分比、空行数、空行数的百分比进行统计。
\begin{enumerate}
\item 首先是维护之前的数据见图14、图15。
\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 其次是维护之后的数据见图16、图17。
\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文件的数据绘制成图见图18、图19、图20、图21。
\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行左右见图22、图23。
\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{各功能代码规模}
\begin{longtable}{|p{0.15\textwidth}|p{0.15\textwidth}|p{0.15\textwidth}|p{0.2\textwidth}|}
\caption{代码质量分析详细结果} \\
\hline
\footnotesize 序号 & \footnotesize 维护类别 & \footnotesize 名称 & \footnotesize 受影响的代码行数 \\
\hline
\footnotesize 1 & \footnotesize 新增功能 & \footnotesize 设置界面背景 & \footnotesize 42 \\
\hline
\footnotesize 2 & \footnotesize 新增功能 & \footnotesize 欢迎界面 & \footnotesize 115 \\
\hline
\footnotesize 3 & \footnotesize 新增功能 & \footnotesize 登陆密码 & \footnotesize 224 \\
\hline
\footnotesize 4 & \footnotesize 新增功能 & \footnotesize 翻译功能 & \footnotesize 255 \\
\hline
\footnotesize 5 & \footnotesize 新增功能 & \footnotesize 插入图片 & \footnotesize 242 \\
\hline
\footnotesize 6 & \footnotesize 新增功能 & \footnotesize 统计字符个数 & \footnotesize 169 \\
\hline
\footnotesize 7 & \footnotesize 新增功能 & \footnotesize 富文本功能 & \footnotesize 224 \\
\hline
\footnotesize 8 & \footnotesize 新增功能 & \footnotesize 朗读功能 & \footnotesize 114 \\
\hline
\footnotesize 9 & \footnotesize 新增功能 & \footnotesize 私密模式 & \footnotesize 186 \\
\hline
\footnotesize 10 & \footnotesize 新增功能 & \footnotesize 笔记编辑框内搜索 & \footnotesize 185 \\
\hline
\footnotesize 11 & \footnotesize 新增功能 & \footnotesize 模板便签 & \footnotesize 102 \\
\hline
\footnotesize 12 & \footnotesize 新增功能 & \footnotesize 语音听写 & \footnotesize 781 \\
\hline
\footnotesize 13 & \footnotesize 新增功能 & \footnotesize 语音合成 & \footnotesize 797 \\
\hline
\footnotesize 14 & \footnotesize 新增功能 & \footnotesize 对话式大模型 & \footnotesize 672 \\
\hline
\footnotesize 15 & \footnotesize 新增功能 & \footnotesize 撤回功能 & \footnotesize 116 \\
\hline
\footnotesize 16 & \footnotesize 新增功能 & \footnotesize 获取地理位置 & \footnotesize 147 \\
\hline
\end{longtable}
\newpage
\subsubsection{维护后的质量分析}
在代码维护之后我们小组再次对代码进行了质量分析使用CodeArts中的代码审查功能对代码的质量进行分析。
分析结果见图24、图25。
\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.01270个涉及public或protected修饰符的元素未添加JavaDoc注释。这表明代码文档化不足可能导致后续维护和理解困难。
G.CMT.06122个注释与代码之间存在不一致性可能导致误解。
\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款不同背景。见图26、图27、图28
%并列图片
\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{欢迎界面}
实现进入便签前两秒钟的欢迎界面让用户有良好的使用体验。见图29
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/15.png}
\caption{欢迎界面}
\end{figure}
\subsubsection{登录密码}
在主界面菜单中,有新建登陆密码按钮、删除登陆密码按钮和修改登录密码按钮。
点击新建登陆密码会出来新建登录密码界面里面有输入密码和确认密码如果输入密码和确认密码不一致则要求用户重新输入。见图30
这一功能的时序图如图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”再次进行登录操作可以发现必须要输入密码才能进入应用。
输入密码之后可以成功进入。见图31
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/18.png}
\caption{新增密码后的登录界面,要求输入密码}
\end{figure}
\newpage
如图32所示我们重新设置密码的时候需要我们输入现有的密码然后才能设置新的密码输入新的密码“123”确认密码密码进行更换。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/19.png}
\caption{重新设置密码}
\end{figure}
\newpage
再次登录的时候原本的密码“111”已经不再适用输入现有密码“123”才能够成功进入。见图33
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/20.png}
\caption{使用原有的密码登录失败}
\end{figure}
\newpage
同样的要想删除设置的密码也要先输入原有的密码。如图34删除之后再次点击删除密码的按钮会提醒“没有设置密码”。
\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{翻译功能}
在便签编辑界面的上方有个翻译按钮点开之后有三个按钮可以选择中文翻译为英文、英文翻译为中文、还原其中还原可以将文本还原为翻译之前的内容。这一功能的时序图如图39所示。
如图36所示可以将便签内的内容由英文转化为中文。例“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
与此同时我们也可以将便签内的内容由中文转化为英文。见图37“欢迎来到新世界。”可以翻译为“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
另外我们在翻译功能中还实现了将翻译的内容进行还原可以将翻译之后的内容再还原回去。见图38
\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{插入图片}
在便签编辑界面增加插入图片按钮点击后跳转到相册供用户选择插入图片用户选好图片后将图片的路径插入到文本中在将文本中的路径显示成图片。见图40
%插入图片29
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/29.png}
\caption{将本地相册中的图片导入便签编辑界面中}
\end{figure}
\newpage
\subsubsection{统计字符个数}
在便签编辑页面的左上角菜单里面添加了统计总字符数的按钮可以实时反映便签中的字符个数。如图41所示。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/30.png}
\caption{统计字符个数}
\end{figure}
\newpage
\subsubsection{富文本功能}
在便签编辑界面,当选中文本后,选中文本下面会显示加粗、斜体、删除线以及高亮按钮,可以对文本进行加粗、斜体、删除线以及高亮等操作。(见图42)
其中加粗功能见图43斜体功能见图44删除线功能见图45高亮功能见图46。
\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{朗读功能}
在修改便签界面上侧有朗读按钮点击朗读按钮就可以朗读便签文本的内容除去了空格、换行符、图片路径功能界面见图47。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/36.png}
\caption{朗读功能}
\end{figure}
\newpage
\subsubsection{私密模式}
在写便签前的界面,右上角的菜单中,添加两个按钮:私密模式和退出私密模式。
点击私密模式后所有便签的在首页的显示都是“123456789”见图48防止其他人通过首页了解便签内部信息。点击退出私密模式即可退出私密模式。
%插入并列图片
\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
当我们退出私密模式时首行内容重新显示出来。如图49所示。
\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 在编辑笔记界面,点击搜索按钮,可以对笔记内容进行搜索。(见图50(a))
\item 点击搜索按钮后,会弹出搜索框,输入要搜索的内容,点击确定按钮,可以搜索到所有包含该内容的内容。(见图50(b))
\item 当搜索到内容时,会高亮所有搜索到的内容。(见图51(a))
\item 如果搜索不到内容,会显示“未找到相关内容”。(见图51(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{模板便签}
在便签编辑界面点击模板按钮可以对便签内容进行模板化。见图52、53
\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}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{picture/111.png}
\caption{模版1}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{picture/114.png}
\caption{模版2}
\end{figure}
模板便签功能允许用户快速选择预设的便签格式,以提高便签创建的效率。用户可以在编辑界面中点击模板按钮,系统将展示可用的模板列表。选择一个模板后,便签内容将自动填充为该模板的格式,用户只需进行必要的修改即可。此功能特别适合需要频繁使用相似格式的用户,能够有效节省时间并保持便签的一致性。
\newpage
\subsubsection{语音听写}
在便签编辑界面点击语音听写按钮可以对便签内容进行语音听写。见图56、57
时序图如图58所示。
\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{语音合成}
在便签编辑界面点击语音合成按钮可以对便签内容进行语音合成。见图59
点击语音合成按钮后会弹出语音合成界面输入要合成的内容点击确定按钮可以合成语音。见图60、61
时序图如图62所示。
\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{对话式大模型}
在便签编辑界面和接入了对话式大模型可以对便签内容进行对话式大模型交互。见图63
对话式大模型的流程图见图64时序图见图65。
\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_chatLLM.png}
\caption{对话式大模型的时序图}
\end{figure}
\newpage
这里对对话式大模型以及语音合成与转写功能进行一部分特殊说明由于使用了第三方SDK并且需要与第三方服务器Iflytek Server等连接因此虚拟机
必须需要连接网络这一点百度翻译也是一样的。其次讯飞星火大模型和语音识别功能还依赖官方提供的特定MSC和aar文件这些库依赖需要在build.gradle中额外声明包括dependencies依赖项声明和依赖树结构对应的MSC和AAR文件已经上传至项目中的源码文件夹下的app子包的libs包中值得一提的是该MSA和AAR文件都只支持arm64-v8a或armeabi-v7a处理器部分虚拟机可能不具备调试的前提最后讯飞的SDK服务有一定期限到期后需要用户重新购买服务并在本项目中替换appid、密钥等信息。
MSC的部分文件如表5所示
\begin{longtable}{|p{0.05\textwidth}|p{0.20\textwidth}|p{0.18\textwidth}|}
\caption{} \\
\hline
\footnotesize 序号 & \footnotesize 文件名 & \footnotesize 说明\\
\hline
\endfirsthead
\hline
\endlastfoot
\footnotesize 1 & 接口InitListener & \footnotesize 初始化回调接口\\
\hline
\footnotesize 2 & 接口SpeechListener & \footnotesize 通用回调接口\\
\hline
\footnotesize 3 & 类SpeechRecognizer & \footnotesize 语音识别类\\
\hline
\footnotesize 4 & 类SpeechSynthesizer & \footnotesize 语音识别类\\
\hline
\footnotesize 5 & 类SpeechUtility & \footnotesize SDK初始化类\\
\hline
\end{longtable}
\newpage
\subsubsection{撤回功能}
在进行便签编辑时有时候会不小心错误的操作这时候就需要撤回功能来恢复之前的状态。见图66
点击菜单栏中的撤回按钮,可以恢复到上一个状态。
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{picture/Undo function1.png}
\caption{撤回功能}
\end{figure}
\newpage
\subsubsection{获取地理位置}
在编辑编辑的下方,有一个获取地理位置按钮,点击该按钮,弹出功能界面,有两个选项获取地理位置和清楚地理位置。
点击获取地理位置按钮可以获取当前的地理位置。见图67其地理位置为虚拟机设定的地理位置可以在Android Studio中的Device Manager中添加设定自己IP所在位置也可以沿用虚拟机本身的设置。
本图中返回的西经122°北纬37°经查阅为北美洲加利福尼亚州地区的西南沿岸与中国时差约为10小时左右时差和虚拟机-真机时差符合的比较好,可见功能的正确性。
点击清除地理位置按钮可以清除当前的地理位置。见图68
\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}
\newpage
\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}
\subsection{参考文献与网址}
\subsubsection{讯飞智能API介绍}
讯飞开放平台文档中心 https://www.xfyun.cn/doc/mscapi/Android/androidinit.html
\subsubsection{百度翻译API介绍}
百度翻译开放平台文档中心 https://fanyi-api.baidu.com/doc/11
\subsubsection{UML建模}
UML建模工具https://plantuml.com/zh/
\subsubsection{CodeArts质量分析}
CodeArts质量分析工具https://www.huaweicloud.com/product/codearts/quality.html
\end{document}