- 博客(168)
- 资源 (8)
- 收藏
- 关注
原创 Failed to find configured root that contains 安装apk报错
Failed to find configured root that contains问题修复,修改root-path
2022-12-27 18:10:25 988 1
原创 git 报错 .git/hooks/: No such file or directory
.git下没有hooks文件夹时,执行git init
2022-07-19 20:17:51 3671
原创 Android 插件化实践
文章目录1 动态加载apk2 Hook AMS3 动态代理startActivity()4 Hook ActivityThread#Handler5 动态代理 handleMessage()1 动态加载apkActivity初始化时,使用DexPathLoader动态加载apk@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceS
2021-03-12 20:22:36 351
原创 Android 从进程角度看Service启动流程
本文基于Android api 26主要从进程角度记录启动Service的流程文章目录1 第一次跨进程调用:ContextImpl ---> AMS1.1 AMS中的startService()1.2 ActivityThread启动新进程2 第二次跨进程调用:ActivityThread ---> AMS2.1 AMS中的attachApplication()3 第三次跨进程调用: AMS ---> ApplicationThread3.1 ActiveServices中的realS
2021-03-11 20:06:22 485
原创 Android框架 DiskLruCache源码分析
缓存的文件结构1 初始化1 DiskLruCache的创建 DiskLruCache.open(cacheDir, 1, 1, 1024 * 1024 * 10);通过静态方法open()来创建DiskLruCache对象public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) throws IOException { //
2021-03-11 20:05:58 422
原创 Android框架 EventBus源码分析
文章目录1 两个Map1 subscriptionsByEventType2 typesBySubscriber2 订阅过程1 封装并获取SubscriberMethod集合2 添加到订阅者集合中3 总结:3 发送事件过程1 发送事件调用栈2 事件执行的线程1 两个Map首先理解两个HashMap对象的用途。1 subscriptionsByEventType表示同一个事件被多少个订阅者订阅用途:1 通过事件类型,找到所有的订阅者,然后将此事件发送给所有的订阅者。 private final
2021-03-11 20:05:25 337
原创 Android 使用OpenGL添加滤镜
Render回调方法记录初始化日志CommonRender: onSurfaceCreatedCommonRender: onSurfaceChangedCommonRender: onDrawFrameCommonRender: onDrawFrame渲染时日志,三个回调方法不断循环CommonRender: onFrameAvailableCommonRender: onDr...
2021-03-11 20:04:28 956
原创 Android 应用启动流程
本文中的native层源码为1.6版本文章目录1 Zygote简介2 由app_process运行ZygoteInit class2.1 创建AppRuntime对象2.2 调用AppRuntime对象2.3 创建Dalvik虚拟机2.4 运行ZygoteInit类3 Zygote类的功能3.1 绑定/dev/socket/zygote套接字3.2 加载应用程序Framework中类与平台资源3.3 运行SystemServer3.4 运行新Android应用程序1 Zygote简介虚拟机启动耗时
2021-02-02 17:15:47 582
原创 Kotlin实战(四) Kotlin的类型系统
文章目录1 可空性1.1 可空类型1.2 类型的含义1.3 安全调用运算符: “?.”1.4 Elvis运算符: “?:”1.5 安全转换: “as?”1.6 非空断言:“!!”1.7 “let”函数1.8 延迟初始化的属性1.9 可空类型的拓展1.10 类型参数的可空性1.11 可空性和java2 基本数据类型和其他基本类型2.1 基本数据类型:Int,Boolean及其他2.2 可空的基本数据类型:Int?,Boolean?及其他2.3 数字转换2.4 “Any”和“Any?”:根类型2.5 Uint类
2020-09-02 16:28:51 733
原创 Kotlin实战(三) 类,对象和接口
文章目录1 定义类继承结构1.1 Kotlin中的接口1.2 open, final和abstract修饰符1.3 可见性修饰符:默认为public1.4 内部类与嵌套类:默认是嵌套类1.5 密封类:定义受限的类继承结构2 声明一个带默认构造方法或属性的类2.1 初始化类:主构造方法和初始化语句块2.2 构造方法:用不同的方式来初始化父类2.3 实现在接口中声明的属性2.4 通过getter或setter访问支持字段2.5 修改访问器的可见性3 编译器生成的方法:数据类型和类委托3.1 通用对象方法3.2
2020-09-02 16:00:15 402
原创 Kotlin实战(二) 函数的定义与调用
1 在kotlin中创建集合2 让函数更好调用2.1 命名参数2.2 默认参数值2.3 顶层函数和属性3 扩展函数和属性3.1 导入和扩展函数3.2 从java中调用扩展函数3.3 作为扩展函数的工具函数3.4 不可重写的扩展函数3.5 扩展属性4 可变参数,中缀调用和库的支持4.1 扩展java集合的api4.2 可变参数4.3 键值对的处理5 字符串和正则表达式的处理5.1 分割字符串5.2 正则表达式和三重引导的字符串5.3 多行三种引导的字符串6 局部函数和扩展
2020-09-02 15:59:31 906
原创 Kotlin实战(一) 基础
文章目录1 函数和变量1.1 hello world1.2 函数1.3 变量1.4 字符串模板2 类和属性2.1 属性2.2 自定义访问器2.3 目录和包3 枚举和when3.1 声明枚举类3.2 使用“when”处理枚举类3.3 在“when”结果中使用任意对象3.4 使用不带参数的“when”3.5 和并类型检查和转换3.6 用"when"代替"if"3.7 代码块作为"if"和"when"的分支3 while和for循环4 kotlin中的异常1 函数和变量1.1 hello worldfun
2020-09-02 15:58:22 834
原创 Android 使用AIDL实现进程间通讯
文章目录1 启动远端service进程1.1 首先创建ServiceConnection对象2.2 绑定Service3.3 在service中创建并返回Binder2 IBookManager结构2.1 整体结构2.2 完整IBookManager类2.3 IBookManager中的抽象函数2.4 IBookManager中的内部抽象类Stub2.4.1 Stub类结构2.4.2 Stub的标识2.4.3 asInterface()方法2.4.52.5 Stub中的静态内部类Proxy1 启动远端se
2020-07-12 23:08:24 367
原创 C++基础(五) 多态
文章目录1 多态示例2 虚析构函数3 多态的原理3.1 虚函数表和vptr指针3.2 证明vptr指针的存在3.3 vptr指针的初始化时机3.4 父类指针和子类指针的步长4 纯虚函数和抽象类1 多态示例#include <iostream>using namespace std;class Hero{public: //1 多态的必要条件1:要有virtual修饰的虚函数 virtual int getAd() { cout <&l
2020-05-15 14:22:58 209
原创 C++基础(四) 继承和派生
文章目录1 类和类之间的关系2 继承的访问方式1 类和类之间的关系#include <iostream>using namespace std;class A{public: void funcA() { cout << "funcA()" << endl; }};// 1 包含关系 B has Aclass B{public: void funcB() { a.funcA
2020-05-14 13:48:54 366
原创 C++基础(三) 类和对象
1 类和对象#include <iostream>using namespace std;//定义一个类struct Hero{public: int sex; char name[64];};class AdHero{public: int sex; char name[64]; void printHero() { cout << "性别: " << sex <&l
2020-05-12 18:47:36 406
原创 C++基础(二) C++对C语言的拓展
文章目录1 引用1.1引用的基本概念1.2 引用作为函数参数2 内联函数3 默认参数和占位参数4 函数重载1 引用1.1引用的基本概念#include <stdio.h>#include "iostream"using namespace std;int main(){ int a = 10; int *p = &a; *p = 20;...
2020-05-09 14:11:45 786
原创 C++基础(一) C++对C语言的增强
文章目录1 Hello World2 命名空间 namespace2.1 命名空间的使用1 直接用std::cout 方式2 使用using namesapce std 方式3 使用std::cout2.2 自定义命名空间(1) 定义一个命名空间(2) 命名空间嵌套3 C++语言的增强(1) 实用性增强1 对于变量定义的位置可以随用随定义2 对全局变量的检测能力加强3 使用struct时 不需要再...
2020-04-09 21:01:55 849
原创 Linux基础(六) 系统IO函数
使用file命令看文件格式文章目录1 打开文件2 创建文件3 文件权限的计算方式4 判断文件已经存在5 将文件截断为0root@iZ2ze9ftqv2b7zbety6qd8Z:~/learn_makeFile# file appapp: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, in...
2020-01-28 23:53:57 648
原创 Linux基础(五) makefile
makefile的规则规则的三要素文章目录1 一个简单的makefile示例2 根据.o来编译3 提取makefile中的变量4 makefile中的函数5 删除.o6 命令执行失败时继续向下执行本文主要介绍makefile的编写。1 一个简单的makefile示例创建一个makefile文件,并添加如下内容app:main.c add.c sub.c mul.c gcc main.c...
2020-01-28 23:53:32 246
原创 Linux基础(四) gcc
1 gcc的编译过程从sum.c到生成可执行程序的过程首先定义一个sum.c文件#include <stdio.h>#include "head.h"#define DEBUGint main(void){ int a = NUM1; int aa; int b = NUM2; int sum = a + ...
2020-01-26 23:34:20 1116
原创 Linux基础(三) Vim
1 vim 命令模式vim是vi发展过来的工作模式:1 命令模式2 编辑模式3 末行模式H:前J:上K:下L:后0:行首$:行尾gg:文件开始位置文件末尾:G100G:跳转到100行1.1 删除x:删除光标后面的X:删除光标前面的u:撤销d0:删除光标前面的内容d$:删除光标后面的内容D:删除光标后面的内容dd:删除并复制当前行dw:删除单词d4:...
2020-01-26 23:33:40 181
原创 Linux基础(二) ftp nfs ssh scp
1 ftp1.1 ftp服务器搭建1 首先安装ftp服务器apt-get install vsftpd2 可以查看到有vsftpd的配置文件root@iZ2ze9ftqv2b7zbety6qd8Z:/etc# ls -l vsftpd.conf打开配置文件,并修改如下几项允许匿名登录anonymous_enable=YES实名用户拥有写权限(这一行是被注释的,打开注释)w...
2020-01-26 23:32:41 497
原创 Linux基础(一) Linux命令
a 日期yeliangdeMacBook-Pro:~ yeliang$ date2020年 1月21日 星期二 22时38分51秒 CSTb bash的含义b:伯恩 a:aganin sh:shellc shell命令被终端识别的命令4 命令解析器根据命令的名字,调用可执行的程序shell —> unix操作系统bash —> Linux操作系统1 Linux下...
2020-01-26 23:32:22 465
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人