libaroma GUI 使用规范
在使用 libaroma framework 遇到很多使用问题,造成后期改动,其实就是使用没遵循规范造成死机,显示异常。各种莫名奇妙的问题。这里就列举几个使用规范。
字体 字号和大小问题
前期定义的有宏,大家有的直接使用宏 对应的数字,其实这里使用宏的原因,一是方便阅读,二是因为字体和宏是一一对应关系,后期加字体可能调整,但是宏不会变,这里主要涉及字体查找问题,查找不到就去字号对应id小的字体找,有一个优先级。
|
|
其中 LIBAROMA_TEXT_TYPE_ALL
是全量字体,像那些内容不确定的label,就要使用全量,比如通知音乐,蓝牙搜索。
业务内存申请和释放的时机a2dp_source_handle
这里有个明显的使用错误,就是timer的创建在click 的回调里面创建,删除是在一个条件语句里面删除,所以这里就潜在一个风险就是timer无法删除,造成内存泄露,典型的做法就是在生命周期里面创建和删除(一一 对应的生命周期)。在click回调或者timer回调里面只是更改timer状态。下面给个例子。
|
|
下面还有内存是申请和释放时机,这要看业务对这片内存使用周期,如果是全局 就用全局静态
这种大多是状态变量,如果和context生命周期相同,建议在on_create 和 on_destroy生命周期里面申请和释放。这样在这个业务周期里面都能 使用。
野指针问题
这种问题主要暴露在自定义控件内存释放,和context 中控件的全局静态引用问题,一般会碰见下面 的log,出现这种问题一般有两种典型问题。
12345678 assert failed: ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0, file: ..\..\..\..\..\kernel\rtos\FreeRTOS\Source\portable\MemMang\heap_4.c, line: 341In Hard Fault HandlerSCB->HFSR = 0x40000000Forced Hard FaultSCB->CFSR = 0x01000000Usage fault: Unaligned access
- malloc 一个struct struct里面有指针,在释放struct使用需要释放里面的指针对应的动态分配的内存。
- 全局状态引用没有在生命周期里面没有重置,造成状态错乱的问题。
- 自定义控件里面动态更新一个指针,或者释放一个指针的内存没强制置空,造成double free 一个指针内存。
对于第一种使用calloc 代替 malloc,第二种要养成释放内存强制置空的习惯,第三种应尽量避免使用全局指针 引用。代码上已经设计出方法来规避。
|
|
自定义控件的数据使用规则
自定义控件可以被重复利用的,一个界面上可以放几个,所以一定 不能访问全局变量,比如控件使用的字符和串都要复制一份到内部,复制的数据都要在control生命周期 释放。
|
|
关于control 是否要耦合context 和 control 状态恢复 思考
android 中每个view的构造函数都传入一个context,这里耦合的最大原因其实就是为了调用资源API进行,加载资源。 另外 其实还有一点,就是内存不够的时候window相关的内存回收,所以 这里就回收 了view里面的收据,后台的时候回收,但是context没被回收,context是业务的最小单元,所以view相关的私有数据都会保存在context里面,在作libaroma gui framework设计的时候,就遇到一个内存问题,当时做法就是在resume 重建window,但是这样没法保证被覆盖回来只后view的状态,所以这里借助全局变量,全局指针,导致control free后 指针为野指针,导致业务逻辑错乱。
- 关于control是否要耦合context,其实这里是要的,这样可以在econtext切换到后台,释放大块内存比如图片,切换回来从新load进来,所以依赖context
- 关于是否要进行状态保存,这要扩展control生命周期。context和control都要扩展。
- 关于全局引用,其实可以借助二级指针规避,但是所有控件和业务都要改一把。
####### android