Android Studio advanced configuration

本文介绍了 Android Studio 的一些高级配置技巧,包括显示行号、驼峰选择、自动添加命名前缀等功能,还介绍了如何自定义代码模板和项目模板。

转载自http://liukun.engineer/2016/04/10/Android-Studio-advanced-configuration/

本文主要内容来自 Dmytro Danylyk 在 Medium 的文章Configuring Android Studio。在此感谢!虽然使用Android Studio 有一定的时间了,但文中的某几个设置之前还真不知道,且原文在长城外,因此在翻译原文的基础上作了一些补充,若有新的发现会即时更新。当然,原文中个别技巧也谈不上高级,出于对作者的尊重,仍然全部翻译了过来,希望对大家尤其是刚接触 Android Studio 的朋友有一点帮助。

前面的话

Android Studio 提供了一个非常方便的功能帮助我们导入或者导出设置。因此我们在安装一个新的 Android Studio 的时候通常会导入一个之前的设置。但是,最近发生了一件悲剧的事情-我丢失了我的设置文件(幸灾乐祸点个赞~)。

我的建议:即时的备份你的设置文件到云盘等地方。

当我在配置我的 Android Studio 的时候,下面的一些配置技巧或许对你有一定的帮助。

显示行号

当我首次启动我的 Android Studio 的时候,我想做的第一件事就是希望能看到文件中的行号,我一直很奇怪这个基本的配置为毛不是默认开启的?!
未显示行号:
这里写图片描述

显示行号:
这里写图片描述
配置方法:

File | Settings 打开设置
选择 Editor | General | Appearance
勾选 Show line numbers
这里写图片描述

设置
ps:在编辑区域最左侧右键选中 Show line numbers 也可以让当前打开的文件显示行号,不过这是一个临时设置,当前文件关闭后便失效。

驼峰选择

Android 开发中,我们通常会使用驼峰命名法对变量进行命名,但是当我们通过 Ctrl + Left / Right 键改变字符选择区域的时候 Android Studio 默认不支持‘驼峰’单词的选择。

不支持驼峰选择:
这里写图片描述

支持驼峰选择:
这里写图片描述
配置方法

File | Settings 打开设置
选择 Editor | General | Smart Keys
选中 Use “CamelHumps” words
这里写图片描述

设置
注意:如果你仍然希望当鼠标在单词上双击之后选中整个单词,需要作如下设置:

File | Settings 打开设置
选择 Editor | General
取消选中 ‘Honor Camel Humps words settings when selecting on double click’
命名前缀

我们通常会遵循 Android 官方关于编码风格的指导来进行字段命名。在 Android 源码中我们可以看到通常成员变量都是以‘m’开始。其实Android Studio 可以自动在帮我们生成字段名称的时候加上自定义的前缀,如:

非共有,非静态的成员变量以’m’开始
静态成员变量以’s’开始
这里写图片描述

命名前缀
配置方法

File | Settings 打开设置
选择 Editor | Code Style | Java
选择 Code Generation 标签
给普通 Field 添加一个’m’前缀,给 Static filed 添加一个’s’前缀
这里写图片描述

设置
快速导包

在 Android Studio 中,我们可以通过 Alt + Enter 和 Control + Alt + O 进行导包和清除无用导包,但我们都生活在2016年了,这些事情应当快速自动完成。

未开启imports on the fly
这里写图片描述

开启imports on the fly
这里写图片描述
配置方法

File | Settings 打开设置
选择 Editor | General | Auto Import
勾选 Optimize imports on the fly
勾选 Add unambiguous imports on the fly
这里写图片描述

设置
PS:这里我补充一下,关于这个配置,个别朋友在问,如果我的项目中两个甚至多个包下都有一个类叫 ImageLoader ,自动导入的结果有没有可能不是我想要的包下的?兄弟你放心,你去查一下 unambiguous 的意思就知道了。针对包名不确定的情况, Android Studio 会选择 No can no import, you can you up ,不会自作聪明,而是会让你自己手动导入。所以,请放心使用。

Log 颜色

Darcula 主题中 Logcat 的默认配色只有红白两种颜色,不太便于我们区分 Log 的类型。
这里写图片描述

Darcula 主题配色
我建议大家采用之前 Android Holo 主题那种鲜明的配色
这里写图片描述

Holo 主题配色
配置方法

