
Android Dev ABC
从基础到深层原理,用脑图,一步直达
木寸~
结庐在人境,而无车马喧。
展开
-
Android 错把setLayerType当成硬件加速
采用什么来绘制 View 不是关键,关键在于当设置了 View Layer 的时候,它的绘制会被缓存下来,而且缓存的是最终的绘制结果,而不是像硬件加速那样只是把 GPU 的操作保存下来再交给 GPU 去计算。通过这样更进一步的缓存方式,View 的重绘效率进一步提高了:只要绘制的内容没有变,那么不论是 CPU 绘制还是 GPU 绘制,它们都不用重新计算,而只要只用之前缓存的绘制结果就可以了。setLayerType() 这个方法,它的作用其实就是名字里的意思:设置 View Layer 的类型。原创 2022-11-11 21:33:34 · 2548 阅读 · 1 评论 -
Android CoordinatorLayout嵌套横向ViewPager2导致嵌套滑动失效问题
当CoordinatorLayout嵌套横向ViewPager2时,在ViewPager2上点住上下滑动会失效。ViewPager2使用RecyclerView实现,RecyclerView吃掉了nested的一系列方法,导致无法回传至CoordinatorLayout,导致behavior失效,最终无法滑动对CoordinatorLayout内部嵌套的 一切、一切、一切 横向ViewPager2使用下面这个方法即可,禁止它的nested拦截...原创 2022-07-09 08:32:01 · 2526 阅读 · 0 评论 -
Android_NDK JNI实现Android Parcel(D9)
Android_NDK JNI实现Android ParcelParcel 原理通过C结构体存储对象,返回结构体首地址(long类型)java层获取long之后申请从native层按照顺序写入数据把long值传递给另外的地方通过long值拿到native层的对象通过顺序读取顺序Parcel 思路实现// 结构体和对象 Parcel.cppclass Parcel{ char* mData;// char 1 共享内存的首地址 int mDataPos = 0; // =原创 2022-04-13 00:30:38 · 660 阅读 · 1 评论 -
Android_NDK JNI Native层构建java对象(D8)
Android_NDK JNI Native层构建java对象常量指针和指针常量//常量指针 100也就是常量不能改变int num1 = 100;const int *p = &num1;//指针常量 p1指向的&num2也就是地址不能改变int num2 = 200;int * const p1 = &num2;Native层构建java对象JNIEXPORT jobject JNICALL Java_com_sweet_lib_1network_1sig原创 2022-04-10 22:53:07 · 2412 阅读 · 0 评论 -
Android_NDK JNI实现原理和简单实现(D7)
Android_NDK JNI实现原理和简单实现JNI开发一般流程定义本地native方法生成.h头文件添加.h的工程目录依赖添加实现头文件中的native方法load动态库定义java native方法kotlinexternal fun signatureParams(params: String): Stringinit { System.loadLibrary("lib_network_sign") }System.load 加载一个具体路径原创 2022-04-10 00:43:59 · 314 阅读 · 0 评论 -
Android_NDK C文件操作(D6)
Android_NDK C文件操作读取文本文件void main(){ //打开文件 (文件名,模式[r,w,,rb,wb(二进制读写)]) char * filename = "C:\\a.text"; FILE * file = fopen(filename,"r"); if(file){ char buffer[10]; while(fgets(buffer,10,file)){ printf("%s",bu原创 2022-04-07 23:44:41 · 1862 阅读 · 0 评论 -
Android_NDK C结构体和枚举(D5)
Android_NDK C结构体和枚举结构体定义和使用struct Worker{ char name[10]; int age; double salary;};//不初始化,有默认值struct Worker1{ char name[10]; int age; double salary;}jack = {"jack",18,200},darry;struct Name{ char fisrtName[10]; char原创 2022-04-06 23:25:53 · 1873 阅读 · 0 评论 -
Android 点九(.9)图自动aapt脚本
点九(.9)图自动aapt脚本shell代码#! /bin/bash# dirname $0,取得当前执行的脚本文件的父目录basepath=$(cd `dirname $0`; pwd)# 打印当前路径echo "当前文件夹路径: $basepath"in="/in"out="/out"aapt="/aapt"outFore="out_"fanxiegang="/"tools="/tools"inpath="$basepath$in"outpath="$basepath原创 2022-04-06 11:57:53 · 1589 阅读 · 0 评论 -
Android_NDK C字符串基本操作(D4)
Android_NDK C字符串基本操作字符串长度void main(){ char arr[] = {'a','a','a','a','a','\0'}; printf("%s",arr);}字符串结尾是\0,也就是字符串长度数据要比数组长度少1。void main(){ char *str = "aaaaaa"; printf("%s",str);}和上面的区别就是下面的不能修改。void main(){ char *str = "aaaaaa原创 2022-04-04 23:38:14 · 1081 阅读 · 0 评论 -
Android_NDK C内存开辟(D3)
Android_NDK C内存开辟内存开辟栈:占用内存空间大约2M,静态内存开辟,方法结束自动回收,栈虚拟机(jvm也是栈虚拟机,安卓虚拟机是寄存器虚拟机)堆:占用内存空间最大值的80%,动态内存开辟,必须手动回收内存void main(){ int arr[5];//静态开辟 //动态开辟 int* arr = (int*)malloc(10*1024*1024*sizeof(int)) //动态释放 free(arr) //arr[i] = *(原创 2022-04-03 23:56:14 · 458 阅读 · 0 评论 -
Android_NDK C指针运算和函数指针(D2)
Android_NDK C指针运算和函数指针二级指针和多级指针对地址再取地址int a = 12;int* p = &a;int** dp = &p;int* op = *dp;int* op2 = dp[0] ;dp的值是p的地址,p的值是a的值。如果想知道dp的地址,就需要3级指针指向dp的地址即可。如果想要最终的值,就用多级n个*进行取值即可。最后两个op的写法其实是一样的。看别人代码的时候可以灵活思维。数组和数组指针int arr[] = {1,2,3,4}原创 2022-04-02 23:54:11 · 643 阅读 · 0 评论 -
Android_NDK C基本类型和指针(D1)
Android_NDK C基本类型和指针推荐一个C++ VSCODE环境配置的博文 VSCODE C++环境配置基本数据类型short int long double float char变量地址&a : 取变量a的地址sizeof() : 获取数据类型占内存字节数*(&a) : 获取地址a对应的值int * : 代表int类型的指针(别的类推)*p : 可以通过指针取值再修改值通过指针相当于java传递引用写个方法对两个值进行交换指针修改开辟新空间void ch原创 2022-04-01 23:27:37 · 1781 阅读 · 0 评论 -
Android (2022 xml版)LinearLayout添加间隔(Divider)的正确姿势
最优解我们直接看最优解divider_line.xml<?xml version="1.0" encoding="utf-8"?><inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetLeft="16dp" android:insetTop="4dp" android:insetRight="16dp" android:insetBottom="4原创 2022-03-31 20:49:32 · 1211 阅读 · 0 评论 -
【性能优化】Android Glide配置图片加载格式防止OOM
优化点根据不同机型的数据给机型进行打分,之后根据不同的分数通过Glide统一设置图片加载格式。可参考的数据有:Android 系统version code分辨率内存大小近期oom等优化代码@GlideModulepublic class MyAppGlideModule extends AppGlideModule { @Override public void applyOptions(@NonNull Context context, @NonNull Glide原创 2022-03-31 19:45:22 · 1360 阅读 · 0 评论 -
Android 用Flow封装一个FlowBus
用途用安卓jetpack提供的flow封装一个事件总线。支持黏性非粘性等一系列事件。对比RxBus:不用引入RxJava库,安卓端即可LiveData:LiveData不知道谁发明的封装事件总线,反射源码不说,LiveData就不是用来干这事的。Flow:代码简洁,Android封装代码(给个赞,不要伸手党)import androidx.lifecycle.LifecycleOwnerimport androidx.lifecycle.Observerimport androidx.li原创 2022-03-31 17:41:30 · 2283 阅读 · 1 评论 -
Android 硬件加速对照表(记录)
硬件加速硬件加速指的是使用 GPU 来完成绘制的计算工作,代替 CPU。它从工作分摊和绘制机制优化这两个角度提升了绘制的速度。硬件加速可以使用 setLayerType() 来关闭硬件加速,但这个方法其实是用来设置 View Layer 的:参数为 LAYER_TYPE_SOFTWARE 时,使用软件来绘制 View Layer,绘制到一个 Bitmap,并顺便关闭硬件加速;参数为 LAYER_TYPE_HARDWARE 时,使用 GPU 来绘制 View Layer,绘制到一个 OpenGL te原创 2022-03-31 17:35:21 · 236 阅读 · 0 评论 -
Android ConstraintLayout你不知道的好用功能
本文只说功能,用法自行搜索()里面为陌生度,100为很陌生 0为这都不知?1. 角度约束(90)一个控件在某个控件的某个角度的位置app:layout_constraintCircle="" 目标控件id app:layout_constraintCircleAngle="" 对于目标的角度(0-360) app:layout_constraintCircleRadius="" 到目标中心的距离2. 百分比偏移(30)让控件在父布局的水平方向或垂直方向的百分之多.原创 2021-12-30 10:24:35 · 1084 阅读 · 0 评论 -
Android 布局既wrap_content又match_parent实现
期望效果布局时,我们希望达到内容不多时wrap_content,内容多时match_parent的效果。如果只用wrap_content,是限制不住子布局的。这时就需要特殊处理。解决方案1.postValue在父布局中实现一个invisible的view,让他宽高0dp然后布满布局。使用的时候,如果我们targetView宽高大于不可见的,就设置targetView的宽高为不可见view的宽高即可。2.constrainedWidth/constrainedHeight利用ConstraintL原创 2021-12-28 15:46:36 · 1906 阅读 · 0 评论 -
Android MutableContextWrapper、IdelHandler实践之预加载View工具类
MutableContextWrapperMutableContextWrapper是Context家族中一员。其显著特点是可以动态替换baseContext来达到预加载需要Context创建的资源。预加载工具类不多解释了,里面运用了IdelHandler和MutableContextWrapper,在资源不紧张时返回预加载View。object PreViewHelper { private val viewMap = ConcurrentHashMap<Class<*>原创 2021-12-23 11:15:23 · 3314 阅读 · 0 评论 -
Android ABC 解决传感器抖动(帕金森)方案
问题在哪?在使用移动设备传感器时,会出现数据抖动现象(帕金森),传感器数据会在极小的范围内来回抖动,导致业务展示出现帕金森现象。最常见的就是手机姿态传感器,xyz的值一直在变化。为了让数据的变化平滑,我们必须对数据进行清洗和处理,再使用。解决方案1.窗口平均我们可以取一个窗口,一般为4或者6,然后我们对这个窗口里的值进行取平均,然后得出输出值,然后再使用。代码就不附了,这个思路非常简单。优点:使用简单,可以更换窗口的大小来调优缺点:趋势性被大幅降低,转折点钝化2.N阶低通滤波器其实这个也原创 2021-12-08 11:51:41 · 1486 阅读 · 0 评论 -
Android ABC 网络加载NinePatch(.9)图方案及实现
网络加载NinePatch图本地制作和使用ninePatch图不多赘述了,网上教程一大堆。下面给出网络使用ninePatch图的方案方案1.PNG转NinePatch通过Android Studio自带的Create 9-Patch file制作NinePatch图2.NinePatch预编译使用Android sdk build-tools目录下的aapt对制作出来的NinePatch图进行转化,命令如下aapt s -i /xxx/xxx/FirstStep.9.png -o /xxx/x原创 2021-12-07 17:37:52 · 1733 阅读 · 0 评论 -
Android ABC 基于字节跳动的SP ANR优化方案实现
原理字节跳动SP优化方案方案根据字节跳动的文章和Android源码分析可知,SP的apply方法会将每一次的apply做成一个任务去执行,然后添加到Activity的sPendingWorkFinishers去执行。分析Android11的源码可知,apply()方法之后,代码就开始执行了。如果我们等待片刻,onStop的时候就会发现,finish队列已经空了,并不会引起ANR。什么时候会引起ANR?当apply加入后的finish队列还没执行完我们就退出时才会ANR或者卡顿,根本问题就是主线程原创 2021-12-04 17:42:24 · 1265 阅读 · 0 评论 -
Android recyclerview notify闪烁问题修复
使用notify刷新全部不会闪,但是notify刷新一条会闪,问题修复原创 2021-10-22 19:51:43 · 1314 阅读 · 0 评论 -
Android 冷启动系统优化(附实践思路)
思路分析前言冷启动涉及的因素很多,从流程上说,分为以下几个阶段点击Launcher的图标,AMS处理intent,与Zygote socket交互fork进程,新进程运行ActivityThread代码,AMS和ApplicationThread互相绑定,AMS发binder信息反射启动Application。以上是第一阶段,这个阶段到Application的attchbasecontext方法之前,我们基本上都无法参与,但ContentProvider的初始化是在Application之前的,它的原创 2021-10-09 11:04:09 · 807 阅读 · 0 评论 -
Android 文件选择获取路径(亲测并踩坑)
权限配置open failed: EACCES (Permission denied)必须按照下面的方式配置否则报错,下面是解决方法首先需要检查是否添加读写权限。<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />然后再确认原创 2021-09-26 17:36:36 · 5811 阅读 · 1 评论 -
Android反编译工具介绍,一定看到最后!!!
解压app将apk后缀改为zip,然后就可以得到manifest文件和dex文件,如果是乱码的继续往下看dex2jar官网github:https://github.com/pxb1988/dex2jar主要功能就是把刚刚解压的dex文件转化为jarJD-JUI官网github:http://java-decompiler.github.io/用来查看jar文件,已经转化成java文件,转化不成功的部分会显示bytecode,可以根据需求进行人工读写appTool官网github:http原创 2021-09-14 18:13:07 · 340 阅读 · 0 评论 -
Android 那些容器
Map内存优化容器SparseArray内部使用两个数组实现key只能是int值,减少拆箱装箱步骤存储和读取数据时候,使用二分查找法SparseArray还提供了两个特有方法,更方便数据的查询:获取对应的key:public int keyAt(int index)获取对应的value:public E valueAt(int index)LongSparseArraykey值为long其他参考SparseArrayArrayMapkey值可以为任意原创 2021-01-18 20:28:59 · 394 阅读 · 0 评论 -
一图了解Redux设计思想
原创 2021-01-14 16:45:44 · 210 阅读 · 0 评论 -
4图掌握RecycleView的机制问题
流程锚点绘制法缓存原理转载 2021-01-13 16:33:46 · 118 阅读 · 0 评论 -
Fresco工作流程笔记
参考文章地址https://www.cnblogs.com/huansky/p/14221894.html整体架构DraweeView继承自 ImageView,是 Fresco 加载图片各个阶段过程中图片显示的载体,比如在加载图片过程中它显示的是占位图、在加载成功时切换为目标图片。Fresco 的图片显示原理是 : 利用 ImageView 显示DraweeHierachy 的 TopLevelDrawable。DraweeHolderDraweeView、DraweeHierachy.转载 2021-01-11 01:34:11 · 154 阅读 · 0 评论 -
RxJava的一张图
原创 2021-01-09 02:06:37 · 134 阅读 · 0 评论 -
8图看懂OKhttp
原文地址点我在这里整体流程请求拦截器缓存原理缓存流程连接池IO流程Http不同版本区分转载 2021-01-09 01:48:57 · 129 阅读 · 0 评论 -
一张思维导图学会Java多线程
原创 2021-01-08 01:37:20 · 182 阅读 · 0 评论 -
我花了一个月整理的Android思维导图
Activity相关IntentFilter匹配:使用action/category/data等数据匹配对应的Activity和携带数据进行跳转IPCAndroid中启动多进程只能通过指定组件的进程名来开启IPC的基础Serializable、Parcelable、BinderBinderBundle:在启动组件时携带、Bundle实现了Parcelable接口,可以方便的在不同进程组件之间携带数据,但是它的大小受到限制文件共享Messager:服务端使用MessageHand原创 2021-01-08 01:31:11 · 1020 阅读 · 0 评论 -
Android FrameWork那些事
就这?Android FrameWork层概念大全系统服务Zygote作用:启动SystemServer孵化应用进程启动流程:Linux系统init方法读取init.rc配置文件启动Zygote,fork+execve工作原理:fork+execvefork+handle通过execve的参数path、argv、env配置子进程的相关设置信息复用Zygote的一些配置,通过pid为0判断是子进程信号处理SIGCHLD,如果子进程销毁则会通知Zygote原创 2021-01-06 01:42:04 · 198 阅读 · 0 评论 -
Android ABC 取其精华去其糟粕、JetPack好用的组件推荐
JetPack主流组件对比jetpack组件名推荐指数槽点指数解析LiveData★★★★★配合ViewModel和数据可以实现界面的动态更新,内部使用version版本控制和观察者模式,但是粘性事件不可选择,需要手动实现version进行事件控制DataBinding★★★★★★★只需要加上标签即可自动生成ViewBinding(类似于ViewHolder),也可以在xml文件里直接进行赋值等操作,@BindingAdapter()可以动态绑定,调用方法,非常方原创 2020-10-20 15:14:26 · 1683 阅读 · 0 评论 -
Android ABC LiveData的源码分析和去除粘性事件处理(附源码)
写在开头本文简单介绍了LiveData的源码,并实现了一个非粘性事件添加的类LiveData /** * Creates a LiveData initialized with the given {@code value}. * * @param value initial value */ public LiveData(T value) { mData = value; mVersion = START_VER原创 2020-10-12 17:39:09 · 2446 阅读 · 0 评论 -
Android ABC Navigation源码解析和使用封装
fragment 参数defaultNavHost会和系统返回键相关联,会判断fragment返回栈里是否还有fragment来操作navGraph页面路由结构navigation参数startDestination 默认显示的fragment页面参数标签argument 创建当前fragment携带的参数action 指定from和destinationdeeplink 三方应用或通过隐式方法拉起原理1、通过intent.getdata获取uri对象2、通过uri调用match原创 2020-09-28 11:17:34 · 2225 阅读 · 0 评论