- 博客(91)
- 收藏
- 关注
原创 【Android】Android 13系统源码修改与调试
本文介绍如何使用ASFP导入Android系统源码,如何使用ASFP断点调试Activity,如何修改Launcher App实现去掉谷歌搜索框,如何修改Setings App实现显示自定义设备名称
2024-07-26 22:46:50
832
原创 【Android】SharedPreferences阻塞问题深度分析
Android中SharedPreferences已经广为诟病,它虽然是Android SDK中自带的数据存储API,但是因为存在设计上的缺陷,在处理大量数据时很容易导致UI线程阻塞或者ANR,Android官方最终在Jetpack库中提供了DataStore解决方案,用来替代SharedPreferences
2024-04-27 17:43:34
947
1
原创 【Android】重温Activity生命周期
Android中用得最多的组件是Activity,而它的生命周期也是最基础的知识,从刚接触Android到工作中会频繁依赖这部分知识。可能大多数人能说出页面新建到页面关闭会走的生命周期,但是还有其它使用场景不多的生命周期鲜为人知,但是作用很大。。
2024-04-16 18:00:32
1225
原创 【Android】美团组件化路由框架WMRouter源码解析
Android无论App开发还是SDK开发,都绕不开组件化,组件化要解决的最大的问题就是组件之间的通信,即路由框架。国内使用最多的两个路由框架一个是阿里的ARouter,另一个是美团的WMRouter。这两个路由框架功能都很强大,笔者都有使用过。从源码上来看,WMRouter的架构更加清晰,可读性更强。从扩展性来讲,WMRouter更灵活,且具备很强大的无侵入式扩展性。
2024-03-24 09:30:25
692
原创 【Android】为什么在子线程中更新UI不会抛出异常
众所周知,Android App在子线程中是不允许更新UI的,否则会抛出异常详细异常信息见下图。笔者偶然发现在子线程中也是可以更新UI的,这是什么情况呢?
2024-01-17 00:43:07
933
原创 【Kotlin】协程的字节码原理
协程是Koltin语言最重要的特性之一,也是最难理解的特性。网上关于kotlin协程的描述也是五花八门,有人说它是轻量级线程,有人说它是无阻塞式挂起,有人说它是一个异步框架等等,众说纷芸。
2024-01-15 21:30:15
730
2
原创 【Android】Ubuntu20.04编译Android 13并用模拟器运行
一直好奇Android系统是怎么定制的,直到亲自走一遍Android系统编译流程才发现并没想象的复杂。这就跟app开发一样,Google官方其实都提供了平台、文档、IDE及一些工具,咱们只要按照官方提供的指南来操作就行了。如果Android没有提供这样一个开放的系统、完善的生态,咱们就不可能开发出各种 app以及各种定制的Android系统。
2023-07-22 20:09:15
7806
8
原创 【Unity3d】Unity3d在Android平台上输入框的实现源码分析
Unity3d引擎中有很多与Android原生交互的功能,比如如何调用Android渲染、Unity输入框的实现、Unity权限的申请、Unity调用相机功能等等,其实这些就是调用Android的api实现的。所有Java层的实现代码都是在`unity-classes.jar`这个jar包中。这篇文章主要梳理一下Unity输入框的实现以及如何对输入框进行改造,顺带带出一些其它重要知识点。
2023-05-07 16:34:19
2039
1
原创 【Unity3d】Unity与Android之间通信
在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信,这里把它们之间通信做一个整理。
2023-02-18 20:36:04
2958
1
原创 【Unity3d】Unity与iOS之间通信
在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信,这里把它们之间通信做一个整理。
2023-02-18 13:22:00
3378
原创 【Kotlin】by lazy关键字的实现原理
kotlin的by lazy关键字是很常用的,它表示延时初始化变量,只在第一次使用时才给它初始化。那么它是如何实现这种功能的呢?这篇文章从字节码和Java语言的角度揭密它的实现原理。
2022-11-12 00:21:43
2083
原创 【Kotlin】从字节码角度理解kotlin构造函数、成员变量、init代码块执行顺序
kotlin的构造函数、init代码块、成员变量初始化三者执行顺序是怎样的? 这篇文档从节字码的角度去理解它们的逻辑。
2022-10-31 18:25:30
1144
原创 【Android】字节码插桩技术实现卡顿监控
字节码插桩早已不是什么新鲜的技术了,但时至今日仍然在广泛应用。它能鬼使神差一般改变我们的代码,实现一些功能让我们看不见摸不着。像Arouter、Hilt、Tinker、Matrix这些框架都在使用这项技术。插桩是字节码编程的一个应用,这里主要是使用字节码编程技术。字节码编程能解决很多问题,比如自动生成class,自动修改字节码,自动添加日志代码,自动插入代码实现卡顿监控。笔者通过字节码插桩技术实现自动统计方法耗时,实现UI卡顿监控,通过这个案例了解字节码插桩的全过程。
2022-10-29 18:51:51
2198
原创 【Android】深入理解Android View的绘制流程
- View是如何被渲染到屏幕中的?- ViewRoot、DecorView、Activity、Window、WindowManager是什么关系?- View和Surface是什么关系?- View和SurfaceFlinger、OpenGL ES是什么关系?
2022-10-24 23:03:54
1899
原创 【Android】Android ANR产生过程与分析方法
Android ANR问题一直是比较难解决的问题,一来它比较难以复现,二来复现后也不太好分析。这篇文件梳理一下ANR问题产生的过程以及出现ANR问题拿到日志文件如何进行定位原因。其实关于ANR线上监控也是比较棘手的,看了这篇文章我们再去看一些ANR端上监控方案(比如微信Matrix)也许思路更多清晰。
2022-10-02 17:44:30
3758
原创 【Android】EventBus 3.x使用APT提升性能
EventBus 3.0除了支持注解,还有一个鲜为人知的功能,那就是使用APT来搜集SubscriberMethod。这是一个可选的功能,需要额外添加支持。使用APT可以在项目编译期间搜集所有的SubscriberMethod,默认是在运行期间通过反射去搜索subscriber,这样势必存在性能损耗。
2022-09-26 13:28:17
1104
原创 【Android】Android Binder进程间通信AIDL示例与源码分析
众所周知,Android进程间通信采用的是Binder机制。Binder是Android系统独有的进程间通信方式,它是采用mmp函数将进程的用户空间与内核空间的一块内存区域进行映射,免去了一次数据拷贝,相比Linux上的传统IPC具有高效、安全的优点。本文结合AIDL与bindService函数,在Android体系的应用层和Framework层,对Binder通信进行深入剖析,以加深对Binder的了解。
2022-09-24 19:48:55
1464
原创 【Android】Google AutoService的使用与源码解析
AutoService是Google开发一个自动生成SPI资源文件的框架。看过一些基于APT的三方框架源码的读者应该有所了解。比如Arouter、EventBus等等。一般我们用它来自动帮我们注册APT文件(全称是Annotation Process Tool,或者叫注解处理器,AbstractProcessor的实现)。很多生成SPI文件的框架也是抄袭它的源码,可见它的作用还不小。
2022-09-13 19:33:56
7130
原创 【Cocos2dx】Cocos Creator Android平台打包效率优化
初次接触Cocos Creator小游戏开发,发现构建Android平台的工程后,进行打包,编译效率很慢,基本需要10~20分钟的时间不等,电脑也轰隆隆的响,cpu和内存处于满负载工作。打包过程存在的卡点主要是cocos2dx基础库的编译过程慢,它需要使用ndk全量编译c++代码。...............
2022-06-11 18:36:58
3705
1
原创 【Android】Android Drawable与Bitmap互转
Drawable转成Bitmap方法一:创建空Bitmap并用canvas绘制private Bitmap drawableToBitamp(Drawable drawable){ //声明将要创建的bitmap Bitmap bitmap = null; //获取图片宽度 int width = drawable.getIntrinsicWidth(); //获取图片高度 int height = drawable.getIntrinsicHe
2022-05-16 00:31:35
11713
原创 【Koltlin】深入剖析Kotlin 扩展函数和扩展属性
在kotlin中经常看到这样的if语句://s是一个String类型的对象if(s.isNullOrEmpty()){//执行空对象或空字符串的逻辑}笔者不禁想问,如果s是空对象,调用它的函数不会抛出空指针吗?它是如何检查被调用的对象s是空对象的呢?查阅资料后,发现原来这是kotlin的扩展函数的特性:在扩展函数内, 可以通过 this 来判断接收者是否为 NULL,这样,即使接收者为 NULL,也可以调用扩展函数。例如:fun Any?.toString(): String {
2022-01-11 17:45:33
2586
原创 【Kotlin】Kotlin构造函数、成员变量、init代码块执行顺序
在Kotlin中经常看到主构造函数、成员变量、init代码块(也叫初始化器),它们的执行时机和顺序是什么样的呢?看一下官方的示例:class InitOrderDemo(name: String) { val firstProperty = "First property: $name".also(::println) init { println("First initializer block that prints ${name}") }
2021-12-17 11:24:16
6075
原创 【Android】TextView的省略号问题
开发中,发现一个TextView的省略号问题(如下图):在列表展示订单信息时,终点地址需要在该行显示不下时进行省略号处理。但是有的终点地址TextView显示字数很少就打省略号,有的2个字就开始打省略号,有的三个字开始打省略号,导致后面留下很多空白。这个应该算是TextView的bug吧。经过若干尝试,问题都没有完全解决。尝试过更换和修改布局,都无济于事。也尝试过在adapter中根据文本长度动态设置宽度(setWidth),这样能优化一下,但是不能完美解决问题。后来偶然间尝试在adapter中动态调
2021-12-14 21:19:22
3449
原创 【Java】JVM运行时数据区域与内存回收机制
前言JVM(Java Virtual Machine)是Java、Kotlin、Groovy等程序运行的虚拟机,它是Java技术系统里最重要的组成部分之一。熟悉JVM的运行过程、运行时数据区以及内存回收机制,对我们认识Java语言,解决内存泄漏、内存溢出等问题非常有帮助。文章目录前言一、Java技术体系二、Java运行时数据区域(1) 程序计数器(2) Java虚拟机栈(3) 本地方法栈(4) Java堆(5) 方法区(6) 运行时常量池三、JVM内存回收机制(1) 如何判定内存是否需要回收(2) 引用
2021-11-25 21:31:36
2099
原创 【Android】AppCompatTextView的使用详解
AppCompatTextView作用是根据字数自动调整字号大小,防止字数太多时文字被截断或者省略号的出现。而传统的TextView无法自动调整文字大小,超出会截断或者显示省略号。比如有一个TextView,它的宽度最大是100dp,而它的文字长度不确定,一般是由服务端下发。这个时候产品需求是不管多少都要显示完全,文字多时自动变小,文字少时自动变大,不允许截断或者出现省略号。
2021-11-11 20:16:48
6926
原创 【Kotlin】Kotlin的高阶函数与Lambda表达式
前言Kotlin的高阶函数与Lambda表达式是Kotlin的特色,使用频率非常高。熟悉它的用法与本质对于简化代码、提升开发效率非常有帮助,也易于阅读kotlin的框架源码。这两个概念并不是一个东西,但是又有非常紧密的关联。这篇文章带你弄懂什么是高阶函数,以及Lambda表达式的本质和使用。一、什么是高阶函数高阶函数就是将函数用作参数或返回值的函数。函数类型Kotlin 使用类似 (Int) -> String 的一系列函数类型来处理函数的声明,例如onClick: val onClick
2021-10-24 17:13:29
5056
原创 【Android】实现微信小游戏关闭后再次打开接着玩,无需重新加载
现在市面上很多app上都有小游戏(或叫h5游戏),它们借助小游戏来提高整个app的粘性。像微信app、趣头条app、哈啰app上已经出现了小游戏模块。微信小游戏是如何做到,关闭activity后,再次打开,不需要重新加载呢
2021-06-07 21:17:47
2758
2
转载 【Java】Java中实现单例(Singleton)模式的八种方式
单例模式定义单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。基本的实现思路单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。单例的实现主要是通过以下两个步骤:将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一
2020-07-28 19:23:01
1176
原创 【Unity3d】开发Unity Package 实现自动配置Android Studio工程
众所周知,unity3d工程可以导出android studio、xcode等平台工程,还需要手动添加一些代码或者修改一些参数后再打包才能满足我们的业务需要。
2020-07-22 19:30:03
2302
原创 【Unity3d】C#使用XmlDocument读写xml冒号节点问题
发现在使用C#的XmlDocument读写XML文件时,读写带冒号的节点时,冒号前的内容给忽略了。举个例子,以下是AndroidManifest.xml文件的部分内容:<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses
2020-07-22 16:15:46
1752
1
原创 【Android】Android 6.0以下无法显示生僻字问题
工作中进行app兼容性测试,发现android 6.0以下的设备使用facebook账号登录app,当fb的用户名包含生僻字:比如"????",app显示用户名时,android native渲染这个字变成了空格,而unity3d渲染这个字变成了另外一个奇怪的字。Android 6.0或以上的设备可以正常渲染。
2020-07-15 14:32:11
1142
原创 【Andriod】组件化架构之实现组件可插拔
上一篇文章讲解了如何在云端配置项目的依赖:【Android】自定义Gradle Plugin实现云端配置项目依赖这篇文章讲解,当在云端修改了项目的依赖(dependencies{…})代码,比如删除或者新增了SDK组件,如何保证项目正常编译运行不受影响,即实现组件可插拔。例如,应用依赖了library1、library2、library3、…这些library都是可选的,即可以全都要,可以全不要或者只要其中一部分。现在在云端选择了应用需要依赖哪些library,达到不需要重新修改应用代码,即可感知到功
2020-06-24 16:47:12
738
原创 【Android】自定义Gradle插件——实现云端配置项目依赖
这篇文章讲解如何自定义一个Gradle插件,实现功能是将项目的sdk依赖dependencies{...}配置部分交给插件,将插件上传到maven仓库,通过云端来配置项目的依赖。
2020-06-18 16:52:25
2676
1
原创 【Android】将aar及其依赖aar上传至maven私有仓库
在上一篇文章里,已经介绍了如果搭建maven私有仓库以及各种仓库的用途。上传aar到maven私有仓库,有两种方式,一种是直接使用nexus3提供的上传功能,将aar上传到仓库。另一种是使用gradle脚本上传。使用nexus3上传aar先登录到nexus,点击Upload,选择一个仓库,如上图。点击Browse会弹出选择文件窗口,选择要上传的aar后,填写其它信息。Extension是文件拓展名。主要是填写Group ID、Artifact ID、Version。这三个参数是maven对组
2020-06-17 11:55:03
8991
2
原创 Maven uploadArchives命令报错:Could not deploy to remote repository | Failed to deploy artifacts/metadata
Android Studio使用gradle上传aar到maven仓库uploadArchives { repositories { mavenDeployer { repository(url: NEXUS_REPOSITORY_URL) { authentication(userName: getRepositoryUserName(), password: getRepositoryPassword())
2020-06-15 14:17:37
3810
原创 【Android】使用nexus3搭建公司内部的maven私有仓库
为什么要搭建maven私有仓库?当公司的项目发展到一定阶段,人员发展到一定规模,项目必定要经历组件化改造。项目组件化之后,每个人只负责特定的模块。那么各个模块之间如何依赖呢?有两种方法,一种是工程里直接源码依赖,就是这种:implementation project(":libraryXXX")这种方式有二个弊端:1、编译的时候,会同时编译所有的library,每改一个小地方,就要全部编译一次,消耗时间长,开发效能低下。2、所有人都可以看到并可以修改别人负责的library,有时候谁改了自己代
2020-06-11 14:41:32
3954
1
原创 【Android】chrome xxx is 32-bit instead of 64-bit
在云测时发现一台机型上出现如下报错日志:43525 05-08 02:07:34.571 30879 E CrashReport Caused by: java.lang.RuntimeException: Cannot load WebView43526 05-08 02:07:34.571 30879 E CrashReport at com.android.webview.chromium.WebViewChromiumFactoryProvider.I(WebViewChromiumFactor
2020-05-09 18:49:54
1368
3
原创 【flutter】Expanded组件
Expanded组件是flutter中使用率很高的一个组件,它可以动态调整child组件沿主轴的尺寸,比如填充剩余空间,比如设置尺寸比例。它常常和Row或Column组合起来使用。关于Row和Column组件的介绍可以参阅我的另一篇文章:flutter Row和Column组件构造函数const Expanded({Key key,int flex: 1,@required Widge...
2020-05-02 17:11:38
18746
原创 【flutter】Row和Column组件
Row和Column是flutter中最基础的容器组件,Row用来水平放置子组件,Column用来垂直放置子组件。它们都可以设置子组件的对齐方式。重点需要了解它们有哪些对齐方式,以及如何对齐的。布局特点Row在水平方向会尽可能大,大到会撑满parent;在垂直方向会尽可能小,小到能包裹住children。children在水平默认居左,垂直方向上默认居中。Column在垂直方向上会尽可能大,...
2020-05-02 12:17:32
4475
4
原创 【flutter】Stack组件
Stack是一个容器类组件,它可以放入多个子组件,子组件按先后顺序堆叠。它类似于安卓中的帧布局FrameLayout。构造函数 Stack( {Key key, AlignmentGeometry alignment: AlignmentDirectional.topStart, TextDirection textDirection, StackFit fit: StackF...
2020-05-01 18:20:55
2017
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人