File | Settings 打开设置
选择 Editor | Color & Fonts | Android Logcat
点击 Click on Save As…按钮创建一个新的配色 Scheme
按照下面的表格修改对应的颜色(修改之前需要取消勾选 Use inherited attributes)
Log级别 颜色
Assert: #AA66CC
Debug: #33B5E5
Error: #FF4444
Info: #99CC00
Verbose: #FFFFFF
Warning: #FFBB33

下面是个人的一些补充:

代码配色

Android Studio 中默认的代码配色个人感觉已经很和谐,但这个东西仁者见仁。比如有的朋友会觉得 java 代码中局部变量的默认的白色不太便于快速与其它代码进行区分,这时候就需要自定义 java 代码颜色,这里以局部变量为例。
默认配色
这里写图片描述
自定义配色
这里写图片描述
配置方法

File | Settings 打开设置
选择 Editor | Color & Fonts | Java
点击 Click on Save As…按钮创建一个新的配色 Scheme
展开下方的 Variables 选择 Local variable
设置右侧的 Foreground 颜色
这里写图片描述

设置
工程模板

Android Studio 创建 Module 时并没有将 Android 开发中常用的文件目录全部生成,比如默认只生成了一个 drawable 文件夹,常用的 drawable-hdpi 等文件夹需要我们自己创建。正如前文的作者所言,这都2016年了,这些事情应该自动完成,毕竟我们都很‘懒’!

默认结构
这里写图片描述

自定义结构
这里写图片描述
配置方法1
这里写图片描述
进入 Android Studio 安装目录
依次进入 plugins | android | lib | templates | gradle-projects | NewAndroidModule | root | res
在res文件夹下创建 drawable-hdpi 等文件夹(可选:从对应的 mipmap文件夹中拷贝 iclauncher.png到创建的 drawable文件夹中)
回到 NewAndroidModule 目录,用编辑器打 recipe.xml.ftl文件
加入以下配置

配置方法2
这里写图片描述
进入 Android Studio 安装目录
依次进入 plugins | android | lib | templates | gradle-projects | NewAndroidModule
用编辑器打开 recipe.xml.ftl文件,并加入以下配置

这两种方法的区别是,第一种方式可以在文件夹中加入相应的图片,但是配置稍显繁琐,第二种方式配置简单,但是只能创建目录,不能包含默认图片。

当然,通过类似的方式我们还可以在创建 Module 的时候做很多事情,比如:

在 colors.xml 文件中生成常用颜色
在 build.gradle 文件中生成自定义配置
在 .gitignore 文件中生成自定义忽略配置
等等…
活动模板

Android Studio 中默认提供了很多非常方便的活动模板(Live Templates),例如,我们输入 sout 后按 enter 键, Android Studio 会自动帮我们写入 System.out.println();
这里写图片描述

其实 sout 就是 AS 自带的一个活动模板。

这里写图片描述
由此可以看出,活动模板就是我们常用代码的一个缩写。开发中有很多代码都会重复出现,因此自定义合适的活动模板能很大程度上避免我们很多重复的体力劳动。那么问题来了,如何自定义?
这里我们以 Handler 为例。下面是在 Activity 中一个合格的 Handler 该有的样子:

private static class MyHandler extends Handler {
private WeakReference activityWeakReference;

    public MyHandler(MainActivity activity) {
        activityWeakReference = new WeakReference<MainActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        MainActivity activity = activityWeakReference.get();
        if (activity != null) {

        }
    }
}

至于原因我就不再重复了,网上有太多的文章有讲过。现在如果我只希望输入一个‘psh’ 就自动出现上面这段代码的话,我应该这么做:

配置方法

File | Settings 打开设置
选择 Editor | Code Style | Live Templates
点击最右侧的加号并选择 Template Group
在弹出的对话框中输入一个活动模板分组的名称,如 custom
在左侧选中上一步中创建的 custom 分组,点击右边的加号
选择 Live Template ,在 Abbreviation 中对输入 psh
在 Description 中输入这个活动模板的描述
在 Template text 中输入以下代码

点击下方的 Define 按钮,选中 java 表示这个模板用于java代码
点击右侧的 Edit variables
选择 Expression 下拉框中的 className 并勾选 Skip if…
这个操作的作用是,AS会自动将我们在上一步中用’$’符包裹的 className自动替换为当前类不含包名的类名

