- 博客(102)
- 收藏
- 关注
原创 Linux驱动开发——字符设备驱动开发
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。Linux应用程序向下调用驱动程序流程如下:在Linux中,一切皆是文件,驱动加载成功之后,会在dev目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx”(xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。
2024-07-28 14:05:57
1280
原创 《第一行代码 第3版》学习笔记——第十一章 网络技术
Compose没有WebView控件,使用传统的WebView控件,创建一个WebViewClient对象,用于展示百度首页。loadUrl函数加载百度首页数据。javaScriptEnabled用于加载JavaScript样式由于baidu有自定义scheme,所以这里做了特殊处理。
2024-06-24 20:49:31
693
原创 Android上编译和使用curl
Android系统编译的时候默认是没有带curl工具的,但是在aosp源码中,却是有curl的源码包含。所以只需要编译curl,然后将其push到Android设备中,就可以使用curl命令了。
2024-06-24 20:49:08
553
原创 Web开发——HTML&CSS
HTML:HyperText Markup Language,超文本标记语言超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。标记语言:由标签构成的语言,HTML标签都是预定义好的。HTML代码直接在浏览器中运行,HTML标签由浏览器解析。CSS:Cascading Style Sheet,层叠样式表,用于控制页面的样式(表现)。以下就是html代码以及css样式搭配之后的显示效果。
2024-05-20 22:08:52
519
原创 设计模式——策略模式
策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式用于封装不同算法,这些算法做相同的工作,只是实现不同策略模式通过Strategy抽象类为Context类提供了一系列可供重用的算法或行为,通过继承可以析取出算法中的公共方法。策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。策略模式封装了变化,就是用来封装算法的。
2024-02-25 23:39:15
376
原创 《第一行代码 第3版》学习笔记——第六章 广播
广播概念在计算机网络中就有,在一个IP网络范围中,最大的IP地址通常是被保留作为广播地址来使用的。广播的含义就是一个广播发出,范围内的应用程序都能够收到该广播。Android中的每个应用程序都可以对自己感兴趣的广播进行注册,注册后当广播发出时,就能够收到,可能是系统广播,也可能是其他应用程序的广播。广播接收的应用中需要有类来继承BroadcastReceiver类。
2024-02-25 23:38:50
944
原创 AliOS编译三方库
CMAKE_INSTALL_PREFIX环境变量定义cmake执行make install命令时的安装路径。CMAKE_FIND_ROOT_PATH指示,编译依赖文件的根路径,可以设置成默认的。这里的TOOLCHAIN_ROOT是上面导出的环境变量,指向了编译后的ndk路径。源码解压后,存在CMakeLists.txt,可以通过cmake编译。首先将ndk拷贝到服务器中,这里准备将ndk解压到aliNDK中。执行完成之后,在out/install目录下生成相应文件。使用tar命令解压,并指定解压目录。
2024-02-16 22:53:35
1033
原创 Kotlin基础——类、对象和接口
kotlin中同样使用interface关键字来定义接口,接口的含义和Java中类似,用于定义抽象使用interface关键字定义接口。实现一个接口跟Java中不同,Kotlin中继承类和实现接口都是使用冒号。重写接口中的方法,使用override关键字,与Java中不同的是,override是必须写的,如果不写则会报错。这会避免先写出实现方法再添加抽象方法造成的意外重写。和Java一样,Kotlin中的类只能继承一个类,但可以实现多个方法。
2024-02-16 22:52:05
1399
原创 Kotlin基础——函数定义及调用
扩展函数看起来像是String的成员函数,但是实际上并不是,他只是一个将String作为第一个参数传入的函数,是归属于StringFunctions类的,所以假设想要继承String,并重写lastChar方法,这并不是重写,而只是在子类中定义了一个lastChar方法而已。Kotlin中可变参数可以这样添加,而Java中不可以,因为Java中传入的数组是一个整体,传入数组就不能加其他参数了,而Kotlin中因为将数据进行了展开,所以还可以传其他参数。中缀调用可以用于任何只有一个参数的函数,包括扩展函数。
2024-01-07 15:20:08
1212
原创 Linux命令——用户和权限相关
与UID和GID相关的是权限的管控,每一个文件都有所属的用户和用户组用以控制文件的访问权限,当我们ls -l需要显示用户和用户组的时候,实际是会根据/etc/passwd与/etc/group的内容找到对应的UID和GID对应的名称,再完成显示。切换到新用户,这里可以看到没有前面的主机名,用户名和目录的显示,这是因为在创建用户的使用没有指定shell,默认使用的是/bin/sh,一般指定为bash。至此,添加用户成功,这里的-m是创建用户主目录,如果不加,则没有用户主目录,会进入根目录。
2024-01-07 15:19:29
942
原创 Kotlin基础——基础内容
上面属性默认的访问器都是编译器生成的,而如果要实现自己的逻辑,就需要自己自定义访问器get() {Rectangle类定义了一个属性isSquare,该属性用val修饰,只提供getter方法,而这个getter方法没有使用默认的getter,而是使用自定义的getter方法。自定义访问器就是对属性创建一个get函数或者set函数来自定义getter方法和setter方法。首先来看Java,Java中一个类文件可以包含多个类定义,但是只能有一个public定义的,且必须和类文件相同。
2023-12-11 20:50:23
1052
原创 C++基础——STL初识
STL(Standard Template Library)称为标准模板库,是C++标准库的一部分。诞生背景:大多数情况下,数据结构和算法未能有一套标准,导致被迫从事大量重复工作,STL就是为了建立数据接口跟和算法的一套标准而创建的。STL广义上可以分为:容器(container)、算法(algorithm)和迭代器(iterator)容器和算法通过迭代器进行连接STL中几乎所有的代码都采用模板类或者模板函数实现//自定义数据类型public:mAge = age;
2023-12-11 20:49:57
1006
原创 C++基础——文件操作
程序最基本的操作之一就是文件操作,程序运行时的数据都是临时数据,当程序结束后就不复存在了。通常都是通过文件或其他持久化存储方式存储程序运算完成的数据。文本文件:文本文件以ascii码存储到计算机中二进制文件:文件以二进制方式存储在计算机中,难以阅读ofstream:写操作ifstream:读操作fstream:读写操作。
2023-11-30 21:11:32
460
原创 C++基础——模板
模板是一种较为通用的模具,不能单独使用C++除了面向对象编程之外,还有一种是泛型编程,使用的就是模板C++中提供了两种模板:函数模板,类模板。
2023-11-30 21:10:55
1047
原创 C++基础——多态
多态是面向对象的三大特性之一,说的是同一个事物有不同的行为。静态多态:函数重载和运算符重载动态多态:派生类和虚函数实现静态多态和动态多态的区别:静态多态:函数地址早期绑定 - 编译阶段确定函数地址动态多态:函数地址晚期绑定 - 运行阶段确定函数地址。
2023-11-15 22:11:15
237
原创 C++基础——友元
友元就是定义类外可以访问的权限。友元可以定义一个类或者一个函数,定义成友元的类或者函数可以访问本类的所有成员,包含私有成员全局函数作为友元类做友元成员函数作为友元。
2023-11-11 11:37:36
99
原创 C++基础——运算符重载
程序员可以对C++中的+、=等运算符重新定义,以适应不同数据类型的计算。重载后的运算符不能改变原有运算符的运算规则(加号运算符不能重载为两个数相减)不能定义原本没有的运算符运算符重载语法:使用operator关键字,后接要重载的运算符,其他的都是和普通函数定义相同。
2023-11-11 11:37:13
220
原创 C++基础——对象模型和this指针
在C++中,类中的成员变量和成员函数是分开存储的只有非静态成员变量才属于类的对象上非静态成员变量会占用对象空间大小,对象的大小可以使用sizeof函数计算。一个对象的大小就是非静态成员所占内存之和。这里意外的是空类,空类占用一个字节大小。非静态成员变量属于类,不会占用对象空间大小。函数不会占用对象空间大小。
2023-11-07 23:17:26
89
原创 C++基础——函数
函数的参数可以设置默认值,在调用传参的时候如果没有传对应参数,则使用默认参数,如果传入了参数则使用会使用传入的参数覆盖默认参数。输出3 4 3需要注意的是,默认参数的设置只能是从右往左,如果某一个设置了默认参数,则只能在这个参数的右边出现默认参数,默认参数不能出现在中间,否则会引起混淆。
2023-10-23 22:49:18
160
原创 C++基础——结构体
定义一个学生的结构体//结构体定义//成员列表//姓名int age;//年龄int score;//分数}stu3;//结构体变量创建方式3//结构体变量创建方式1//struct 关键字可以省略stu1.name = "张三";cout << "姓名:" << stu1.name << " 年龄:" << stu1.age << " 分数:" << stu1.score << endl;//结构体变量创建方式2。
2023-10-17 22:03:38
258
原创 C++基础——指针
/1、指针的定义int a = 10;//定义整型变量a//指针定义语法: 数据类型 * 变量名;int * p;//指针变量赋值p = &a;//指针指向变量a的地址//打印数据a的地址//打印指针变量p//2、指针的使用//通过*操作指针变量指向的内存return 0;指针和普通变量的区别:普通变量存放的是数据,指针存放的是地址,指针变量可以通过“*”解除引用运算符获取指针变量指向的内存中存储的数据。&是取地址运算法,可以用于获取普通变量的地址赋值给指针变量。
2023-10-16 21:35:10
117
原创 C++基础——程序流程结构
if语句用于判定,如果条件满足则执行其中的代码,如果不满足则不执行。输入和输出输入和输出上面这种只支持两种判断,true走一路,false走一路输出。
2023-10-09 21:46:57
155
原创 C++基础——数据类型
在创建变量和常量的时候,都需要指定其数据类型,以便为其分配合适的内存空间。其中宏常量不需要指定类型,是因为宏定义是字符替换。
2023-10-08 23:00:58
1300
1
原创 C++基础——基础语法
C++支持单行注释和多行注释。// 注释内容单行注释直到改行末尾,可以与代码放在同一行,在代码后面注释/* 注释内容 */包含在其中的都会被注释。
2023-10-08 22:25:41
215
原创 Java基础——反射
反射提供了一种运行时获取类信息并操作的机制,增大了Java代码的灵活性,但是同时也破坏了封装特性,因为可以反射获取private类型的数据。反射主要涉及Class、Field、Constructor、Method这几个对象的使用。
2023-09-09 16:48:47
143
原创 Android源码——从Looper看ThreadLocal
ThreadLocal用于存储线程私有数据,一个ThreadLocal对象可以存储一个数据ThreadLocal实现线程私有是因为存储数据时,存储到Thread类中持有的ThreadLocalMap对象中的Entry数组中,采用哈希算法进行存储,key为ThreadLocal对象,value为T类型由于不同的线程存储到的就是不同的Thread类的ThreadLocalMap中,所以各个线程的ThreadLocalMap独立,自然存储其中的ThreadLocal就是独立的。
2023-08-23 22:42:18
1298
1
原创 Android系统启动流程(八)——Launcher启动
Launcher在SystemServer进程初始化完成之后,通过AMS的systemReady方法启动首先会找到一个可显示的设备,然后在其显示区域中显示构造一个Intent,Action为ACTION_MAIN,category为CATEGORY_HOME,然后在PMS中查询对应的Intent,然后返回一个ActivityInfo根据Intent和ActivityInfo来启动Activity,最终调用到startSpecificActivity。
2023-08-15 22:53:43
860
1
原创 Android系统启动流程(七)——SystemServer进程(基于Android13)
SystemServer是重要的进程,该进程中运行了AMS、PMS等重要的系统服务SystemServer进程由zygote fork而出SystemServer执行完加载系统服务后,进入死循环接收消息。
2023-08-13 16:14:02
413
原创 Java基础——注解
public @interface 注解名称 {public 属性类型 属性名() default 默认值;属性类型支持Java中的所有数据类型自定义注解使用注解@MyBook(name = "《Java基础1》" , authors = "Bill" , price = 123) public class Main {
2023-08-06 11:54:55
126
原创 Android系统启动流程(六)——Zygote启动流程(基于Android13)
Zygote进程是所有应用进程的孵化器,由init进程通过读取rc文件启动。init.rc中引入zygote的rc文件,当class_start main时,会加载所有class定义为main的service这里zygote的定义就是main,所以zygote进程会被启动执行app_process64或者app_process32这两个可执行文件。
2023-07-31 21:29:24
451
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人