【Android 开发进阶】
文章平均质量分 93
无名之辈FTER
不是因为看到希望才坚持,而是坚持了才能看到希望!
展开
-
从Android 8.0源码的角度剖析线程池原理
在计算机系统中,进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的基本单位,每个进程都拥有自己私有的地址空间,且进程之间是相互独立的。线程是操作系统调度的最小单位,它可以说是进程的组成部分,在一个进程中可以创建多个线程,这些线程都拥有各自计数器、堆栈和局部变量等属性,但是不再拥有系统资源,它与进程中的其他线程共享该进程所拥有的全部资源,或称共享内存变量。线程是独立运行的,且采用抢占...原创 2020-02-10 13:26:54 · 2602 阅读 · 0 评论 -
内存泄漏分析框架LeakCanary的使用与原理解析
文章目录1. 常见内存泄漏1.1 “单例模式” 造成的内存泄漏1.2 “静态实例” 造成内存泄漏1.3 “Handler” 造成的内存泄漏1.4 “线程” 造成的内存泄漏1.5 “使用WebView” 造成的内存泄漏2. LeakCanary使用与原理解析2.1 LeakCanary使用方法2.2 LeakCanary原理解析 在《Android性能优化(1):常见内存泄漏与优化(一)》和《An...原创 2020-01-12 21:52:16 · 12766 阅读 · 2 评论 -
Android性能优化(6):浅析类加载机制与热修复技术
文章目录1. 类加载与反射1.1 类加载机制1.1.1 类加载器1.1.1.1 Java中的ClassLoader1.1.1.2 Android中的ClassLoader1.1.2 双亲委托模式1.1.3 ClassLoader的加载过程1.1.4 类的链接1.1.5 类的初始化1.2 Java反射机制2. 热修复技术2.1 热修复方案2.1.1 Tinker2.1.2 QZone超级补丁2.1...原创 2019-12-29 18:20:29 · 3487 阅读 · 1 评论 -
依赖注入框架ButterKnife的使用与原理解析
文章目录1. 注解与依赖注入1.1 注解1.1.1 注解分类1.1.2 注解处理器1.2 依赖注入2. ButterKnife框架2.1 ButterKnife的基本使用2.2 ButterKnife原理解析2.2.1 创建各类注解类2.2.2 ButterKnife的注解处理器2.2.3 ButterKnife的bind方法1. 注解与依赖注入1.1 注解 从JDK 5.0开始,Java增...原创 2019-12-27 15:50:37 · 5988 阅读 · 2 评论 -
事件总线框架EventBus的使用与原理解析
文章目录1. EventBus框架1.1 EventBus简介1.2 EventBus基本使用1.2.1 添加Gradle依赖1.2.2 定义事件1.2.3 准备订阅者1.2.4 发布事件2. EventBus原理解析2.1 订阅者注册过程2.2 订阅者注销过程2.3 事件发布过程3. EventBus性能优化 事件总线模式基于发布-订阅机制实现,它是一种集中式事件处理机制,允许不同的组件之间进...原创 2019-12-21 16:47:36 · 12872 阅读 · 0 评论 -
从Android 8.0源码的角度剖析APP的启动过程
文章目录1. 应用进程启动过程1.1 AMS向Zygote进程发起请求1.2 Zygote进程接受请求2. Activity启动过程2.1 应用程序的Appication启动过程2.2 应用程序的根Activity启动过程在从Android 8.0源码的角度剖析Android系统启动过程(2)一文中,我们了解到当ActivitiyManagerService服务被启动后,就会通过Intent以...原创 2019-12-14 02:20:32 · 7178 阅读 · 4 评论 -
Android性能优化(5):APK瘦身优化
文章目录1. APK文件结构2. APK瘦身优化2.1 优化dex文件大小2.1.1 Proguard2.1.2 AndResGuard2.2 优化资源文件大小2.2.1 Android Lint2.2.2 [tinypng](http://leonshi.com/2015/11/02/tinypng-compress/)2.2.3 WebP2.3 优化libs目录大小2.3.1 裁剪libs目录...原创 2019-12-10 21:49:01 · 3343 阅读 · 0 评论 -
从Android 8.0源码的角度剖析Android系统启动过程(2)
文章目录1. SystemServer进程1.1 启动Binder线程池1.2 启动系统服务1.2.1 启动Bootstrap(引导)服务1.2.2 启动Core(核心)服务1.2.3 启动Other(其他)服务2. Launcher进程在从Android 8.0源码的角度剖析Android系统启动过程(1)一文中,我们介绍了Android系统启动过程中的init进程和Zygote进程的启动流...原创 2019-12-06 23:36:11 · 1839 阅读 · 0 评论 -
从Android 8.0源码的角度剖析Android系统启动过程(1)
文章目录1. init进程启动过程1.1 解析init.rc文件1.2 启动Zygote进程2. Zygote进程启动过程2.1 启动SystemServer进程2.2 创建Zygote进程的Server socket 在《嵌入式Linux应用开发完全手册》一书中,我们可以较为清晰地了解到Android系统启动的大体流程:当用户按下Android设备的电源键时,CPU上电后会从0x0000000...原创 2019-12-05 10:27:33 · 2022 阅读 · 0 评论 -
从Android 8.0源码的角度剖析APK打包、安装过程
文章目录1. APK打包过程1.1 APK文件结构1.2 APK打包过程2. APK安装过程2.1 拷贝APK2.2 解析APK APK,全称Android Application Package,即Android应用程序包,是Android系统使用的一种应用程序包文件格式,它的作用是将Android程序和资源整合在一起,以便Android程序能在Android设备上正常运行。简单地说,就是一个...原创 2019-11-29 22:22:56 · 2632 阅读 · 0 评论 -
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...原创 2019-11-20 09:38:34 · 11098 阅读 · 4 评论 -
Android性能优化(2):常见内存泄漏与优化(二)
文章目录1. Android虚拟机:Dalvik和ART1.1 JVM与Dalvik区别1.2 Dalvik与ART区别1.3 Dalvik/ART的启动流程2. 常见内存分析工具2.1 Android Profiler2.1.1 Allocation Tracker2.1.2 Heap Dump2.2 MAT2.3 LeakCanary在Android性能优化(1):常见内存泄漏与优化(一...原创 2019-11-07 16:20:20 · 2768 阅读 · 6 评论 -
Android多媒体技术(一)Camera实时视频采集预览、拍照、JPEG图片方向的处理
手机摄像头(Camera)的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的取景方向,这个取景方向恰好是当手机向左侧横放时的方向,其坐标原点位于手机横放时的左上角。图像传感器的取景方向与手机正常方向成90度夹角,按理来说,当我们以正常的手机方向打开相机(Camera)时,看到的预览图像应该是横向的。但是,当我们打开系统相机后,看到的预览图像却是正常的,即预览图像与手机方向一致。这是因为系统自带的相机在Android系统底层根据当前手机屏幕的方向对图像传感器采集到的数据进行了原创 2017-01-13 00:04:46 · 7673 阅读 · 0 评论 -
从Android6.0源码的角度剖析Handler消息机制原理
■ 文 蒋东国ActivityThread通过ApplicationThread和AMS进行进程间通信,AMS以进程间通信的方式完成ActivityThread的请求后回调ApplicationThread中的Binder方法,然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到Activity中取执行,即切换到主线程中去执...原创 2018-11-13 22:13:30 · 2300 阅读 · 0 评论 -
Android USB开发小结:host模式与accessory模式
很早之前就想对Android USB的两种模式作个小结,但是一直没有空去搞,毕竟USB这块应该属于冷门方向,并且应用层能够做的比较少也很简单。最近刚好在做大疆无人机的二次开发,想着对USB连接检测这块做下优化,毕竟Android终端主要是通过USB连接到远程控制器来与无人机进行交互。但与AndroidUSBCamera一文中提及的USB Camera场景不同,无人机使用的是Android终端的a...原创 2018-12-27 22:15:59 · 11339 阅读 · 3 评论 -
从Android6.0源码的角度剖析Binder工作原理
在从Android 6.0源码的角度剖析Activity的启动过程一文中,我们了解到Activity的启动过程最终由系统服务ActivityManagerService完成,ActivityManagerServer是继承于Binder且运行在系统进程中,Activity的启动实质是一次基于Binder机制的跨进程通信。除此之外,Android系统还为应用程序提供了各种系统服务,比如多媒体播放、...原创 2019-02-11 12:16:07 · 1928 阅读 · 0 评论 -
从Android6.0源码的角度剖析Service启动过程
Service是Android四大组件之一,与Activity的可视化界面相反,Service没有向用户提供交互界面,因此常被用于执行后台任务。Service的启动方式有两种:普通启动和绑定启动,其中,前者通过Context.startService方法启动,常用于执行普通的后台任务;后者通过Context.bindService方法启动,用于执行与启动组件有数据交互的后台任务。本文将从Andr...原创 2019-02-23 15:40:01 · 1540 阅读 · 0 评论 -
从Android 6.0源码的角度剖析View的事件分发机制
请尊重原创,转载请声明出处:在从Android 6.0源码的角度剖析UI界面架构一文中,我们了解到Activity是Android的可视化界面,是用户与Android系统交互的窗口,也就是说每个Activity都对应着一个窗体,但窗体是一个抽象的概念,它的具体表现形式是视图。在Android中,窗体对应着Window类,视图对应着View类。Window是一个抽象类,它的具体实现是PhoneW...原创 2019-08-15 17:47:50 · 1394 阅读 · 0 评论 -
从Android 6.0源码的角度剖析View的绘制原理
在从Android 6.0源码的角度剖析Activity的启动过程和从Android 6.0源码的角度剖析Window内部机制原理的文章中,我们分别详细地阐述了一个界面(Activity)从启动到显示的整个流程和View是如何添加到Activity的Window中的。本文就在上述两篇文章基础上,从源码的角度剖析View的绘制过程,同时分析在源码中View的绘制入口在哪里。1. View绘制入...原创 2019-09-03 15:35:01 · 2174 阅读 · 1 评论 -
Android性能优化(1):常见内存泄漏与优化(一)
a众所周知,Java因其拥有独特的虚拟机(JVM)设计,使其成为一门跨平台、内存自动管理的高级开发语言。所谓跨平台,即"一次编译,多次运行",从而解决了不同平台由于编译器不同导致无法运行问题;所谓内存自动管理,即Java不像C/C++那样需要开发者来分配、释放内存,它拥有一套垃圾回收机制来管理内存,这套机制减轻了很多潜在的内存回收不当问题。然而,虽然Java的垃圾回收机制非常优秀,但当我们在写...原创 2019-10-09 18:01:47 · 2310 阅读 · 1 评论 -
从Android 6.0源码的角度剖析Activity的启动过程
转载请声明出处: https://blog.csdn.net/AndrExpert/article/details/81488503 在从Android 6.0源码的角度剖析Window内部机制原理文章中,我们详细剖析了Android Window的内部工作机制,了解到每一个Activity都对应着一个Window,Activity的视图(View)都是依附在Window来呈现的,Wind...原创 2018-08-11 13:36:17 · 2002 阅读 · 0 评论 -
从Android 6.0源码的角度剖析Window内部机制原理
转载请声明出处: 1. Window内部机制原理 WindowManager是用于与Window管理器交互的接口,它继承于接口ViewManager,可通过Context.getSystemService(Context.WINDOW_SERVICE)方式获取WindowManager的实例。ViewManager提供了三个操作Window的方法,即addView()、upd...原创 2018-08-04 21:32:47 · 1653 阅读 · 0 评论 -
Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调
Java中有两种类型:基本数据类型(int、float、char等)和引用类型(类、对象、数组等)。JNI定义了一个C/C++类型的集合,集合中每一个类型对应于Java中的每一个类型,其中,对于基本类型而言,JNI与Java之间的映射是一对一的,比如Java中的int类型直接对应于C/C++中的jint;而对引用类型的处理却是不同的,JNI把Java中的对象当作一个C指针传递到本地函数中,这个指针指向JVM中的内部数据结构,而内部数据结构在内存中的存储方式是不可见的,本地代码必须通过在JNIEnv中选择适当原创 2017-06-03 13:20:00 · 5487 阅读 · 0 评论 -
Android动画机制(1):帧动画、补间动画详解及实战演练
Android目前包含四种动画:Property Animation、View Animation、Drawable Animation、SVG,其中,属性动画被引入于Android 3.0,它可应用于任何对象;视图动画包含旋转、缩放、移动、透明度动画效果,但只适用于View;SVG矢量动画被引入与Android5.0,通过SVG可以创建更加丰富的动画效果。除了单独的给view增加旋转、移动、缩放、淡出淡入动画,Android还提供了<set../>标签属性实现几种动画的混合使用,该XML属性对应的Java原创 2017-03-05 22:44:01 · 1661 阅读 · 0 评论 -
使用Proguard混淆代码打造APP安全第一层防护
Java是一种跨平台的解释性语言,它的源代码编译成中间”字节码”存储于class文件中。由于跨平台的需要,Java字节码中包括了很多源代码信息,如变量名、方法名,它们被用来访问相关的变量和方法,而这些符号恰恰带有很多语义信息,极易被反编译成Java源代码从而造成开发的应用被轻松破解。为了防止这种情况,我们可以使用ProGuard实现对Java字节码进行混淆。所谓混淆,是指ProGuard将发布出去的程序进行重新组织和处理,它能够将代码中的所有变量、方法、类名转换为极为简短且无任何意义的英文字母,在缺乏相应函原创 2017-02-12 17:34:58 · 2607 阅读 · 0 评论 -
Android多媒体技术(二)浅析Camera视频实时采集中涉及的参数配置
视频中比特率又被称为码率,是指码率就是数据传输时单位时间传送的数据位数,单位是kbps即千位每秒(=1000*1bps)。它可以表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,比特率越高,传输数据就越大,音、视频的质量就越好,但编码后的文件就越大。常见的视频码率使用场景: * 16kbps:可视电话质量 * 128-384kbps:视频会议系统质量 * 1.25Mbps:VCD质量(使用MPEG1压缩) * 5Mbps:DVD质量(使用MPEG2压缩) * 8-15Mb原创 2017-01-20 15:28:21 · 9140 阅读 · 0 评论 -
探讨Android 6.0及以上新权限系统的检测与处理
从Google官方文档可知,Android系统升级到6.0后,它的权限系统被重新设计。相比原来新安装的APP系统会一次性授予所有权限和用户无法管理APP权限的不足,新的权限系统不再允许新安装的APP一次性获得所有权限,APP必须在运行时一个一个地询问用户授予权限,甚至有时候都不会主动申请用户授权,开发者不得不自己去检测和请求用户授予来获得权限。那么当我们的APP部署到Android 6.0以上系统的终端时,某些功能没有获得相关权限或者用户拒绝授予权限又会出现什么问题呢?原创 2016-11-25 10:41:42 · 9948 阅读 · 31 评论 -
使用RootTools实现对Android系统文件的读写
RootTools是一个辅助开发者开发Root应用的开源项目,可用于判断Android终端是否具有Root权限和执行shell命令。RootTools对相关的Root操作进行了深度封装,且对开发者提供了一个jar包(目前最新版:RootTools-4.2.jar),开发人员可以非常轻松的开发出拥有Root操作权限的应用。原创 2016-11-08 15:07:59 · 5238 阅读 · 0 评论 -
强大的数据库ORM框架-GreenDao项目构建篇(Eclispe平台)
GreenDao项目是一个非常优秀的数据库ORM框架,除了拥有高性能、低消耗、易于使用的APIs等优点,它对有关数据库的操作进行了深度封装,且是完全面向对象的。也就是说,你基本可以不与SQL语句打交到就可以非常方便、简单地实现对数据库的操作,当然,前提是你要熟悉如何去驾驭它~原创 2016-11-09 20:19:33 · 2310 阅读 · 0 评论 -
使用AccessibilityService实现APP的自动安装与卸载
平时在使用豌豆荚或者360手机助手下载软件时,我们可以设置软件静默安装和智能安装,这两种情况允许用户无需操作任何界面就能够实现软件的一键下载安装,用户体验大大提高。我们知道静默安装主要是针对于已经Root的手机,只需执行相关的shell命令即可实现,那么,智能安装又是怎么一回事呢?原创 2016-12-06 22:33:57 · 6817 阅读 · 0 评论 -
探讨一种新型的双进程守护应用保活
在高版本Android系统中,应用能否常驻内存,我想一直以来都是某些APP头疼的事情。虽然APP常驻内存对于用户来说比较”恶心”,但是在一些特殊情况来说,APP的常驻内存却有尤其重要,很多时候用户也会要求APP能够保证长久运行。因此,这里只研究APP应用在一些特殊场合的保活方法,内容仅供参考。原创 2016-12-06 11:53:18 · 22396 阅读 · 51 评论 -
探讨Android6.0及以上系统APP常驻内存(保活)实现-争宠篇
APP常驻内存(保活),旧事重提,距离上一次的研究亦有半年有余。最近,用户反馈说多进程守护方案在华为Mate8(7.0)保活效果不是很好,有时候还是不能及时收到消息,于是,又带着怀疑的眼光,重新找回原来的代码进行测试,顺便分析了市场上主流运动类APP保活方法(微信、手Q就算了,富人家的孩子,不具代表性),同时也对系统对内存中APP的管理规则进行了进一步探索。本文便是对最近一周的探索、学习、测试的总结之一,以备将来不时之需。原创 2017-07-13 11:36:28 · 37811 阅读 · 65 评论 -
从Android 6.0源码的角度剖析UI界面架构
大多数多原创 2018-07-30 23:26:15 · 2027 阅读 · 0 评论 -
LBS AR开发实录(1):手机位姿数据的实时获取
前言 1. 计算机视觉中的坐标系 计算机视觉中,有四大坐标系:世界坐标系、摄像机坐标系、图像坐标系以及像素坐标系。在了解它们之前,我觉得很有必要先学习下空直角坐标系和笛卡尔坐标系两大基础坐标系。 (1) 空间直角坐标系和笛卡尔坐标系 (2) 计算机视觉中的坐标系 图像坐标系 图像坐标系是以摄像机拍摄的二维照片为基准建立的坐标系,用于指定物体在照片中的位置,...原创 2018-05-18 18:20:35 · 10387 阅读 · 1 评论 -
OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测
上一篇文章OpenCV4Android开发实录(1):移植OpenCV3.3.0库到Android Studio大概介绍了下OpenCV库的基本情况,阐述了将OpenCV库移植到Android Studio项目中的具体步骤。本文将在此文的基础上,通过对OpenCV框架中的人脸检测模块做相应介绍,然后实现人脸检测功能。原创 2018-01-06 23:33:26 · 14237 阅读 · 37 评论 -
Android直播开发之旅(8):Android硬编解码接口MediaCodec原理剖析
转载请声明出处:http://blog.csdn.net/AndrExpert/article/details/79578149 在“AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)”一文中我们简单介绍了Android硬编解码接口MediaCodec的使用,本文将在该基础上对MediaCodec的基本工作原理和编解码过程进行剖析。1. MediaCod...原创 2018-03-16 10:53:51 · 7233 阅读 · 0 评论 -
Android Studio高级使用详解
由于AndroidStudio的基本使用网上资料非常之多了,今天就着重说下AndroidStudio中如何导入Eclipse工程和第三方库(.so、.jar)、如何将AS项目提交到GitHub远程仓库、克隆GitHub项目到AS以及NDK开发环境配置。原创 2017-05-28 23:54:04 · 3181 阅读 · 0 评论 -
Android直播开发之旅(1):视频直播YUV颜色格式完全解析
视频直播YUV颜色格式完全解析 --解决MediaCodec与Camera颜色空间不匹配导致的花屏、叠影等问题 作者: 蒋东国 时间: 2017年4月5日 星期三 ...原创 2017-04-05 18:02:26 · 9423 阅读 · 12 评论 -
浅析Android View内部工作原理及其实战
转载请声明出处:http://blog.csdn.net/andrexpert/article/details/77511996 在Android开发中,当我们需要显示用户交互界面时,通常的做法是创建一个继承Activity的类并重写它的onCreate()方法,再在该方法中调用setContentView()方法将布局界面显示出来。那么问题来了,setContentView方法具体做...原创 2017-08-23 21:31:36 · 3825 阅读 · 1 评论 -
探讨Android6.0及以上系统APP常驻内存(保活)实现-复活篇
随着AlarmManager唤醒、native进程拉起等方式的失效,APP常驻内存的时代将不复存在,尤其是当APP进程被杀死后,基本很难将其拉起。从用户的角度来讲,这是一种很好的发展,而这一切应该归功于谷歌和各大厂商不断追求良好的用户体验;从开发者的角度来说,尤其是即时通信类应用,这将是毁灭性打击。如果用户使用你的聊天软件,但在使用过程中总是不能及时收到对方的消息,那将是一种什么样的体验,因此,厂商"白名单"便应运而生了。正是因为如此,本文探讨的相关方案不可能保证在任何时候,或者任何机型能够唤醒,一切都是相原创 2017-07-15 17:02:42 · 27254 阅读 · 19 评论