自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 资源 (1)
  • 收藏
  • 关注

原创 在Android中实现OPUS编码

将PCM转换成OPUS编码Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。采样率16k,位深度16bit,单声道的音频数据,用自动比特率编码成OPUS格式,并加上ogg封装之后,大小只有原来的1/13,这对于移动平台来说,为传输延时带来的好处是很明显的。

2021-08-28 17:50:00 3930 1

翻译 LVGL官方文档-7.11.0-19-Overview-Tasks

LVGL内置了Task系统。可以通过注册一个函数来周期性执行它。Task是在lv_task_handler()中处理并调用的,而lv_task_handler()需要每隔几毫秒就周期性调用一次。前往Porting了解详情。Task是非抢占式的,这表示一个Task不能打断另一个Task。因此在Task中可以自由调用任何LVGL相关的函数。Create a task通过调用lv_task_create(task_cb, period_ms, LV_TASK_PRIO_OFF/LOWEST/LOW/MID/

2021-07-30 14:49:08 1190

翻译 LVGL官方文档-7.11.0-18-Overview-Animations

可以使用Animation可以在起始值和结束值之间自动改变一个变量的值。Animation通过周期性用相应值调用“animator”函数来实现。“animator”函数的原型如下:void func(void * var, lv_anim_var_t value);这个原型和大部分LVGL的set函数一致,如lv_obj_set_x(obj, value)和lv_obj_set_width(obj, value)。Create an animation要创建动画,需要初始化一个lv_anim_t

2021-07-30 10:47:28 915

翻译 LVGL官方文档-7.11.0-17-Overview-File system

LVGL有个“File System”的抽象模块,使得其支持各种类型的文件系统。File System是用一个驱动的字母来标记的。例如,如果SD卡是与字母“S”相关联,那么其上的文件路径就是“S:path/to/file.txt”。Add a driver要添加一个驱动,需要初始化一个lv_fs_drv_t类型的变量:lv_fs_drv_t drv;lv_fs_drv_init(&drv); /*Basic initialization*/drv.

2021-07-29 18:10:53 344

翻译 LVGL官方文档-7.11.0-16-Overview-Images

图像可以是一个文件,也可以是一个存储了bitmap数据本身以及其他元数据的变量。Store images可以在两个地方存储图像:内部存储器(RAM或者ROM)中的变量文件Variables存储在变量中的图像主要由有以下字段的lv_img_dsc_t结构体组成:headercf 颜色格式w 以像素为单位的宽度h 以像素为单位的高度总是0的三个比特reserved 保留字段data 指向存储图像数据的数组的指针data_size data字段的长度,单位字节这些通常以

2021-07-29 17:44:34 3233

翻译 LVGL官方文档-7.11.0-15-Overview-Fonts

在LVGL中,字体是位图和为了渲染字母的图像所需的其他信息的集合。字体存储在lv_font_t类型的变量中,可以设置于Style的text_font字段,例如:lv_style_set_text_font(&my_style, LV_STATE_DEFAULT, &lv_font_montserrat_28); /*Set a larger font*/字体有个bpp(bits per pixel)属性,它的意思是用多少位来描述字体中的一个像素。像素的值决定了像素的不透明度。这样的话

2021-07-27 17:59:08 831

翻译 LVGL官方文档-7.11.0-14-Overview-Displays

Multiple display support在LVGL中,可以存在多个Display,每个都有他们各自的Driver和Object。唯一的限制是这些Display的颜色深度要一样(由LV_COLOR_DEPTH定义)。如果Display的颜色深度不一致,图像可以在驱动的flush_cb中转换成正确的格式。可以轻松创建多个Display:只需要为每个Display初始化各自的Display Buffer并注册各自的Driver。当创建UI的时候,调用lv_disp_set_default(disp)来

2021-07-27 11:39:54 2015

翻译 LVGL官方文档-7.11.0-13-Overview-Input devices

Input Device通常意味着:指针类设备,如触摸板或者鼠标。按键板,如普通的键盘或者简单的按键板。能左转、右转、按下的编码器。能映射到屏幕指定区域的外置硬件按键。Pointers指针类设备可以有光标(如鼠标)。...lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv);LV_IMG_DECLARE(mouse_cursor_icon); /*Declar

2021-07-26 15:23:33 537

翻译 LVGL官方文档-7.11.0-12-Overview-Styles

Style用于给Object设置外观。LVGL中的Style由CSS启发,其设计理念大致如下:Style是一个lv_style_t类型的变量,其中保存属性,如边框宽度,文字颜色等。类似于CSS中的class。使用的时候不需要指定全部属性,未指定的属性为默认值。Style可以赋值给Object来改变其外观。同一个Style可以由多个Object共用。Style可以是级联的。这意味着可以将多个Style赋值给同一个Object。例如style_btn用于显示一个灰色的按钮,style_btn_red

2021-07-23 17:27:41 2254 2

翻译 LVGL官方文档-7.11.0-11-Overview-Events

当有用户可能感兴趣的事情发生的时候,会在LVGL中触发Event。例如一个Object被点击、被拖动、改变其值的时候。用户可以给一个Object设置一个回调函数来查看事件。一个实际的回调函数如下:lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);lv_obj_set_event_cb(btn, my_event_cb); /*Assign an event callback*/...static void my_event_cb(lv_o

2021-07-20 16:23:47 634

翻译 LVGL官方文档-7.11.0-10-Overview-Layer

Order of creation默认情况下,老Object绘制在背景,新Object绘制在前景。举例来说,我们创建一个名为button1的按钮,然后创建一个名为button2的按钮。那么button1及其子Object都会在背景中,并被button2及其子Object覆盖。/*Create a screen*/lv_obj_t * scr = lv_obj_create(NULL, NULL);lv_scr_load(scr); /*Load the screen*//*

2021-07-20 14:02:36 418

翻译 LVGL官方文档-7.11.0-9-Overview-Objects

在LVGL中,用户界面的基本组成元素是objects,也称为widegts,如Button, Label,Image,List,Chart和Text area。AttributesBasic attributes所有的Object都拥有一些基本属性:PositionSizeParentDrag enableClick enable等等可以通过lv_obj_set_…和lv_obj_get_…来设置或者获取这些属性:/*Set basic object attributes*/lv_

2021-07-19 17:39:04 1004

翻译 LVGL官方文档-7.11.0-8-Porting-Logging

LVGL有内置的日志模块来告诉用户LVGL库内部发生了什么。Log level将lv_conf.h中的LV_USE_LOG宏设置为1以打开日志,然后,将LV_LOG_LEVEL设置成下列值之一:LV_LOG_LEVEL_TRACE 打印大量日志,给出详细信息LV_LOG_LEVEL_INFO 打印重要的事件LV_LOG_LEVEL_WARN 发生了不该发生的时间,但是并没有引起崩溃LV_LOG_LEVEL_ERROR 只打印关键信息,系统可能会崩溃LV_LOG_LEVEL_NONE 什么也不

2021-07-17 16:32:45 305

翻译 LVGL官方文档-7.11.0-7-Porting-Operating system and interrupts

默认情况下,LVGL不是线程安全的。但是,在下列情况下,调用LVGL相关函数是安全的。在events中。在lv_tasks中。Tasks and threads如果你需要使用正常的tasks或者是线程,你需要一个mutex,在lv_task_handler之前调用,在其之后释放。同样,在其他tasks或者threads里面,也要用同样的mutex包裹住每个LVGL相关的调用。这样,就能在真正的多任务环境中使用LVGL。要确保避免并行调用LVGL函数。Interrupt尽量避免在中断中调用L

2021-07-17 16:10:40 1090 2

翻译 LVGL官方文档-7.11.0-6-Porting-Tick interface, Task handler and Sleep management

Tick interface为了处理动画和其他的task,LVGL需要系统时钟,来获取过去了多少时间。你需要周期性调用lv_tick_inc(tick_period)来通知LVGL时间间隔。例如lv_tick_inc(1)表示每个毫秒调用一次。lv_tick_inc需要在比lv_task_handler()更高优先级的地方调用(例如中断),以更加精确的指导过去了多少毫秒,及时lv_task_handler的执行要花费更多的时间。在FreeRTOS中,lv_tick_inc可以在vApplicatio

2021-07-17 11:47:45 904

翻译 LVGL官方文档-7.11.0-5-Porting-Input device interface

Types of input devices配置输入设备的时候,需要初始化一个lv_indev_drv_t类型的变量:lv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv); /*Basic initialization*/indev_drv.type =... /*See below.*/indev_drv.read_cb =... /*See below.*//*

2021-07-16 18:11:02 591

翻译 LVGL官方文档-7.11.0-4-Porting-Display interface

为了配置一个display,一个lv_disp_buf_t类型的变量和一个lv_disp_drv_t类型的变量必须要初始化。lv_disp_buf_t 包含内部的图像bufferlv_disp_drv_t 包含与display交互的回调函数,并进行绘图相关的操作Display bufferlv_disp_buf_t可以像这样初始化:/*A static or global variable to store the buffers*/static lv_disp_buf_t disp_buf

