![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 82
devnn
Stay Foolish!Stay Hungry!Read The Funking Source Code!
展开
-
【Android】Android 13系统源码修改与调试
本文介绍如何使用ASFP导入Android系统源码,如何使用ASFP断点调试Activity,如何修改Launcher App实现去掉谷歌搜索框,如何修改Setings App实现显示自定义设备名称原创 2024-07-26 22:46:50 · 876 阅读 · 0 评论 -
【Android】SharedPreferences阻塞问题深度分析
Android中SharedPreferences已经广为诟病,它虽然是Android SDK中自带的数据存储API,但是因为存在设计上的缺陷,在处理大量数据时很容易导致UI线程阻塞或者ANR,Android官方最终在Jetpack库中提供了DataStore解决方案,用来替代SharedPreferences原创 2024-04-27 17:43:34 · 958 阅读 · 1 评论 -
【Android】重温Activity生命周期
Android中用得最多的组件是Activity,而它的生命周期也是最基础的知识,从刚接触Android到工作中会频繁依赖这部分知识。可能大多数人能说出页面新建到页面关闭会走的生命周期,但是还有其它使用场景不多的生命周期鲜为人知,但是作用很大。。原创 2024-04-16 18:00:32 · 1225 阅读 · 0 评论 -
【Android】美团组件化路由框架WMRouter源码解析
Android无论App开发还是SDK开发,都绕不开组件化,组件化要解决的最大的问题就是组件之间的通信,即路由框架。国内使用最多的两个路由框架一个是阿里的ARouter,另一个是美团的WMRouter。这两个路由框架功能都很强大,笔者都有使用过。从源码上来看,WMRouter的架构更加清晰,可读性更强。从扩展性来讲,WMRouter更灵活,且具备很强大的无侵入式扩展性。原创 2024-03-24 09:30:25 · 703 阅读 · 0 评论 -
【Android】为什么在子线程中更新UI不会抛出异常
众所周知,Android App在子线程中是不允许更新UI的,否则会抛出异常详细异常信息见下图。笔者偶然发现在子线程中也是可以更新UI的,这是什么情况呢?原创 2024-01-17 00:43:07 · 952 阅读 · 0 评论 -
【Kotlin】协程的字节码原理
协程是Koltin语言最重要的特性之一,也是最难理解的特性。网上关于kotlin协程的描述也是五花八门,有人说它是轻量级线程,有人说它是无阻塞式挂起,有人说它是一个异步框架等等,众说纷芸。原创 2024-01-15 21:30:15 · 734 阅读 · 2 评论 -
【Android】Ubuntu20.04编译Android 13并用模拟器运行
一直好奇Android系统是怎么定制的,直到亲自走一遍Android系统编译流程才发现并没想象的复杂。这就跟app开发一样,Google官方其实都提供了平台、文档、IDE及一些工具,咱们只要按照官方提供的指南来操作就行了。如果Android没有提供这样一个开放的系统、完善的生态,咱们就不可能开发出各种 app以及各种定制的Android系统。原创 2023-07-22 20:09:15 · 7922 阅读 · 9 评论 -
【Unity3d】Unity3d在Android平台上输入框的实现源码分析
Unity3d引擎中有很多与Android原生交互的功能,比如如何调用Android渲染、Unity输入框的实现、Unity权限的申请、Unity调用相机功能等等,其实这些就是调用Android的api实现的。所有Java层的实现代码都是在`unity-classes.jar`这个jar包中。这篇文章主要梳理一下Unity输入框的实现以及如何对输入框进行改造,顺带带出一些其它重要知识点。原创 2023-05-07 16:34:19 · 2067 阅读 · 1 评论 -
【Unity3d】Unity与Android之间通信
在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信,这里把它们之间通信做一个整理。原创 2023-02-18 20:36:04 · 2981 阅读 · 1 评论 -
【Kotlin】by lazy关键字的实现原理
kotlin的by lazy关键字是很常用的,它表示延时初始化变量,只在第一次使用时才给它初始化。那么它是如何实现这种功能的呢?这篇文章从字节码和Java语言的角度揭密它的实现原理。原创 2022-11-12 00:21:43 · 2109 阅读 · 0 评论 -
【Kotlin】从字节码角度理解kotlin构造函数、成员变量、init代码块执行顺序
kotlin的构造函数、init代码块、成员变量初始化三者执行顺序是怎样的? 这篇文档从节字码的角度去理解它们的逻辑。原创 2022-10-31 18:25:30 · 1147 阅读 · 0 评论 -
【Android】字节码插桩技术实现卡顿监控
字节码插桩早已不是什么新鲜的技术了,但时至今日仍然在广泛应用。它能鬼使神差一般改变我们的代码,实现一些功能让我们看不见摸不着。像Arouter、Hilt、Tinker、Matrix这些框架都在使用这项技术。插桩是字节码编程的一个应用,这里主要是使用字节码编程技术。字节码编程能解决很多问题,比如自动生成class,自动修改字节码,自动添加日志代码,自动插入代码实现卡顿监控。笔者通过字节码插桩技术实现自动统计方法耗时,实现UI卡顿监控,通过这个案例了解字节码插桩的全过程。原创 2022-10-29 18:51:51 · 2201 阅读 · 0 评论 -
【Android】深入理解Android View的绘制流程
- View是如何被渲染到屏幕中的?- ViewRoot、DecorView、Activity、Window、WindowManager是什么关系?- View和Surface是什么关系?- View和SurfaceFlinger、OpenGL ES是什么关系?原创 2022-10-24 23:03:54 · 1911 阅读 · 0 评论 -
【Android】Android ANR产生过程与分析方法
Android ANR问题一直是比较难解决的问题,一来它比较难以复现,二来复现后也不太好分析。这篇文件梳理一下ANR问题产生的过程以及出现ANR问题拿到日志文件如何进行定位原因。其实关于ANR线上监控也是比较棘手的,看了这篇文章我们再去看一些ANR端上监控方案(比如微信Matrix)也许思路更多清晰。原创 2022-10-02 17:44:30 · 3773 阅读 · 0 评论 -
【Android】EventBus 3.x使用APT提升性能
EventBus 3.0除了支持注解,还有一个鲜为人知的功能,那就是使用APT来搜集SubscriberMethod。这是一个可选的功能,需要额外添加支持。使用APT可以在项目编译期间搜集所有的SubscriberMethod,默认是在运行期间通过反射去搜索subscriber,这样势必存在性能损耗。原创 2022-09-26 13:28:17 · 1104 阅读 · 0 评论 -
【Android】Android Binder进程间通信AIDL示例与源码分析
众所周知,Android进程间通信采用的是Binder机制。Binder是Android系统独有的进程间通信方式,它是采用mmp函数将进程的用户空间与内核空间的一块内存区域进行映射,免去了一次数据拷贝,相比Linux上的传统IPC具有高效、安全的优点。本文结合AIDL与bindService函数,在Android体系的应用层和Framework层,对Binder通信进行深入剖析,以加深对Binder的了解。原创 2022-09-24 19:48:55 · 1466 阅读 · 0 评论 -
【Cocos2dx】Cocos Creator Android平台打包效率优化
初次接触Cocos Creator小游戏开发,发现构建Android平台的工程后,进行打包,编译效率很慢,基本需要10~20分钟的时间不等,电脑也轰隆隆的响,cpu和内存处于满负载工作。打包过程存在的卡点主要是cocos2dx基础库的编译过程慢,它需要使用ndk全量编译c++代码。...............原创 2022-06-11 18:36:58 · 3731 阅读 · 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 · 11719 阅读 · 0 评论 -
【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 · 6109 阅读 · 0 评论 -
【Android】TextView的省略号问题
开发中,发现一个TextView的省略号问题(如下图):在列表展示订单信息时,终点地址需要在该行显示不下时进行省略号处理。但是有的终点地址TextView显示字数很少就打省略号,有的2个字就开始打省略号,有的三个字开始打省略号,导致后面留下很多空白。这个应该算是TextView的bug吧。经过若干尝试,问题都没有完全解决。尝试过更换和修改布局,都无济于事。也尝试过在adapter中根据文本长度动态设置宽度(setWidth),这样能优化一下,但是不能完美解决问题。后来偶然间尝试在adapter中动态调原创 2021-12-14 21:19:22 · 3452 阅读 · 0 评论 -
【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 · 2100 阅读 · 0 评论 -
【Android】AppCompatTextView的使用详解
AppCompatTextView作用是根据字数自动调整字号大小,防止字数太多时文字被截断或者省略号的出现。而传统的TextView无法自动调整文字大小,超出会截断或者显示省略号。比如有一个TextView,它的宽度最大是100dp,而它的文字长度不确定,一般是由服务端下发。这个时候产品需求是不管多少都要显示完全,文字多时自动变小,文字少时自动变大,不允许截断或者出现省略号。原创 2021-11-11 20:16:48 · 6953 阅读 · 0 评论 -
【Android】实现微信小游戏关闭后再次打开接着玩,无需重新加载
现在市面上很多app上都有小游戏(或叫h5游戏),它们借助小游戏来提高整个app的粘性。像微信app、趣头条app、哈啰app上已经出现了小游戏模块。微信小游戏是如何做到,关闭activity后,再次打开,不需要重新加载呢原创 2021-06-07 21:17:47 · 2765 阅读 · 2 评论 -
【Unity3d】开发Unity Package 实现自动配置Android Studio工程
众所周知,unity3d工程可以导出android studio、xcode等平台工程,还需要手动添加一些代码或者修改一些参数后再打包才能满足我们的业务需要。原创 2020-07-22 19:30:03 · 2302 阅读 · 0 评论 -
【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 · 1755 阅读 · 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 · 1146 阅读 · 0 评论 -
【Andriod】组件化架构之实现组件可插拔
上一篇文章讲解了如何在云端配置项目的依赖:【Android】自定义Gradle Plugin实现云端配置项目依赖这篇文章讲解,当在云端修改了项目的依赖(dependencies{…})代码,比如删除或者新增了SDK组件,如何保证项目正常编译运行不受影响,即实现组件可插拔。例如,应用依赖了library1、library2、library3、…这些library都是可选的,即可以全都要,可以全不要或者只要其中一部分。现在在云端选择了应用需要依赖哪些library,达到不需要重新修改应用代码,即可感知到功原创 2020-06-24 16:47:12 · 739 阅读 · 0 评论 -
【Android】自定义Gradle插件——实现云端配置项目依赖
这篇文章讲解如何自定义一个Gradle插件,实现功能是将项目的sdk依赖dependencies{...}配置部分交给插件,将插件上传到maven仓库,通过云端来配置项目的依赖。原创 2020-06-18 16:52:25 · 2691 阅读 · 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 · 9079 阅读 · 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 · 3811 阅读 · 0 评论 -
【Android】使用nexus3搭建公司内部的maven私有仓库
为什么要搭建maven私有仓库?当公司的项目发展到一定阶段,人员发展到一定规模,项目必定要经历组件化改造。项目组件化之后,每个人只负责特定的模块。那么各个模块之间如何依赖呢?有两种方法,一种是工程里直接源码依赖,就是这种:implementation project(":libraryXXX")这种方式有二个弊端:1、编译的时候,会同时编译所有的library,每改一个小地方,就要全部编译一次,消耗时间长,开发效能低下。2、所有人都可以看到并可以修改别人负责的library,有时候谁改了自己代原创 2020-06-11 14:41:32 · 3982 阅读 · 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 · 1373 阅读 · 3 评论 -
【Android】Android 代码混淆Obfuscation实践与总结
对于Android Obfuscation,相信很多人都会感觉困惑或一支半解,有些混淆规则并不能按照字面上去理解。原创 2019-10-14 18:23:06 · 2573 阅读 · 2 评论 -
【Android】Android开发者最容易犯的几个错误
根据本人多年Android开发及代码审查经验,发现Android开发者极易犯下面这些错误。一、Activity回退,没有取消异步任务,比如网络请求。后果:异步任务回调后因找不到控件app闪退。二、注册组件没有反注册。比如广播、EventBus等。后果:Context被引用,组件无法回收。三、for循环中满足条件后循环没有中断。后果:增大cpu开销,拖慢性能四、使用不确定的...原创 2018-10-19 11:09:49 · 271 阅读 · 0 评论 -
【Android】Android弹出软键盘和关闭软键盘
在一些有输入框的界面中,我们需要自动弹出软键盘。比如搜索界面,输入框需要自动获取焦点并弹出软键盘。弹出软键盘代码: mEditText.setFocusable(true); mEditText.setFocusableInTouchMode(true); mEditText.requestFocus(); getWindow().setSoftInputMode(Win...原创 2018-10-19 12:51:17 · 3109 阅读 · 0 评论 -
【Android】Android事件分发机制总结
三个回调方法DispatchTouchEventOnInterceptTouchEvent (只有ViewGroup有)OnTouchEvent三个回调方法的关系DispatchTouchEvent包含了OnInterceptTouchEvent、OnTouchEvent,后两个方法是平行的,互不包含的关系。三个方法的调用顺序外层View:DispatchTouchEvent ...原创 2018-10-19 13:37:11 · 203 阅读 · 0 评论 -
【Android】为什么我们不需要导入android support v4包?
开发中发现了一个奇怪的问题,在没有引入support v4包的情况下,却可以用support v4路径下的Fragment。于是看了一下Android Studio左侧的External Libaries依赖树,发现已经包含了support v4的包,而且其中还有很多自己没有添加过的包。看了一下gradle文件配置的依赖项,只加了constraint-layout和appcompat-v7的包,于...原创 2018-10-17 08:45:07 · 10641 阅读 · 0 评论 -
【Android】Android主线程真的不让进行耗时操作吗?
默认情况下,Android主线程(UI线程)不让进行网络请求,否则会抛出NetworkOnMainThreadException。但是主线程还可以让程序员进行其它类型的耗时操作,比如读写磁盘数据、遍历操作一个大数组,但是如果超过5秒就会提示ANR错误。那么如何让主线程可以访问网络,而不抛出异常呢?在我们的Activity类的onCreate方法中,设置如下规则:StrictMode.Thre...原创 2018-10-17 08:48:42 · 2698 阅读 · 0 评论 -
【Android】Android自定义View和ViewGroup知识点汇总
一、View的绘制流程onMeasure()-&gt;onDraw()。二、ViewGroup的绘制流程onMeasure()-&gt;onLayout()-&gt;onDraw()(一般不重写)。三、需要重写的函数View:必须重写onDraw来绘制图形,不一定要重写onMeasure,需要定义wrap_content时才需要重写onMeasure。ViewGroup:必须重写...原创 2018-10-17 08:51:26 · 700 阅读 · 1 评论 -
【Android】盘点Android开发中常见的设计模式
一、适配器模式ListView+BaseAdapterRecyclerView+RecyclerView.Adapter二、建造者模式new AlertDialog.Builder()new OkHttpClient.Builder()new Retrofit.Builder()三、简单工厂模式Bitmap BitmapFactory.decodeByteArray(…)Bitm...原创 2018-10-13 17:27:43 · 695 阅读 · 0 评论