点击 Apply 和 Ok 让设置生效。
至此,一个我们自定义的 custom 模板组中的 psh 活动模板就定义完成了。下面我们来验证一下,见证奇迹的时候到了:
这里写图片描述

<think>我们正在讨论的是高级配置Advanced Configuration)的方法。根据用户之前的问题,他之前配置了串口的基本设置(Basic Configuration),现在想了解如何配置高级设置(Advanced Configuration)。 根据提供的引用,我们可以从多个角度来理解高级配置: 1. 引用[1]提到系统配置(System configuration)和应用配置(Application configuration)的合并过程,以及如何在程序中通过事件监听器操作配置。 2. 引用[2]提到在Maui中配置后填充调度(backfill scheduling)的高级参数,如BACKFILLPOLICY等。 3. 引用[3]展示了在Android Studio配置自动导入(Auto Import)的高级设置。 4. 引用[4]则展示了在Varnish中配置健康检查(Health checks)的高级参数。 由于用户之前的问题是关于在CCS(Code Composer Studio)中配置串口,因此我们应聚焦于嵌入式开发中串口高级配置的相关内容。虽然引用中没有直接关于CCS串口高级配置的内容,但我们可以结合嵌入式系统的常见高级配置项进行说明。 在嵌入式系统中,串口的高级配置通常包括: - 中断配置(接收中断、发送中断、错误中断) - DMA配置(使用DMA进行数据传输) - 流控制(硬件流控RTS/CTS) - 高级错误检测和处理 - 超时控制 - 缓冲区管理 因此,我们将围绕如何在CCS中配置这些高级功能来回答。 ### 在CCS中配置串口高级设置(Advanced Configuration) 在Code Composer Studio中,串口的高级配置主要通过SysConfig工具和直接修改代码两种方式实现。以下是详细步骤: --- ### **步骤1:启用中断模式** 1. **在SysConfig中配置**: - 打开UART实例的属性面板 - 找到`Interrupt Settings`部分 - 勾选`Enable Receive Interrupt`(接收中断)和`Enable Transmit Interrupt`(发送中断)[^1] - 设置中断优先级(Priority)和子优先级(Sub-priority) 2. **生成中断处理框架**: - 保存配置后,SysConfig会自动在`ti_drivers_config.c`中生成中断服务函数框架 - 在`main.c`中实现具体的中断处理逻辑: ```c // 接收中断处理示例 void UART0_IRQHandler(void) { if(DL_UART_Main_isReceiveDataAvailable(UART0)) { uint8_t data = DL_UART_Main_receiveData(UART0); // 处理接收数据(例如存入环形缓冲区) } // 清除中断标志位 DL_UART_Main_clearReceiveInterrupt(UART0); } ``` --- ### **步骤2:配置DMA传输** 1. **启用DMA通道**: - 在SysConfig中添加DMA控制器(如`UDMA0`) - 在UART属性页的`DMA Settings`中启用`TX DMA`和`RX DMA` - 分配DMA通道(自动或手动指定) 2. **配置DMA传输参数**: - 设置传输模式(单次/循环) - 配置源地址和目标地址的增量方式 ```c // 手动初始化DMA传输(示例) DL_DMA_initTransfer(UART0_DMA_CHAN_TX, DL_DMA_SRC_INCREMENT_NONE, // 源地址不递增(外设寄存器) DL_DMA_DST_INCREMENT_8, // 目标地址递增(内存缓冲区) DL_DMA_SIZE_8, // 数据宽度8位 1024); // 传输长度 ``` --- ### **步骤3:硬件流控制配置** 1. **启用流控引脚**: - 在UART属性页的`Flow Control`中选择`Hardware (RTS/CTS)` - 系统自动分配RTS(请求发送)和CTS(清除发送)引脚 2. **调整流控阈值**: - 设置接收缓冲区阈值(RTS在低于此阈值时拉低) - 设置发送缓冲区阈值(CTS在高于此阈值时暂停发送) ```c // 高级流控设置(通过寄存器) DL_UART_setFlowControlThresholds(UART0, 128, // RX FIFO阈值(当数据量>128时拉低RTS) 64); // TX FIFO阈值(当空闲空间<64时检测CTS) ``` --- ### **步骤4:错误检测与处理** 1. **启用错误中断**: - 在SysConfig中勾选`Enable Error Interrupt` - 实现错误中断处理函数: ```c void UART0_Error_IRQHandler(void) { uint32_t status = DL_UART_Main_getErrorStatus(UART0); if(status & DL_UART_MAIN_ERROR_FRAMING) { // 帧错误处理 } if(status & DL_UART_MAIN_ERROR_PARITY) { // 校验错误处理 } DL_UART_Main_clearErrorInterrupts(UART0, status); // 清除错误标志 } ``` 2. **配置超时检测**: ```c // 设置接收超时(单位:波特周期) DL_UART_setReceiveTimeout(UART0, 30); // 30个字符传输时间 ``` --- ### **步骤5:自定义缓冲区管理** 1. **替换FIFO缓冲区**: - 默认使用硬件FIFO,可通过API修改深度: ```c DL_UART_setFIFODepth(UART0, DL_UART_FIFO_DEPTH_16, // RX FIFO深度16字节 DL_UART_FIFO_DEPTH_8); // TX FIFO深度8字节 ``` 2. **使用软件环形缓冲区**: - 在中断服务函数中实现自定义缓冲: ```c #define BUF_SIZE 256 uint8_t rx_buffer[BUF_SIZE]; volatile uint16_t rx_head = 0, rx_tail = 0; void UART0_IRQHandler(void) { while(DL_UART_Main_isReceiveDataAvailable(UART0)) { rx_buffer[rx_head] = DL_UART_Main_receiveData(UART0); rx_head = (rx_head + 1) % BUF_SIZE; } } ``` --- ### **高级配置验证方法** 1. **逻辑分析仪测试**: - 使用CCS内置的Logic Analyzer查看信号时序 - 验证流控信号(RTS/CTS)与数据传输的关系 2. **性能分析**: - 在中断/DMA处理函数中加入GPIO翻转代码 - 用示波器测量中断响应时间: ```c void UART0_IRQHandler(void) { DL_GPIO_togglePins(GPIO_PORT_A, GPIO_PIN_0); // 开始测量 // ... 处理中断 DL_GPIO_togglePins(GPIO_PORT_A, GPIO_PIN_0); // 结束测量 } ``` --- ### **常见问题与解决** | **问题现象** | **解决方案** | |----------------------|-----------------------------------------------------------------------------| | **中断丢失数据** | 1. 提高中断优先级<br>2. 使用DMA替代中断<br>3. 增大硬件FIFO深度 | | **流控失效** | 1. 检查RTS/CTS接线<br>2. 验证阈值设置是否匹配缓冲区大小 | | **DMA传输卡死** | 1. 检查DMA通道冲突<br>2. 确认传输完成中断中清理标志位 | > **调试技巧**:使用`DL_UART_getStatus(UART0)`读取状态寄存器,分析`BUSY`、`OE`(溢出错误)等标志位[^4]。 --- ### **总结** 串口高级配置的核心在于: 1. **中断管理**:实现实时响应 2. **DMA应用**:提升传输效率 3. **流控机制**:保证数据可靠性 4. **错误处理**:增强系统鲁棒性 完成配置后,可通过压力测试验证稳定性: ```c // 发送10万字节测试数据 for(int i=0; i<100000; i++) { while(!DL_UART_Main_isTransmitDataEmpty(UART0)); DL_UART_Main_transmitData(UART0, i & 0xFF); } ``` §§相关问题§§ 1. 如何测量串口中断的响应时间? 2. DMA传输中如何避免内存覆盖问题? 3. 硬件流控配置后无法正常通信如何排查? [^1]: UART高级配置手册(中断与DMA章节) [^4]: CCS调试技巧与性能分析方法</think>### 在CCS中配置串口高级设置(Advanced Configuration) 在Code Composer Studio中进行串口高级配置需结合SysConfig工具和手动代码优化,以下是关键配置步骤: --- ### **1. 中断模式配置** **目标**:实现异步数据传输,提高系统响应效率 **步骤**: 1. 在SysConfig的UART属性面板中: - 启用`Interrupt Mode` - 设置中断优先级(Priority)和子优先级(Sub-priority) 2.interval = 5s; // 中断触发间隔[^4] 2. 生成代码后补充中断服务函数: ```c // 在main.c中添加 void UART0_IRQHandler(void) { if(DL_UART_Main_isReceiveDataAvailable(UART0)) { uint8_t data = DL_UART_Main_receiveData(UART0); // 处理接收数据(如存入环形缓冲区) } DL_UART_Main_clearInterruptFlags(UART0, DL_UART_MAIN_IIDX_RX); // 清除中断标志 } ``` --- ### **2. DMA传输配置** **目标**:减少CPU负载,实现高速数据传输 **步骤**: 1. 在SysConfig中: - 添加DMA控制器(如`UDMA0`) - 在UART属性页启用`TX DMA`和`RX DMA` - 分配DMA通道(自动或手动指定) 2. 初始化DMA传输: ```c // 配置DMA传输描述符 DL_DMA_initTransfer(UART0_DMA_CHAN_RX, DL_DMA_SRC_INCREMENT_NONE, // 外设地址固定 DL_DMA_DST_INCREMENT_8, // 内存地址递增 DL_DMA_SIZE_8, // 数据宽度8位 BUFFER_SIZE); // 传输长度 // 启动接收 DL_UART_enableReceiveDMA(UART0); ``` --- ### **3. 高级流控配置** **目标**:防止数据丢失,确保传输可靠性 **配置项**: ```c .probe = { .url = "/"; // 健康检查端点 .threshold = 3; // 成功阈值[^4] .window = 5; // 检测窗口大小 } ``` **实现**: 1. 在SysConfig中启用`Hardware Flow Control` 2. 手动配置RTS/CTS阈值: ```c // 设置硬件流控阈值 DL_UART_setFlowControlThresholds(UART0, 128, // RX FIFO阈值(字节) 64); // TX FIFO阈值 ``` --- ### **4. 自定义配置合并** **目标**:动态调整配置参数 **方法**(参考系统配置原理): ```php // 动态修改配置示例[^1] $config['uart']['baud_rate'] = calculate_optimal_baud(); // 基于系统状态计算波特率 ModuleManager::applyConfig($config); // 应用动态配置 ``` **在CCS中的实现**: ```c // 运行时修改波特率 void update_baud_rate(uint32_t new_baud) { DL_UART_disable(UART0); uint32_t brd = SYSTEM_CLOCK / (16 * new_baud) - 1; DL_UART_setBaudRate(UART0, brd); DL_UART_enable(UART0); } ``` --- ### **5. 错误检测与恢复** **高级配置项**: ```c .timeout = 1s; // 操作超时时间[^4] .window = 5; // 错误检测窗口 .threshold = 3; // 错误阈值 ``` **实现方案**: ```c // 错误状态监控 if(DL_UART_getStatus(UART0) & DL_UART_MAIN_STATUS_OE) { // 溢出错误处理 DL_UART_clearStatus(UART0, DL_UART_MAIN_STATUS_OE); } // 自动重连机制 if(++error_count > ERROR_THRESHOLD) { reconfigure_uart(); // 重新初始化串口 } ``` --- ### **6. 多模块配置协调** **配置合并策略**(参考系统配置流程): 1. 模块级配置:`Module::getConfig()`返回配置数组[^1] 2. 全局合并:`ConfigListener`处理`EVENT_MERGE_CONFIG`事件[^1] 3. 服务管理:最终配置传递给`ServiceManager`[^1] **在CCS中的实践**: ```c // 模块配置示例(在自定义模块中) const UART_Config uart_config = { .baud_rate = 115200, .flow_control = ENABLED }; // 配置合并点(在main.c中) void merge_configurations(void) { apply_module_config(&uart_config); // 应用模块配置 apply_global_config(&sys_config); // 应用全局配置 } ``` --- ### **验证与调试** 1. **逻辑分析仪**:使用CCS内置工具验证时序 2. **状态监控**: ```c // 实时读取状态寄存器 uint32_t status = DL_UART_getStatus(UART0); printf("STATUS: 0x%08X\n", status); ``` 3. **压力测试**: ```c // 发送10万字节测试数据 for(int i=0; i<100000; i++) { while(!DL_UART_Main_isTransmitDataEmpty(UART0)); DL_UART_Main_transmitData(UART0, i & 0xFF); } ``` --- ### **总结** 高级配置核心要素: 1. **中断/DMA**:提升实时性和效率 2. **动态配置**:支持运行时参数调整[^1] 3. **错误恢复**:阈值检测+自动恢复[^4] 4. **配置合并**:协调多模块参数[^1] > **最佳实践**:结合SysConfig生成基础代码后,手动添加高级特性代码,并通过`#ifdef ADVANCED_CONFIG`控制编译条件[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值