2021-07-16 11:58:45 1645

翻译 LVGL官方文档-7.11.0-3-Porting-Set-up a project

Get the libraryLVGL图形库可从GitHub获取:https://github.com/lvgl/lvgl。可以从GitHub克隆或者下载最新版本的库。图形库是lvgl目录,这个目录需要复制到你的工程。Configuration fileLVGL有个配置的头文件,名称是lv_conf.h。这个头文件设置了库的基本行为,关闭不需要的模块,调整编译时的内存buffer等。复制lvgl目录下的lv_conf_template.h并重命名为lv_conf.h。打开文件,将文件开头的宏定义

2021-07-14 17:56:47 358

翻译 LVGL官方文档-7.11.0-2-Porting-System overview

System overviewApplication 创建GUI,处理任务的应用LVGL 图形库。应用可以与图形库进行交互,以创建GUI。其包含一个HAL接口来注册显示和输入设备驱动Driver 出了包含一般的驱动,还包括驱动显示(可能包含GPU),读触摸板和按键的函数的功能。MCU有两种硬件配置。一种是包含内置的LCD/TFT驱动,另一种是没有这个。在两种情况下,都需要frame buffer来存储屏幕的当前显示图像。包含TFT/LCD驱动的MCU。在这种情况下,你就可以直接通过RGB接口来

