- 博客(284)
- 资源 (46)
- 问答 (3)
- 收藏
- 关注

原创 Ubuntu18 编译 AOSP 步骤
什么是AOSPAOSP是"Android Open Source Project"的缩写,即"Android开放源代码项目",由谷歌发起,此项目致力于Android的维护和更进一步的发展。编译前准备系统信息本次编译在Ubuntu系统上进行,系统版本如下:yubo@work-105:~$ cat /etc/issueUbuntu 18.04.2 LTS \n \l由于AOSP源码巨大,请确保磁盘空间至少还有200GB,另外内存和CPU配置尽量高,网络环境尽可能好,否则编译前下载源码就需要好久。
2021-06-04 10:45:34
13309
10
原创 使用AIDEGen进行AOSP开发
AIDEGen,大概是“Android IDE (helper) Generator”的简写,是 AOSP 源代码树中的一个工具,它允许从 Android Studio 等通常仅为非平台应用程序开发配置的 IDE 中处理系统应用程序。AIDEGen 旨在自动化项目设置过程,以便开发人员在流行的 IDE 环境中处理 Java 项目。开发者不再需要手动配置一个 IntelliJ 项目,比如所有的项目依赖。
2023-04-18 23:14:55
3060
3
原创 在Ubuntu中快速安装Android Studio的方法
在Ubuntu中安装Android Studio,你可以直接在https://developer.android.com/studio网站上下载Ubuntu对应的安装包来安装,也可以使用下面的方法在终端中快速完成Android Studio的安装,具体方法如下
2023-04-13 22:26:40
2419
原创 Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified
最近在写代码时碰到如下错误:java.lang.IllegalArgumentException: com.example.imdemo: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.Strongly consider using FLAG_IMMUTABLE, only use FLA
2022-04-25 20:08:10
44007
12
原创 搭建私有Jfrog artifactory仓库并上传Android Library
前言最近在负责公司内部的Android IM SDK开发,由于需要提供SDK给其他部门的项目使用,故打算将写好的IM SDK上传到Jfrog artifactory仓库,下面记录Jfrog的安装以及上传Android Library到该仓库的步骤。安装Jfrog关于Jfrog是个啥,这里不做过多的记录,可以理解为它是一个类似maven或jcenter的仓库,可以在其中存放各种类型的文件,是一个强大的通用包管理平台,国内可以直接通过这个地址访问:https://www.jfrogchina.com/查看
2022-04-23 19:57:14
10173
原创 使用React Native源码编译Android项目
前言公司的项目用到了React Native,最近通过后台监控到一些崩溃问题,主要出在React Native Java侧的源码中,由于不太好改这个问题,于是希望通过修改React Native源码达到规避Crash的问题,下面记录编译React Native源码的过程。准备工作...
2022-04-02 10:57:13
11539
11
原创 Flutter手势密码插件从开发到发布至pub仓库
前言本篇记录的是使用Flutter完成手势密码的功能,大致效果如下图所示:该手势密码的功能比较简单,下面会详细记录实现的过程,另外还会简单说明如何将该手势密码作为插件发布到pub仓库。开始实现上面的手势密码并不难,大致可以拆分成如下几部分来完成:绘制9个圆点绘制手指滑动的线路合并以上两个部分绘制圆点我们使用面向对象的方式来处理9个圆点的绘制,每个圆点作为一个GesturePoint类,这个类要提供一个圆心坐标和半径才能画出圆形来,这里先放上这个类的源码:// point
2021-08-16 11:19:53
6577
原创 java.lang.RuntimeException: Cannot create an instance of class com.xxx.xxxViewModel
今天在Android项目中使用Hilt做依赖注入,结合Jetpack的ViewModel一起使用,报错如下:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.quickandroid/com.example.quickandroid.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.xx
2021-07-21 10:52:38
11583
1
原创 Android项目管理依赖方式总结
随着Android项目越来约大,管理项目中依赖的三方库成了一个非常重要的部分,若管理不当,不同module中可能会依赖同一个库的不同版本,这将导致非常严重的问题,要么是代码冲突,要么是APK包体积增大,亦或是项目构建的时间变长,拖慢开发效率。使用好的方式管理Android项目的依赖库显得尤其重要,本文记录了当下几种不同的管理Android依赖的方法,希望跟大家一起学习进步!原始方式这种管理依赖的方式是我们以前用得最多的,即直接将依赖的库写在module的build.gradle文件中,如下代码所示:.
2021-07-19 16:17:15
9131
1
原创 Android Jetpack Startup库分析
简介App Startup 库提供了一种在应用程序启动时初始化组件的简单、高效的方法。库开发人员和应用程序开发人员都可以使用 App Startup 来简化启动顺序并明确设置初始化顺序。App Startup 允许您定义共享单个内容提供者的组件初始值设定项,而不是为您需要初始化的每个组件定义单独的内容提供程序。这可以显着缩短应用程序启动时间。使用方法单个Initializer通过下面的配置在项目中引入Startup库:dependencies { implementation("andr
2021-07-14 19:51:32
5908
1
原创 Android AOP编程(五)——Gradle插件+TransformAPI+字节码插桩实战
开篇在前面几篇博文中,我记录了Android AOP编程的一些基础知识,包括Gradle插件的开发、TransformAPI的使用,以及一些操作字节码的工具如AspectJ,Javassist和ASM:Android AOP编程(一)——AspectJ基础知识Android AOP编程(二)——AspectJ语法&实战Android AOP编程(三)——Javassist基础Android Gradle插件开发基础Android Transform API的使用Android AOP
2021-07-13 15:12:48
8420
原创 Android AOP编程(四)——ASM基础
前言在前面几篇博文中我记录了Android AOP编程使用的一些库,主要是AspectJ和Javassist:Android AOP编程(一)——AspectJ基础知识Android AOP编程(二)——AspectJ语法&实战Android AOP编程(三)——Javassist基础AspectJ和Javassist都能直接操作Class文件,本篇记录的是ASM,也是一个可以操作Java字节码的库,它的使用可能更复杂一些,本篇只做最基本的使用方法记录。什么是ASMAS
2021-07-09 11:05:25
10504
3
原创 Android Transform API的使用
TransformAPI是什么从 1.5.0-beta1 开始,Gradle 插件包含一个 Transform API,允许 3rd 方插件在将编译的类文件转换为 dex 文件之前对其进行操作。(API 在 1.4.0-beta2 中存在,但在 1.5.0-beta1 中已完全修改)此 API 的目标是简化注入自定义类操作而无需处理任务,并为操作的内容提供更大的灵活性。内部代码处理(jacoco、progard、multi-dex)在 1.5.0-beta1 中已经全部转移到这个新机制。注意:这仅适
2021-07-08 11:06:46
10991
原创 Android Gradle插件开发基础
什么是Gradle在Gradle官方文档上是这么描述的:Gradle 是一种开源构建自动化工具,其设计足够灵活,几乎可以构建任何类型的软件。Gradle 允许您构建任何软件,因为它对您尝试构建的内容或应该如何完成几乎没有做出任何假设。最显着的限制是依赖管理目前只支持 Maven 和 Ivy 兼容的存储库和文件系统。Gradle 将其构建建模为任务(工作单元)的有向无环图 (DAG)。这意味着构建本质上是配置一组任务并将它们连接在一起——基于它们的依赖——以创建该 DAG。创建任务图后,Gradle
2021-07-07 15:41:57
11559
原创 Android AOP编程(三)——Javassist基础
什么是Javassist这是Javassist官方网站上的说明:Javassist(Java 编程助手)使 Java 字节码操作变得简单。它是Java中用于编辑字节码的类库;它使 Java 程序能够在运行时定义一个新类,并在 JVM 加载类文件时修改它。与其他类似的字节码编辑器不同,Javassist 提供了两个级别的 API:源代码级和字节码级。如果用户使用源级 API,他们可以在不了解 Java 字节码规范的情况下编辑类文件。整个 API 仅使用 Java 语言的词汇表设计。您甚至可以以源文本的形式
2021-07-06 15:28:05
6703
原创 Android AOP编程(二)——AspectJ语法&实战
在上一篇Android AOP编程(一)——AspectJ基础知识中我记录了在Android中使用AspectJ实现AOP编程的一些基础知识,但是AspectJ的使用其实最主要的是针对切面的语法,找切面并不难,难的是如何编写匹配这个切面的规则,本篇主要记录的就是AspectJ的语法,以及使用一个实例来解释AspectJ的应用。AspectJ语法整理以下关于AspectJ的语法整理全部出自网络收集,并未一一验证,若有错误请指出。execution使用execution(<匹配表达式>).
2021-07-06 12:17:07
7027
1
原创 Android AOP编程(一)——AspectJ基础知识
什么是AOP以下是维基百科上对AOP的介绍:面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计、剖面导向程序设计)是计算机科学中的一种程序设计思想,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。通过在现有代码基础上增加额外的通知(Advice)机制,能够对被声明为“切点(Pointcut)”的代码块进行统一管理与装饰,如“对所有方法名以‘set*’开头的方法添加后台日志”。该思想使得开发人员能够将与代码核心业务逻辑关系不那
2021-07-05 15:18:28
6992
原创 深入理解Java注解(三)——编译时注解实战
在前面两篇博客中我记录了Java注解的一些知识点,以及如何使用JavaPoet生成Java源码,本篇主要记录的是使用Java编译时注解完成一个类似于ButterKnife的Android View注入功能,通过注解即可完成View的ID绑定,不再显式调用findViewById方法。如果对Java注解还不太熟悉,可以参考我前面两篇博文:深入理解Java注解(一)——注解基础 | 深入理解Java注解(二)——JavaPoet使用开始本篇博客的代码还是基于深入理解Java注解(一)——注解基础 这.
2021-07-01 10:42:52
6886
原创 深入理解Java注解(二)——JavaPoet使用
什么是JavaPoetJavaPoet是使用Java编写的一个库,主要用于生成Java源代码,其GitHub地址为:https://github.com/square/javapoet之所以本篇会记录JavaPoet,主要是因为很多开源库都使用到了Java编译时注解,而处理注解时基本都用到了JavaPoet去生成新的Java代码,要想了解编译时注解的流程,必须先了解前置知识JavaPoet。JavaPoet的使用从JavaPoet的GitHub主页可以看到这个库的代码并不多,所有的类都位于com.s
2021-06-30 14:13:30
7543
1
原创 深入理解Java注解(一)——注解基础
一直以来对Java注解的理解都不是特别深刻,但是在多年的软件开发生涯中接触了不少注解相关的东西,所以有必要深入理解一下Java注解知识,通过本篇博客记录学习Java注解的一些知识点。什么是Java注解举个例子,在Java开发中,我们会使用@Override标记一个被子类复写的方法,使用@Deprecated标记一个方法或者一个类表示方法或类已被弃用,不再推荐使用。这里的@Override @Deprecated就是Java注解,查看@Override源码如下:package java.lang;.
2021-06-29 10:59:37
6187
原创 Android Jetpack Compose学习(三)—— 各种控件的用法
前言Jetpack Compose主要是用来写Android UI的,Android UI无外乎文本、图片、列表等各种控件的展示,这里我用的“控件”一词不确定是否准确,因为传统的Android UI确实是一个个控件,而在Jetpack Compose中,类似Text Image Column Row等其实是用Kotlin写的一个函数,这个函数会渲染出对应的文本、图片、列表等。今天记录的主要是这些“控件”的使用方法。Text使用Text可以显示一行文本,下面的代码展示了Text的一些用法:@Previ
2021-06-08 14:22:44
7453
2
原创 Android Jetpack Compose学习(二)—— Jetpack compose基础布局
在没有推出Jetpack Compose时我们开发Android UI一般使用的布局都是LinearLayout, FrameLayout, RelativeLayout, ConstraintLayout等,在Jetpack Compose推出后,开发布局的方式有了很大的改变。Jetpack Compose标准布局组件在许多情况下,我们只需要使用Column和Row即可完成布局,Column可将多个项目垂直放置在屏幕上,Row则可以将多个项目纵向放置在屏幕上,下面举例说明:Columnimpo.
2021-06-02 14:11:02
6574
5
原创 Android Jetpack Compose学习(一)—— Jetpack compose入门
Jetpack compose简介Jetpack compose是Google推出的用于构建原生Android UI的一个工具包,它使用了大量的Kotlin语言特性,其开发方式与Flutter很类似,可以在很大程度上简化Android UI的开发。目前(2021年5月31日)Jetpack compose的版本为Beta版,还未发布1.0正式版。需要注意的是:只能使用Kotlin语言来做基于Jetpack compose的开发Jetpack compose起步目前(2021年5月31日),要在An
2021-05-31 14:59:09
4222
6
原创 在M1芯片的Macbook pro上高效开发Android的正确姿势
前言2020年11月,苹果发布了M1芯片以及搭载M1芯片的Mackbook pro,由于我的老笔记本还是17款的8G内存的Macbook pro,已无法满足高效工作的需求,而M1芯片在各个自媒体的评测中都取得了非常惊人的性能成就,于是我将自己的旧笔记本通过Apple官方回收卖掉,置换了一台16G的搭载了M1芯片的Macbook pro,本以为工作效率会大大提升,没想到悲剧才开始。各种坑与解决方案由于M1芯片基于arm64架构,跟intel的x86不同,虽然苹果提供了Rosetta帮助用户在M1芯片上运
2021-05-14 10:46:44
14649
原创 golang操作sqlite数据库
go-sqlite3开源库地址:https://github.com/mattn/go-sqlite3使用方法代码如下:package mainimport ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3")const ( dbDriverName = "sqlite3" dbName ...
2020-02-10 15:29:51
11155
原创 golang实现的文件服务器
最近在学习golang,使用golang实现了一个最简单的文件服务器,程序只有简单的十多行代码,可以编译成windows, linux, mac多平台可执行文件。源码package mainimport ( "fmt" "net/http" "os" "path/filepath")func main() { p, _ := filepath.Abs(filepath....
2019-06-06 15:09:26
11846
1
原创 Ubuntu安装mysql没有提示设置密码的问题
今天在Ubuntu上安装MySql,使用了如下命令:sudo apt install mysql-server安装过程中竟然没有提示输入root账户的密码,查阅资料后,将修改root密码的过程记录如下:进入/etc/mysql目录,查看debian.cnf文件cd /etc/mysqlsudo cat debian.cnf该文件中记录了用户名密码:使用上面文件中的user和pa...
2019-06-06 14:49:40
6017
2
原创 使用Nginx搭建文件服务器
第一步: 安装Nginx:sudo apt-get install nginx第二步: 修改Nginx的配置文件在/etc/nginx/conf.d目录下,创建新的配置文件default.conf,粘贴如下内容:server { listen 80; server_name 127.0.0.1; #charset koi8-r; ...
2019-05-13 16:52:05
5446
原创 Check failed: vm. Must be able to initialize the VM.错误解决方法
今天在已有的Android工程中接入Flutter,启动Activity加载Flutter View时出现“Check failed: vm. Must be able to initialize the VM.”错误,一番搜索之后将解决该错误的方法记录如下:该错误的原因是Android打包的apk中确实flutter_assets文件夹及内容,确实原因暂时不详。假设当前有一个projec...
2019-05-10 11:49:38
5101
5
原创 Mac上MySQL忘记密码解决方法
今天在Mac上使用MySQL时,输入mysql -uroot -p后输入密码,发现登录不了MySQL服务器,应该是密码忘记了,查找资料后把修改MySQL的密码过程记录如下:关闭MySQL服务在Mac的系统偏好设置中,进入MySQL管理面板,然后选择“Stop MySQL Server”选项停掉服务。打开终端依次执行如下命令:# 第一步,进入mysql的bin目录cd /...
2019-05-09 12:01:30
14480
4
原创 Ubuntu上使用npm命令全局安装的包所在的路径
Ubuntu上使用npm命令全局安装的包所在的路径:/usr/local/lib/node_modules
2019-05-09 09:12:57
10161
原创 Ubuntu配置Nginx负载均衡
Ubuntu配置Nginx负载均衡假设现在有3台机器:A:192.168.1.100B:192.168.1.101C:192.168.1.102假设现在B,C机器上已部署了Web服务器,访问192.168.1.101:9999和192.168.1.102:9999均可以获得服务器返回的数据。现在使用A机器作为负载均衡器,将对A机器的请求分流到B或C机器上,需要如下操作:给A机...
2019-05-08 11:34:17
3470
原创 "Couldn't connect to Docker daemon at http+docker://"错误解决
今天在服务器上安装docker并执行docker-compose up -d命令时,报错如下:ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?If it's at a non-standard location, specify the URL with ...
2019-05-06 16:18:38
12186
4
原创 golang学习笔记6——并发
goroutinegolang里面没有线程的概念,取而代之的是一种叫做goroutine的东西,它是由golang的运行时去调度的,可以完成并发操作。使用goroutine很简单,直接使用go关键字就行,如下面的代码:package mainimport ( "fmt")func test() { fmt.Println("call test...")}func main...
2019-04-29 16:40:21
3085
原创 golang学习笔记5——接口
接口的声明golang中的接口声明方式如下:type 接口名 interface { 方法名(参数) 返回值}例子:// Writer接口type Writer interface { // Write方法,参数为一个字符串 Write(s string)}// Stringer接口type Stringer interface { // String方法,参数为空,...
2019-04-27 12:35:51
2896
原创 golang学习笔记4——结构体
结构体格式golang中的结构体格式如下:type 结构体名称 struct { 字段名 字段类型 字段名 字段类型}下面定义一个结构体Point,有坐标x, y两个整型字段:type Point struct { x int y int}同种类型的字段可以写在一行,如下代码:type Color struct { r, g, b byte}结构体的初始化结构...
2019-04-26 15:45:46
3162
原创 golang学习笔记3——函数
函数函数的形式func 函数名称(函数参数 参数类型) 返回值 {}例如:package mainimport "fmt"// 一个简单的add函数,传入两个整数,返回两个数的和// 参数类型都是int,所以合并写参数类型func add(a, b int) int { return a + b}// 参数类型不一致,分开写参数类型func SayHello(a...
2019-04-26 10:40:01
2861
原创 golang学习笔记2——容器和流程控制
golang容器golang中的容器主要有这几类:数组切片MapList下面分别记录相关用法。数组数组的定义与初始化数组的定义与初始化,用下面的代码来说明:// 数组定义与初始化的第一种方式var arr [2]intarr[0] = 1arr[1] = 20// 输出 [1 20]fmt.Println(arr)// 数组定义与初始化的第二种方式var n...
2019-04-25 16:06:20
2838
原创 golang学习笔记1——基础知识
golang变量的声明声明变量有两种方式:使用var声明变量// 声明一个整型数据var a int// 声明一个字符串var s string// 声明一个浮点数组var c [2]float32// 声明一个函数var d func(int) bool// 声明一个结构体var e struct { x int}使用:=声明变量并赋值例如:age :...
2019-04-25 11:32:15
2952
原创 在Ubuntu上搭建基于Nginx、uWSGI的Flask应用
在Ubuntu上搭建基于Nginx、uWSGI的Flask应用安装virtualenv如果还没有安装pip,可以使用如下方式安装pip:sudo apt-get install python-pip安装完pip后,使用pip安装virtualenv:sudo pip install virtualenvvirtualenv是python的一个虚拟环境,可以很方便的隔离不同的pyth...
2019-04-24 12:02:58
2864
Android自定义日历控件源码
2014-12-12
Android RecyclerView使用Demo代码
2016-09-13
iOS开发UITabBarController和UICollectionView的使用Demo
2016-04-11
Android前置摄像头预览并检测人脸,获取人脸区域亮度
2015-12-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人