@[toc]
前言
现在一直在弄蓝牙的项目,已经有一年时间没有弄Android的东西了。现在有时间想把以前弄的东西整理一下,方便自己以后需要用时翻出来看看。
这个APP是以前在MT6735平台Android 5.1(L1)调试验证UART外设发送过来的数据是否正确,想着也许后面调试还用的着,就记录一下。
硬件平台相关配置
APP需要操作平台设备硬件时,需要了解以下几点信息(我这里是在MTK平台上,其它Android平台也类似):
需要操作的UART是否有权限?系统默认其它APP没有读写权限,这里需要添加权限,以下有2种方式:
// 方式一:使用adb直接给UART设备添加权限
$ adb shell
$ chmod 0666 /dev/ttyMT*
// 方式二:在init.rc文件里面添加权限,每次开机它都自动添加权限。和方式一相比就不用每次手动添加权限;
chmod 0666 /dev/ttyMT*
chown system system /dev/ttyMT*
MTK平台UART硬件物理端口名称和软件字符设备名称对应关系:
硬件物理端口名称
软件字符设备名称
UART1
/dev/ttyMT0
UART2
/dev/ttyMT1
UART3
/dev/ttyMT2
UART4
/dev/ttyMT3
如何关闭SELinux权限? 在Android 5.0以上添加了这个权限,字符设备有read/write权限APP也不能直接访问字符设备。这里有3种处理方式:
设备是ENG版本(有root权限),可以使用adb将SELinux关闭。
adb shell setenforce 0
将APP操作UART需要的权限添加到SELinux。(这里暂不介绍)
在Kernel LOG / Main Log 中查询关键字 "avc:" 看看是否有SELinux Policy Exception。
代码中关闭selinux机制。
文件路径:bootable/bootloader/lk/platform/mt6735/rules.mk
文件中对应的内容:
// choose one of following value -> 1: disabled/ 2: permissive /3: enforcing
把SELINUX_STATUS := 3修改为SELINUX_STATUS := 1
APP主要实现的功能
功能很简单,主要是将UART外设发送的数据实时的在APP上面显示出来。
APP层代码分析
APP层代码主要是2个class:MainActivity和UartJniTool
MainActivity是主界面窗口类,主要处理步骤如下:
uartJniTool = new UartJniTool(mhandler);实例化UartJniTool类,并且将mhandler传递给UartJniTool对象保存起来,方便后面更新UI。(Android规定只有主线程才能更新UI)
定义一个readUartBtn,被点击后uartJniTool.uartToolStart();开始获取uart data,再次被点击停止获取数据并且关闭uart。
定义一个writeUartBtn,发送固定的一段字符串,验证APP是否可以正常的发送数据。
定义的mhandler主要是将接收到消息的数据,显示在TextView上;
public class MainActivity extends AppCompatActivity {
private static final String TAG= "MainActivity";
private static final int UARTDATA= 8001;
UartJniTool uartJniTool;
ToggleButton readUartBtn;
Button writeUartBtn;
TextView uartText;
private int offset;
@Override
protected void onCreate(Bu