2021-07-14 17:31:52 177

翻译 LVGL官方文档-7.11.0-1-Get started-Quick overview

在这里,你将学习到关于LVGL最重要的东西。你应该首先阅读这部分,以得到一个总体的影响,然后再阅读详细的Porting和Overview部分。使用模拟器强烈建议从使用模拟器入手,而不是直接移植LVGL到嵌入式设备。LVGL支持众多IDE,你可以从中选择你喜欢的。你可以前往模拟器那一章节,使用已经编写好的工程运行在PC上,这样你就可以暂时跳过移植这一步,直接体验LVGL。将LVGL添加到项目请按以下步骤,在拥有显示和触摸功能的嵌入式系统中设置LVGL。从github中下载或者克隆LVGL:git

2021-07-14 16:22:35 803

原创 recovery代码分析(六)

前面分析了move命令的实现,这里在简单的分析一下diff命令:static int PerformCommandDiff(CommandParameters &params) { // <offset> <length> if (params.cpos + 1 >= params.tokens.size()) { LOG(ERROR) << "missing patch offset or length for " &lt

2020-06-01 17:27:01 599

原创 recovery代码分析(五)

前文提到过,在ota升级中,recovery会新启一个进程来执行update-binary执行实际的升级动作。而update-binary会执行update-script脚本。update-script脚本会调用block_image_update来进行安装。这里注意一下block_image_update调用时传入的参数:...

2020-06-01 16:45:54 1382 1

原创 recovery代码分析(四)

上一篇文章提到了,升级的实际动作是执行了升级包里的update-script。而这个update-script是由ota_from_target_files这个脚本生成的。ota_from_target_files这个脚本里面的WriteFullOTAPackage和WriteBlockIncrementalOTAPackage这两个函数分别生成全量包和增量包。下面就分析一下WriteBlockIncrementalOTAPackage这个函数。WriteBlockIncrementalOTAPackag

2020-05-27 15:39:23 836

原创 recovery代码分析(三)

前文分析了recovery的主要流程,在recovery的实际安装阶段,会创建一个新的进程,执行ota包里面的update-binary。recovery进程和update-binary进程通过管道进行通信。update-binary大致是从/bootable/recovery/updater编译出来的。下面分析一下update-binary的main函数。main()函数int main(int argc, char **argv) { // Timothy:前三行跟日志打印有关,初始化了日

2020-05-21 17:04:02 374

原创 recovery代码分析(二)

really_install_package()函数really_install_package()函数位于install.cpp。static int really_install_package(const std::string &path, bool *wipe_cache, bool needs_mount, std::vector<std::string> *log_buffer, int retry_c

2020-05-21 10:29:10 454

原创 recovery代码分析(一)

以下分析代码基于mtk 8167a的sdk,android版本是8.0.1。代码的分析直接看以Timothy开头的注释。main函数main()函数的位置是recovery.cpp。int main(int argc, char **argv) { // Timothy:初始化日志。因为recovery里面没有logcat,所以会将关键信息打印在屏幕上,日志写到文件里。 // We don't have logcat yet under recovery; so we'll print er

2020-05-20 17:45:57 899

原创 修改Recovery中的文字提示(二)

上一篇博文提到,如果把转换格式后的图片替换掉原来的图片,你会发现,显示的竟然是繁体中文。这到底是发生了什么?分析在上篇博文里面提到,在res_create_localized_alpha_surface()函数中,匹配到本地化信息之后,会打印日志。printf(" %20s: %s (%d x %d @ %d)\n", name, loc, w, h, y);那么,我们修改一下打印日志的位置,把匹配的过程都打印出来:int res_create_localized_alpha_surface

2020-05-20 10:37:50 735

原创 修改Recovery中的文字提示(一)

需求默认的升级界面如上图所示,我们要修改的是中间的“正在安装系统更新”这一文字提示。实现分析在Recovery中,这一段文字并不是文本,而是从图片资源文件中截取的。资源文件在bootable\recovery目录下的各种res-hdpi/res-mdpi……文件夹中。打开installing_text.png文件,可以看出这个文件是包含了各种语言的文字提示。在Recovery中,将根据传进来的本地化信息,从这个图片中截取正确的行,进行显示。那么,Recovery具体是怎么解析的呢?看下面的代码:

2020-05-19 17:44:15 1310 2

原创 Android8.0中实现APP禁用模式(三)

上篇文章最后留了一个问题:就是如果禁用app的时刻,被禁用的APP是打开的或者是最近应用视图正在显示,该怎么处理?我的解决方案是模拟一个HOME键的事件。这样,就能退出的状态,回到主页,同时给出提示,告知用户APP已被禁用。这里就有两个问题了:1、如何模拟HOME按键。2、如何判断哪个APP在前台。模拟按键我们知道,用adb可以模拟按键,那么,我们就从input命令的实现入手。input的...

2019-03-19 12:14:46 1203

原创 Android8.0中实现APP禁用模式(二)

上一篇文章说了,打开一个APP的方式有三种:1、从启动器点击图标启动;2、点击APP弹出的通知启动;3、点击多任务键,选择APP。现在就来实现在多任务菜单中实现APP的禁用。入口Framework中对各种按键的处理都是在PhoneWIndowManager中,这里会通过几个intercept函数,对Home、Back、媒体按键等进行拦截,不让这几个按键的键值传递给APP。我们在PhoneWin...

2019-03-16 17:49:33 1275

原创 Android8.0中实现APP禁用模式(一)

需求产品经理要求在Android平板中实现一个应用的禁用模式。当一个已安装的应用被设置为禁用的时候,在启动器中,APP图标灰色,且APP不能启动。需求分析打开一个APP的方式有三种:1、从启动器点击图标启动;2、点击APP弹出的通知启动;3、点击多任务键,选择APP。这三种启动方式中,第一个很容易实现禁用,只需要修改launcher就行,在图标的点击事件处理中增加一点逻辑即可。这里就分析一下...

2019-03-16 11:24:38 6105 2

原创 Binder连接池

概述有下面这样一种应用场景:一个Android应用有10个功能模块,供主应用通过aidl调用。按照aidl的标准使用方法,就是创建10个aidl接口并写10个类实现他们,然后创建10个服务,在这10个服务的onBind里面返回接口的实现。那么问题来了,有必要为每个模块都创建一个服务吗?如果有100个模块呢?也要这么创建100个服务吗?答案是否定的,解决这样一个场景的方法就是Binder连接池。

2017-01-09 17:27:33 552

原创 一点感想

事情是这样的。 前天晚上九点多,老婆突然来了一条微信,问我能不能做一个年会抽奖的小程序,明天晚上就要。我一想,抽奖嘛,不就是个随机数的问题嘛,简单。头脑一热,就满口应承下来。然后,等坐下来准备写的时候,才发现其实需求还是蛮复杂的。

2017-01-08 02:52:12 475

原创 在Android Studio中实现AIDL远程服务调用

最近在看《Android开发艺术探索》这本书,看到IPC这部分的时候,对照者书上所说,对有疑问的地方做了一些实验,因为IDE最近更新为了Android Studio,Android更新为了7.1,发现很多地方和以前不一样了,网上找到的参考代码很多还是老的,所以这里整理一下,记在下面。结构我要实现的是一个典型的C/S结构。客户端APP要实现一个加法的功能,通过AIDL调用远端服务APP,然后返回结果。

2016-12-22 16:07:07 2391

原创 《Android框架揭秘》读书笔记——JNI

形式 const jbyte* GetStringUTFChars(JNIEnv* env, jstring string, jboolean* usCopy) 说明 将Java字符串对象转换成UTF-8字符串(C字符串),并返回指针 参数 isCopy:当String对象中的祖父穿被转换成UTF-8字符串,被复制到内存,且指针被返回时,*isCopy设置为JNI_TRUE,否则设

2016-03-17 11:59:32 2967

原创 Android启动过程分析——init.c(二)

Part 4// ================================================== // Part 4union selinux_callback cb;cb.func_log = klog_write;selinux_set_callback(SELINUX_CB_LOG, cb);cb.func_audit = audit_callback;sel

2016-02-26 18:12:16 1446

原创 Android启动过程分析——init.c(一)

《Android框架揭秘》这本书是基于Android2.2源码的,但是手头上只有Android4.4的源码。这两个版本的启动过程基本一致,但是在具体的编码上,还是有一些区别的,下面,对照着这本书,分析一下4.4的init进程。

2016-02-26 16:08:15 2424

原创 Effective Java读书笔记(九)

同步访问共享的可变数据// Broken! - How long would you expect this program to run?public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedEx

2016-02-25 11:53:09 377

转载 聊聊并发-Java中的Copy-On-Write容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。

2016-02-23 15:33:42 328

原创 Effective Java读书笔记(八)

将局部变量的作用域最小化要使局部变量的作用于最小化,最有力的方法就是在第一次使用它的地方声明。几乎每个局部变量的声明都应该包含一个初始化表达式。for-each循环由于传统的for循环连接和使用类库如果需要精确的答案,请避免使用float和double使用BigDecimal或者int、long代替。基本类型由于装箱基本类型如果其他类型更适合,则尽量避免使用字符串当心字符串连接的性能通过接口引用对象

2016-02-19 15:57:07 374

RecoveryLocalizer.apk

recovery_l10n编译出来的apk,用于生成多语言环境下的问题提示图片资源。方便没有aosp环境的朋友生成install_text等资源文件。

2020-05-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除