android相关
依生依世
ここを始め、世界に痛みを感じさせよ
展开
-
增量Lint检测实现原理
增量Lint检测实现原理一.基本思路二.实现1.自定义LintClient2.增量检查文件3.其他自定义类4.自定义Gradle插件在Lint实现原理里已经知道,Lint检测的文件,默认是Project的javaSourceFolders和resourceFolders,但是这样会造成每次Lint检测的时间很长,我们pipeline的效率就很低;所以我们设想要做到一种增量检查:每次只检查改动的文件一.基本思路我们先回顾一下获取要检测文件的方式:val files = project.subseti原创 2020-12-15 16:19:34 · 1044 阅读 · 3 评论 -
Lint实现原理
Lint实现原理一.LintTask二.LintOptions配置1.创建2.配置3.获取三.Lint执行触发ReflectiveLintRunnerLintGradleExecutionLintGradleClient(extends LintCliClient)四.Lint规则定义DetectorRegistry五.Lint检测流程Scopeanalyze()1.解析自定义规则2.解析所有Detector3.Lint规则检查(1)AndroidManifest.xml(2)Resource .xmli.原创 2020-12-14 22:07:01 · 1719 阅读 · 0 评论 -
Android Studio 插件开发实战
Android Studio 插件开发1.搭建IntelliJ IDEA开发环境2.配置插件项目3.开发插件4.发布和安装插件AndroidStudio中有许多插件,比如生成set/get方法、生成toString方法等,这些插件可以辅助我们进行快捷的开发。我们也可以自己开发插件,比如我们想在一个model类中,自动生成所有private变量的get方法,当然AndroidStudio自带插件已经支持了,这里我们只是以这个例子为入手点,看下如何开发一个IDE插件。1.搭建IntelliJ IDEA开原创 2020-05-25 19:24:18 · 1401 阅读 · 0 评论 -
Android Lint基本使用和自定义规则
Android Lint基本使用和自定义规则一.基本使用1.gradle配置2.指定规则3.执行Lint检测i.实时检测ii.手动检测iii.Gradle命令行执行二.自定义规则1.lint_rules(1)引入依赖(2)定义规则i.需要检测的方法名ii.检测指定方法的调用iii.规则配置(3)注册规则(4)生成jar包2.如何使用jar3.lint_aar4.assemble运行时检测三.调试自定义规则1.运行目标项目的gradle命令2.开启lint项目的debug模式四.检测时机一.基本使用1.g原创 2020-05-25 19:11:48 · 3313 阅读 · 2 评论 -
RxJava2.0 源码剖析
RxJava2.0 源码剖析一.Observable(被观察者/发射器)二.Subscribe(订阅事件)三.Observer(观察者)这里我们先以一个最基础的使用case,来分析RxJava的实现原理。Observable.create(ObservableOnSubscribe<Int> { emitter -> (1..3).forEach { emitter....原创 2019-12-26 21:53:54 · 249 阅读 · 0 评论 -
Android AnnotationProcessor
Android AnnotationProcessor一.项目结构二.定义注解三.实现注解处理器(一)依赖(二)注解处理器(三)处理注解四.使用注解处理器(一)依赖(二)使用注解(三)生成的代码五.注意事项注解处理器通常可以用在模块间解藕、自动生成代码等地方,比如router路由或者butterknife。效果就是我们在某些地方标注某些注解,在编译时,注解处理器会扫描这些注解的地方,然后生成一些...原创 2019-12-26 20:59:42 · 5985 阅读 · 0 评论 -
Android Locale语言设置
Android Locale语言设置一.系统设置二.应用级设置(一)更新Locale1.updateConfiguration2.createConfigurationContext(二)获取Locale(三)Locale.getDefault()(四)WebView的坑三.实践Android系统支持多种语言的切换,可以是系统级别的,也可以是应用级别的。一.系统设置系统语言的设置在手机设置页...原创 2019-12-26 17:34:02 · 7496 阅读 · 1 评论 -
Android App Bundle
Android App BundleAABAPKSDynamic Feature ModuleAndroid 5.0以下设备注意事项Android项目中会有针对不同设备的资源文件,比如根据分辨率不同,drawable会分为drawable-ldpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等文件夹;根据系统版本不同,layout会分为layout-...原创 2019-12-26 17:22:45 · 1317 阅读 · 0 评论 -
Android R文件生成
Android R文件生成AAR主工程Android在打包时,通过AAPT工具,对主工程和引入的依赖里的所有资源文件进行编译压缩,并会对res/里的资源文件如drawable、layout、values等生成唯一的id,同时生成R.java文件,保存所有的id值,以及生成resource.arsc文件,建立id对应资源的值(如string)或文件路径(如png)的关系表。如上图是我们apk中...原创 2019-12-26 16:36:37 · 5472 阅读 · 0 评论 -
Android 8.0/8.1 screenOrientation适配
Android 8.0/8.1 screenOrientation适配一.问题二.原因1.Android 8.02.Android 8.13.Android8.0以下和Android9.04.总结三.解决1.设置targetSdkVersion为26及以下2.修改Activity的style3.修改Activity的screenOrientation一.问题在适配完Android9.0,即ta...原创 2019-08-01 10:29:57 · 1703 阅读 · 1 评论 -
Android 6.0 View行为变更适配
Android 6.0 View行为变更适配一.相关知识参考二.异常现象分析(一).正常情况(二).异常情况(三).异常行为分析1.为何ScrollView滑动不上去了,而RecyclerView可以自己滑动2.为何RecyclerView的高度发生改变3.UNSPECIFIED的size如何影响RecyclerView测量4.UNSPECIFIED的size为何不为0(1)6.0之前的Scrol...原创 2019-08-01 11:33:05 · 446 阅读 · 0 评论 -
AspectJ 使用及原理
AspectJ 使用及原理一.简介二.原理三.使用(一)基本概念1.连接点(JoinPoint)2.切点(PointCut)3.插入逻辑(Advice)4.切面(Aspect)(二)类型匹配表达式1.注解2.修饰符3.返回值4.类5.方法名6.方法参数7.组合使用(三)切入点组合表达式1.call/execution2.this3.target4.within5.args6.注解支持7.组合使用8...原创 2019-08-01 15:08:57 · 5681 阅读 · 0 评论 -
ReactNative For Android 之二:基本组件和API
ReactNative For Android 之二:基本组件和API一.基本组件1.DrawerLayoutAndroid2.Image3.ListView4.Navigator5.ProgressBarAndroid6.PullToRefreshAndroid7.ScrollView8.TextInput9.ToolbarAndroid10.ViewPagerAndroid11.Touchab...原创 2019-08-01 18:06:56 · 628 阅读 · 0 评论 -
Android 8.0/8.1 channel适配
Android 8.0/8.1 channel适配一.背景二.问题三.原因8.0系统源码8.1系统源码四.解决一.背景Android 8.0(target=26)的适配中,有一个关于Notification的适配点:8.0开始使用Notification时候,需要指定一个渠道channel,用来将不同的通知类型分类管理,通常我们的代码会如下处理//service.startForegroun...原创 2019-08-01 10:16:01 · 5584 阅读 · 1 评论 -
Android 9.0适配
Android 9.0适配一.新功能1.WiFi RTT室内定位2.刘海屏支持(1)调试(2)页面的刘海使用模式(3)刘海相关API(4)适配方式3.解码图片4.动画二.所有应用的变更1.访问受限2.非SDK接口访问限制3.安全行为变更4.UTF解码5.xt_qtaguid文件访问6.FLAG_ACTIVITY_NEW_TASK7.屏幕旋转8.相机枚举三.目标(target)API28的变更1.前...原创 2019-08-01 10:08:26 · 1724 阅读 · 0 评论 -
Android launchMode的特殊行为
Android launchMode的特殊行为1.被其他app调起时,launcheMode的行为2.点击Home键,再点击app图标,回到app的行为1.被其他app调起时,launcheMode的行为被调起的app如果没有初始化,那么Application一定会被初始化,且一定为新的进程如果launceMode是standard或者singleTop的,那么Activity是在当...原创 2019-07-31 19:42:45 · 192 阅读 · 0 评论 -
Android View位置跳动问题
Android View位置跳动问题有时我们会遇到当页面刷新后,类似NestedScrollView和RecyclerView这种可滑动View的滚动位置会变化一下,和原先不一致通过调试我们发现,是因为页面里有RecyclerView这种可以获取焦点的View,跟踪代码得知,当这种View的一些flag属性变化时:如Visibility、focusable、enable等,会尝试去re...原创 2019-07-31 19:34:46 · 840 阅读 · 0 评论 -
Android View 获取焦点
Android View 获取焦点有时我们需要某些View获取焦点,比如EditText获取焦点弹出键盘,我们有以下几种方式可以做到1.在页面初始化的时候调用view.requestFocus()override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ...原创 2019-07-31 19:26:52 · 3325 阅读 · 0 评论 -
Android AppBarLayout吸顶位置错误问题
Android AppBarLayout吸顶位置错误问题我们通常会用AppBarLayout来做一些复杂滚动和吸顶的效果,比如如下代码:<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.and...原创 2019-07-31 19:22:01 · 1970 阅读 · 0 评论 -
Android 代理拦截系统层代码
Android 代理拦截系统层代码一.手动代理1.溯源2.手动代理二.动态代理1. 溯源2. 动态代理有时我们的项目会遇见如下所示的崩溃堆栈:android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() at android.ap...原创 2019-08-06 11:31:10 · 651 阅读 · 0 评论 -
Javassist使用
Javassist使用一.简介二.使用(一)class1.获取2.新建3.内部类4.更新(二)constructor1.获取2.新建3.修改方法体(1)insertBefore/insertAfter(2)setBody(3)修饰符(三)field1.获取2.新建3.setter/getter(四)method1.获取2.新建3.setter/getter(五)参数使用(六)static1.获取2...原创 2019-08-01 15:51:50 · 1678 阅读 · 0 评论 -
Android Gradle 使用
Android Gradle 使用一.Gradle(一)简介(二)项目结构(三)基本概念(四)脚本执行过程1.配置阶段2.执行阶段二.Task(一)创建(二)定义执行代码1.配置阶段代码2.doFirst3.doLast(三)配置1.property2.configure3.Project的配置(四)Task依赖关系(五)自定义Task1.Task的类型2.自定义Task三.Plugin(一)定义...原创 2019-08-01 16:39:27 · 420 阅读 · 0 评论 -
Android View 绘制流程之三:draw绘制
Android View 绘制流程之三:draw绘制一.draw方法的整体流程二.drawBackground实现三.onDraw四.dispatchDraw的实现五.ScrollBar的绘制draw()方法是View系统测绘流程的最后一步,就是绘制,当view测量完大小、确定完位置后,就需要在其位置处绘制出其内容等视觉上的东西;View的draw方法有固定的流程,一般ViewGroup需要在d...原创 2019-07-29 19:13:30 · 3609 阅读 · 1 评论 -
Android SharedPreferences实现原理
Android SharedPreferences实现原理一.简介二.实现原理1.创建2.取值3.更新4.应用(1)commit()(2)apply()三.总结一.简介在Android中,我们通常会需要存储一些数据,有一些大型的数据诸如图片、JSON数据等,可以通过读写File的方式实现;有一些大量级的关系型数据,可以通过数据库SQLite实现;还有一些简单的、无安全风险的键值对数据,可以通过...原创 2019-09-03 19:11:40 · 2067 阅读 · 0 评论 -
ReactNative For Android 之六:组件生命周期
ReactNative For Android 之六:组件生命周期一.周期方法二.基本流程一.周期方法getDefaultProps:在组件类创建的时候调用一次(一般app启动时会加载组件类),里面返回的对象是定义的props的初始值,没有被覆盖时就是用这个默认值;返回的props对象是该组件的props(共用内存空间),每次用到该组件都有这些props的默认值;不能通过thi...原创 2019-08-01 19:16:47 · 249 阅读 · 0 评论 -
ReactNative For Android 之五:自定义module
ReactNative For Android 之五:自定义module一.创建自定义module类二.创建自定义的Package三.JS中调用四.回调方法和native主动发送消息1.回调方法2.native主动发送消息JS是如何调用到native的特性的,可以通过定义自定义Module和自定义的Component来定义模块和组件在JS中使用,这里以模仿ToastAndroid的组件的功能To...原创 2019-08-01 18:44:42 · 580 阅读 · 0 评论 -
ReactNative For Android 之四:自定义组件
ReactNative For Android 之四:自定义组件一.自定义View二.添加到自定义package三.JS中调用四.native事件的处理ReactNative已经包含很多常用控件,并在持续更新,但仍然不可能包含全部控件,比如很多第三方的已经我们自定义的控件,不过提供了方法让我们将想使用的控件包装到RN里,就可以在js中使用了,android里常用的Button RN没有包含(有别...原创 2019-08-01 18:36:18 · 520 阅读 · 0 评论 -
ReactNative For Android 之三:工程结构
ReactNative For Android 之三:工程结构一.目录二.入口三.入口文件四.创建组件(参考上面例子)一.目录初始化项目后会自动带有android文件夹:android项目文件夹ios文件夹:ios项目文件夹node_modules:源码index.android.js:android的js入口文件index.ios.js:ios的js入口文件...原创 2019-08-01 18:25:59 · 223 阅读 · 0 评论 -
ReactNative For Android 之一:环境搭建
ReactNative For Android 之一:环境搭建一.ReactNative官方文档二.环境搭建三.调试四.升级版本一.ReactNative官方文档英文:https://facebook.github.io/react-native/docs/getting-started.html中文:http://reactnative.cn/docs/android-setup....原创 2019-08-01 17:46:16 · 273 阅读 · 0 评论 -
Android Gradle Transform使用
Android Gradle Transform使用一.概述二.使用(一)引入(二)API1.QualifiedContent2.TransformInput3.TransformOutputProvider4.TransformInvocation5.ContentType6.SCOPE7.TransformManager8.Transform(三)使用流程1.添加至构建2.构建流程3.tran...原创 2019-08-01 17:02:45 · 1842 阅读 · 0 评论 -
Android Gradle插件断点调试
Android Gradle插件断点调试一.配置命令行参数二.配置debug三.运行调试有时我们需要调试gradle插件来解决问题,比如我们写了一个gradle插件的项目,还有一个引用该插件的项目,需要在编译该项目时断点调试插件项目的流程,应该怎么办呢?一.配置命令行参数在我们执行项目的某个gradle命令时,后面加上-Dorg.gradle.daemon=false -Dorg.gradl...原创 2019-08-01 16:43:21 · 1377 阅读 · 0 评论 -
Android 添加系统级窗口
Android 添加系统级窗口1.通过WindowManager可以添加一个系统层的window,覆盖在整个屏幕的最上层,可以用来实现悬浮窗、覆盖层等功能,但是不同android系统行为不一致系统版本type权限<23(6.0)TYPE_SYSTEM_ALERT不需要23~25(7.1)TYPE_SYSTEM_ALERTSYSTEM_ALERT_WIN...原创 2019-07-31 18:22:00 · 1188 阅读 · 0 评论 -
Android View clipChildren属性
Android View clipChildren属性ViewGroup的clipChildren属性,决定其children是否要绘制超过其区域的部分默认为true:意为裁剪children,如果children边界超出parent,则会被裁减掉不显示,和正常一样设置为false:如果设置该属性的ViewGroup-A,其有一个ViewGroup的child-B,那么B的chil...原创 2019-07-31 18:10:52 · 465 阅读 · 0 评论 -
Android RecyclerView 原理解析
Android RecyclerView 原理解析一.模块分析1.列表控件2.LayoutManager3.Recycler回收机制二.View布局流程分析1.LinearLayoutManager的onLayoutChildren()方法2.fill()方法3.recycleByLayoutState()4.layoutChunk()三.滚动时view的展示与复用1.拖动滚动2.Fling滚动3...原创 2019-07-30 17:49:08 · 3691 阅读 · 0 评论 -
Android Retrofit 原理解析
Android Retrofit 原理解析一.基本使用二.源码分析1.Retrofit.Builder构建参数2.可配置项(1)CallFactory(2)ConverterFactory(3)CallAdapterFactory(4)CallbackExecutor3.Retrofit.create动态代理生成请求对象4.ServiceMethod(1)创建(2)解析方法注解(3)解析参数注解(...原创 2019-07-30 16:23:32 · 3254 阅读 · 0 评论 -
Android RoboGuice使用
Android RoboGuice使用一.注入顺序及使用地方:二.布局,控件:三.资源(anim,string,drawable,etc):四.系统服务:五.普通java类:六.单例模式:七.Service和broadcastReceiver:八.Logging(和Log差不多):九.自定义view:十.Event Listener:一.注入顺序及使用地方:Robo(Fragment)Ac...原创 2019-07-30 16:05:56 · 272 阅读 · 0 评论 -
Android Support包版本变更记录
Android Support包版本变更记录版本新增特性行为修改过期APIbug修复适配点24.0.0Fragment增加commitNow方法支持同步添加到FragmentActivity中如将原有commit方式改为commitNow方法添加Fragment,需要进行全回归测试其行为24.0.1Fragment.setUserVisibleHi...原创 2019-07-30 11:47:26 · 447 阅读 · 0 评论 -
Android ViewDragHelper使用及原理
Android ViewDragHelper使用及原理1.初始化2.拦截事件处理3.拖动事件处理(1)拖动(2)释放(3)滚动ViewDragHelper类,是用来处理View边界拖动相关的类,比如我们这里要用的例子—侧滑拖动关闭页面(类似微信),该功能很明显是要处理在View上的触摸事件,记录触摸点、计算距离、滚动动画、状态回调等,如果我们自己手动实现自然会很麻烦还可能出错,而这个类会帮助我们...原创 2019-07-30 10:57:11 · 784 阅读 · 0 评论 -
Android View 触摸机制
Android View 触摸机制一.接收触摸事件开始派发二.根view派发触摸事件三.ViewGroup派发触摸事件四.View派发触摸事件五.onTouchEvent()六.多点触摸1.基本概念2.PointerId、PointerIndex概念及多点触摸相关方法3.多点触摸相关实现(1)维护targets列表(2)根据需要的pointerId拆分MotionEvent进行派发(3)如何进行拆...原创 2019-07-29 19:54:26 · 669 阅读 · 0 评论 -
Android View 绘制流程之四:绘制流程触发机制
Android View 绘制流程之四:绘制流程触发机制一.View状态的改变(包括Background的drawable状态改变)1.setEnable()2.setPressed()3.setSelected()4.refreshDrawableState()二.View焦点的改变1.findFoucs()2.getFocusedChild()3.hasFocus()/hasFocusable...原创 2019-07-29 19:28:36 · 2000 阅读 · 0 评论