Android深度
文章平均质量分 92
氦客
Stay hungry,Stay foolish
展开
-
ViewBinding与Kotlin委托结合使用,去除setContentView,其实现原理解析
ViewBinding与Kotlin委托结合使用,使用ViewBindingPropertyDelegate等第三方库,可以简化Android ViewBinding的使用,甚至不再需要setContentView,这看上像是被施了魔法,很神奇,实际内部到底做了什么事呢 ?原创 2022-09-07 16:49:00 · 1885 阅读 · 0 评论 -
LeakCanary源码解析
垃圾回收机制垃圾回收机制分为引用计数法和可达性分析法引用计数法: Python,Object-C,Swift用一个计数器记录一个对象被引用的次数,如果引用的次数被减少到0那么说明这个对象是垃圾对象。但是引用计数有循环引用的问题可达性分析法: JavaJvm通过GC Roots向下搜索,如果可以被Gc Roots引用到的对象,说明这个对象不是垃圾对象,反之这个对象就算互相引用了也是垃圾对象。作为GC Roots的对象有:在线程栈中的局部变量,也就是正在被调用的方法,它里面的参数和原创 2020-08-14 15:22:16 · 508 阅读 · 0 评论 -
Android TransitionManager源码解析
通过上篇文章Android 使用TransitionManager来方便地实现过渡动画我们知道了TransitionManager.beginDelayedTransition可以快速地实现属性动画效果。那它是怎么实现的呢? 接下来我们来看下它的源码public static void beginDelayedTransition(final ViewGroup sceneRoot) { beginDelayedTransition(sceneRoot, null);}public st原创 2020-07-20 09:05:17 · 1106 阅读 · 0 评论 -
Android 编译流程解析03-手动编译Apk
Android编译流程通过之前两篇文章,我们已经大致了解了编译相关的Gradle,它们的编译流程如下图所示,这篇文章我们来通过手动编译的方式,来模拟Gradle 编译Android APK文件。手动编译APK从这里,我们就要开始手动编译Apk文件了。创建一个Android项目首先,我们要有一个Android项目,为了更简单,我去除了多余的代码,我们编译的时候,可以直接使用该项目。下载地址 Android 手动编译APK-代码资源下载创建build文件夹我们把下载好的项目解压,然后使用cmd原创 2020-07-07 09:10:18 · 2570 阅读 · 4 评论 -
Android 编译流程解析02-相关Task解析
Android编译由Gradle Task来完成。dependencies { classpath 'com.android.tools.build:gradle:3.0.1'}apply plugin: 'com.android.application' //主项目apply plugin: 'com.android.library' //Library那我们要如何看到com.android.tools.build:gradle的源码呢?我们可以在app的gradle引入comp原创 2020-07-06 09:03:58 · 1171 阅读 · 0 评论 -
Android 编译流程解析01-AppPlugin初始化
Android编译由Gradle插件来完成。在平时开发中,我们都知道,添加以下Gradle插件,我们就可以编译Android项目。dependencies { classpath 'com.android.tools.build:gradle:3.0.1'}apply plugin: 'com.android.application' //主项目apply plugin: 'com.android.library' //Library那我们要如何看到com.android.tools原创 2020-07-04 06:44:41 · 1772 阅读 · 0 评论 -
Android虚拟机的启动 源码分析
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#main()是怎么执行的 ? 这需要从虚拟机启动的执行开始说起。(通过反射)虚拟机启动的入口从frameworks/base/core/jni/AndroidRuntime.cpp#start方法开始来看其中的这几行jni_invocation.Init(...原创 2020-02-05 22:23:06 · 467 阅读 · 0 评论 -
NDK env->GetStaticMethodID源码解析
来看 art/runtime/jni_internal.cc可以看到最终调用了FindMethodIDstatic jmethodID FindMethodID(ScopedObjectAccess& soa, jclass jni_class, const char* name, const char* sig, bool...原创 2020-02-05 22:07:30 · 2763 阅读 · 0 评论 -
NDK env->FindClass源码解析
来看art/runtime/jni_internal.cc再来看art/runtime/class_linker.cc可以看到,这里有个LookupClass,传入要加载的类的签名,hash值和classLoader,如果返回的kclass不为null,则说明之前已经加载过,会直接return (双亲委托机制)。如果不为null, 来看2148行,class_loader如果获取为nu...原创 2020-02-05 21:51:06 · 2740 阅读 · 0 评论 -
Android DEX加固方案与原理
DEX加固方案的演进原创 2019-11-08 09:46:54 · 3614 阅读 · 0 评论 -
Android Tinker 热修复原理
热修复流派基于Multidex的Dex注入代表:TInker,手机QQ控件、Nuwa原理:将补丁Dex对象的DexFile对象注入到系统ClassLoader相关联的DexPathList对象的dexElements数组的最前面Native层方法替换代表:AndFix,阿里百川HotFix原理:在Native层对方法的整体数据结构(Method/ArtMethod)进行替换Class...原创 2019-11-08 09:38:23 · 1303 阅读 · 0 评论 -
Android 中的字体大小适配
Android系统中可以设置字体大小,对于一些设置了特大号字体的设备,往往会出现布局错乱的情况,对此,需要做相关的字体大小适配。经由聊聊 Android 中的字体大小适配这篇博客,在进行一些改进,找到了一种比较合适的方式,将字体大小控制在合理范围内。已MIUI为例,系统中设置的字体大小对应的fontScale如下巨无霸 1.4超大 1.4大号 1.32中号 1.15标准 1小号 0....原创 2019-10-16 15:25:30 · 3340 阅读 · 0 评论 -
Android Apk安装原理
APK安装分为有界面安装和无界面安装有界面安装UI界面在packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java来看下PackageInstallerActivity (Android7.0.0_r31)然后,通过PackageUtil.getPackag...原创 2019-09-20 19:33:02 · 1285 阅读 · 0 评论 -
Android Binder核心原理
Binder是Android的一种特色的跨进程的通信方式为什么感觉Binder很陌生这个和工作年限没有关系,主要是以为实际项目比较简单,不需要接触到跨进程通讯。就算涉及到跨进程通讯,也只简单地用到了AIDL (封装了Binder的一种框架,使使用Binder,使用跨进程更加方便)。为什么要学习Binder例如startActivity,网络硬件各种服务,都使用到了跨进程的通讯,在系统层,...原创 2019-09-20 09:41:40 · 608 阅读 · 0 评论 -
Android Andfix热修复原理
1.了解什么是热修复2.class加载 (内存运行机制)3.手写实现AndFix4.兼容性和Sophix的实现机制class加载 (内存运行机制)原创 2019-06-07 12:53:41 · 923 阅读 · 0 评论 -
3.1.4_cardView原理解析
CardView继承自FrameLayout,对于不同的版本,有不同的实现类。static { if (VERSION.SDK_INT >= 21) { IMPL = new CardViewApi21Impl(); } else if (VERSION.SDK_INT >= 17) { IMPL = new CardViewApi17...原创 2019-05-07 07:19:43 · 795 阅读 · 0 评论 -
1.1.2 Activity的UI架构及创建流程
Activity的UI架构每个Activity都包含一个Window对象1PhoneWindw都DecorView设为整个应用窗口的根布局2DecorView将要显示的具体内容呈现在了PhoneWindow上。封装了一些窗体操作通用方法。所有View的监听事件,都通过WindowManagerService来进行接收,并通过Activity对象来回调相应的onClickListe...原创 2019-03-25 22:47:39 · 361 阅读 · 0 评论 -
1.3.1_事件分发机制详解
事件顺序正常的情况下,一次事件点击会触发一系列点击事件。点击屏幕后立即松开,事件顺序是DOWN->UP点击屏幕一会后再松开,事件顺序是DOWN->MOVE->…->MOVE->UP事件分发的对象Activity:控制生命周期、处理事件ViewGroup:一组View的集合 (还有多个View)View:所有UI组件的基类事件分发主要方法d...原创 2019-04-05 14:34:53 · 545 阅读 · 0 评论 -
1.2.1_Paint的使用
Paint常见APImPaint.setColor(Color.RED);// 设置颜色mPaint.setARGB(255, 255, 255, 0); // 设置 Paint对象颜色,范围为0~255mPaint.setAlpha(200); // 设置alpha不透明度,范围为0~255mPaint.setAntiAlias(true); // 抗锯齿mPaint.setStyle...原创 2019-03-28 08:37:38 · 326 阅读 · 0 评论 -
1.2.2_Paint渲染器 Shader的使用
Paint渲染器通过paint.setShader来进行设置mPaint.setShader(mShader);canvas.drawRect(0, 0, 500, 500, mPaint);LinearGradient线性渲染/*** 1.线性渲染,LinearGradient(float x0, float y0, float x1, float y1, @NonNull @Co...原创 2019-03-28 09:10:57 · 354 阅读 · 0 评论 -
1.2.6_Path的使用
move & linemPath.moveTo(100, 70); //移动mPath.lineTo(140, 800);//等同于上一行代码效果,相当于 (140-100,800-70)//mPath.rLineTo(40, 730);mPath.lineTo(250, 600);mPath.close(); //是否曲线是否闭合 添加子图形addXXX//添加弧形...原创 2019-04-08 06:57:14 · 271 阅读 · 0 评论 -
1.2.3_Paint 图层混合模式 Xfermode的使用
图层混合模式使用方式如下Paint.setXfermode()离屏绘制通过使用离屏缓冲,把要绘制的内容单独绘制在缓冲层,保证Xfermode的使用不会出现错误的结果。使用方式一 (推荐)int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);setBac...原创 2019-03-29 08:18:35 · 338 阅读 · 0 评论 -
1.2.4_使用离屏绘制Xfermode实现刮刮卡效果
先看下效果图如何实现1.初始化mPaint = new Paint();mPaint.setColor(Color.RED);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(80);mPaint.setStrokeCap(Paint.Cap.ROUND);//禁止硬件加速setLayerType(View.L...原创 2019-03-29 08:54:29 · 258 阅读 · 0 评论 -
1.2.5_使用Paint实现滤镜效果
先来看下原图LightingColorFilterR`= R * mul.R / 0xff + add.R G`= G * mul.G / 0xff + add.G B`= B * mul.B / 0xff + add.B //将红色去除掉 new LightingColorFilter(0x00FFFF, 0x000000)//将绿色去除掉 new LightingColo...原创 2019-03-29 09:16:38 · 254 阅读 · 0 评论 -
1.2.8_Canvas的使用
平移操作通过translate进行平移,可以看到,起始点往右侧、下侧平移了50canvas.drawRect(0,0, 400, 400, mPaint);canvas.translate(50, 50);mPaint.setColor(Color.GRAY);canvas.drawRect(0,0, 400, 400, mPaint);canvas.drawLine(0, 0, 60...原创 2019-04-08 17:07:57 · 363 阅读 · 0 评论 -
2.1.2 Android刘海屏适配
屏幕适配-Android9.0官方刘海屏适配策略如果非全屏模式(有状态栏),则app不受刘海屏的影响,刘海屏的高就是状态栏的高如果全屏模式,app位适配刘海屏,系统会对界面做特殊处理,竖屏向下移动,横屏向右移动Google在Android9.0推出了刘海屏适配的方案,Android9.0以后,采用此方案即可。全屏模式下,如何让界面延伸进刘海判断手机是否是刘海屏 private bo...原创 2019-04-22 18:40:14 · 503 阅读 · 0 评论 -
2.1.1_Android屏幕适配大全
布局适配避免写死空间尺寸,使用wrap_content,match_parentLinearLayout xxx:layout_weight=“0.5”RelativeLayout xxx:layout_centerInParent=“true”ContraintLayout xxx:layout_constraintLeft_toLeftOf=“parent”Percent-supp...原创 2019-04-22 18:42:17 · 490 阅读 · 0 评论 -
1.2.7_PathMeasure详解
PathMeasure路径测量,一个用来测量Path的工具类常用API:Path的测量Path的跳转Path片段获取Path的测量先进行绘制Path path = new Path();path.lineTo(0,200);path.lineTo(200,200);path.lineTo(200,0);进行测量pathMeasure需要关联一个创建好的path, ...原创 2019-04-29 08:58:43 · 314 阅读 · 0 评论 -
3.1.3_CoordinatorLayout原理
给子View设置Behavior的原理CoordinatorLayout会去获取layout_behavior属性this.mBehaviorResolved = a.hasValue(styleable.CoordinatorLayout_Layout_layout_behavior);if (this.mBehaviorResolved) { this.mBehavior = C...原创 2019-05-07 07:14:21 · 430 阅读 · 0 评论 -
1.1.1_Activity的启动流程及View的三大绘制流程
创建DecorView (顶层布局)在DecorView中加载基础布局ViewGroup (拥有content这个ID)将ContentView添加到content这个Layout中原创 2019-03-25 21:26:12 · 274 阅读 · 0 评论