- 博客(651)
- 收藏
- 关注
原创 【Android】【资源编译、打包】
整体架构通过AAPT(Android Assert Package Tool)对资源打包,打包前,大部分XML会被编译成二进制,这样可以减小体积与优化解析速度为了快速定位资源给每个非Asset资源一个id,他们定义在R.java 生成resources.arsc,即资源索引表,根据id描述资源相关配置所以着重关注XML资源编译过程 R.java生成过程 resources...
2019-08-27 22:12:54
718
原创 【Android】【框架】【编译】【Freeline】
整体架构1、核心原理热更新技术在编译期的应用,后期引用到了线上做热更新2、稳定性完善的基线对齐、进程级别异常隔离3、性能借鉴Buck多任务并发思想,端口扫描、代码扫描、并发编译、并发dx、并发merge dex,在多核机器上加速明显在class、dex、resource方面做了缓存优化buck加速dx、DexMerger、资源编译方面,深入改造AAPT流程4、具有能力多任务并...
2019-08-26 23:54:24
560
原创 【Android】【框架】【JSON】【fastjson】
整体架构fastjson和Gson的整体思路一致,实际上大多数语言解析库的思路都是差不多的,即抽象出一个写入写出的转换器,以及一个保存数据的容器而fastjson的不同之处在于,做了大量的算法优化,使得其解析性能远超其他JSON解析库SerializeWriterGson直接采用的是StringBuilder,fastjson基于JSON解析机制,定制了更适合JSON解析过程的...
2019-08-25 21:26:53
492
原创 【Android】【框架】【JSON】【Gson】
整体架构核心在于TypeAdapter,它定义了类型和字节之间的相互转换TypeAdapterpublic abstract class TypeAdapter<T> { public abstract void write(JsonWriter out, T value) throws IOException; public a...
2019-08-25 17:28:17
424
原创 【Java】【并发】【线程池】
什么是线程?可以从《深入理解JVM》得到参考线程是比进程更轻量级的调度单位,多个线程可以共享进程的资源,而其自身也有独立的资源主流OS都有其线程实现,而JVM中的线程更为轻量级,并且对不同硬件与OS做了兼容实现线程有3种方式有内核线程,由OS来调度由用户线程,由用户空间自己调度以及混合调度,目前JVM的线程应该是混合调度实现的为什么要有线程池?假如每个异步任务都要开启...
2019-08-24 19:49:04
323
原创 【Android】【框架】【EventBus】
整体架构一言以蔽之,观察者+反射当调用EventBus.getInstance().register(Object)的时候,把Object注册到一个容器里当调用EventBus.getInstance().postEvent(Event),然后找到接受对应Event的对象和方法,然后反射执行对应方法(method.invoke(Object))register流程...
2019-08-24 17:57:07
292
原创 【Android】【框架】【磁盘缓存】【MMKV】
优势我们通常用的是SP框架,它的get性能是很高的,因为做了内存缓存但是其commit、apply就不尽如人意了apply会入队任务,Activity、Broadcast、Service的生命周期会等待队列清空,引起ANR很多时候业务的实时性要求非常高,commit是必须采用的,但是SP的commit的性能是堪忧的,使用了后可以看到肉眼可见的卡顿图中可以看到MMKV和SP写性能的对...
2019-08-24 17:00:38
799
原创 【Android】【框架】【磁盘缓存】【SharedPreferences】
整体架构初始化的时候会加载整个XML到内存中作为内存缓存这也是不能跨进程的原因,任何东西只要做缓存那就是2套数据了,即使SP做了多进程措施也无济于事取:从内存取 commit:直接同步执行 apply:入队引起ANR的原因取是不会有ANR的,只需要在最初加载文件的时候读取一次即可,后续都是从内存去取commit直接在当前线程执行,虽说SP是轻量级的IO,但是至少也是I...
2019-08-24 13:40:18
398
原创 【Android】【框架】【RxJava】
本文探索2个方向发布/订阅机制的实现架构 如何实现的一行代码切换线程此外对于操作符的使用,我建议结合其他库一起学习,比如Retrofit+RxJava使用flatMap解决嵌套请求,比如结合Room、LifeCycle,比如RxBus发布/订阅Observable.create(new ObservableOnSubscribe<Integer>() { ...
2019-08-18 15:14:26
355
原创 【Android】【框架】【Jetpack】【Architecture】【WorkManager】
接入implementation "android.arch.work:work-firebase:1.0.0-alpha08"androidTestImplementation "android.arch.work:work-testing:1.0.0-alpha08"使用// 1、定义任务public class MyWorker extends Worker {...
2019-08-18 00:41:50
307
原创 【Android】【框架】【Jetpack】【Architecture】【Room】
接入implementation "androidx.room:room-runtime:2.1.0-alpha06"annotationProcessor "androidx.room:room-compiler:2.1.0-alpha06"使用// 1、定义实体,对应一张表@Entitypublic class User { @PrimaryKey ...
2019-08-17 23:59:16
258
原创 【Android】【框架】【Jetpack】【Architecture】【Lifecycle】
接入// 非 androidX 项目implementation "android.arch.lifecycle:runtime:1.1.1"annotationProcessor "android.arch.lifecycle:compiler:1.1.1"// androidX 项目implementation "androidx.lifecycle:lifecycle-run...
2019-08-17 22:25:07
198
原创 【Android】【框架】【Jetpack】【Architecture】【DataBinding】
依赖// module 的 build.gradle 中的 android 节点增加此代码android { dataBinding { enabled = true }}// gradle.properties 中增加此行android.databinding.enableV2=true使用// 1、对于布局文件 alt + en...
2019-08-17 20:08:34
232
原创 【Android】【框架】【Jetpack】【Architecture】【ViewModel】
依赖implementation "androidx.lifecycle:lifecycle-extensions:2.0.0" // ViewModel and LiveData使用public class User { public String name;}public class UserModel extends ViewModel { p...
2019-08-17 18:49:51
152
原创 【Android】【Framework】【ContentProvider】
学习自《Android进阶解密》http://gityuan.com/2016/07/30/content-provider/进程不存在client进程通过Binder向system_server进程发起请求 system_server检测到目标进程不存在,创建目标进程,此时system_server执行线程阻塞 目标进程bindApplication,instal...
2019-08-17 15:31:58
342
原创 【Android】【Framework】【Broadcast】
学习自《Android进阶解密》http://gityuan.com/2016/06/04/broadcast-receiver/注册静态注册由PMS来完成,图中是动态注册通过AMS,把当前进程的ApplicationThread、InnerReceiver对象的代理类,注册到system_server进程 把广播添加到ReceiverList,它继承自ArrayLis...
2019-08-17 14:51:15
331
原创 【Android】【Framework】【App启动】
学习自《Android进阶解密》http://gityuan.com/2016/03/12/start-activity/架构整体流程是点击Launcher启动目标Activity,先检查进程是否存在,不存在则向Zygote的Server Socket发起创建进程的请求,Zygote通过fork自身,创建新进程除了获取Zygote复制的虚拟机,还要创建Binder线程池和消...
2019-08-17 12:33:05
481
原创 【Android】【Framework】【系统启动】
学习自`《Android进阶解密》架构流程1、按下电源引导芯片代码固化在ROM,开始执行,加载BootLoader到RAM,开始执行2、BootLoader启动Linux3、Linux内核设置缓存、被保护存储器、计划列表、加载驱动这一系列完成后,寻找init.rc文件,启动init进程4、init进程初始化、启动属性服务解析init.rc、启动Zy...
2019-08-15 23:11:19
287
原创 【Android】【系统架构】
学习自《Android进阶解密》架构Framework层暴露给应用层的能力Activity Manager:管理各个应用生命周期,以及常用的导航回退功能 Location Manager Package Manager:管理所有安装的App Notification Manager Resource Manager Telephony Manager...
2019-08-13 23:36:16
361
原创 【Android】【稳定性】【ANR】【原理】【输入事件】
参考http://gityuan.com/2019/04/06/android-anr/http://gityuan.com/2017/01/01/input-anr/整体架构触摸屏幕的时候,Linux内核往设备节点写数据EventHub会监听设备节点文件InputReader无限循环,从EventHub中读取事件,加工后把事件放入InputDispatcher队列In...
2019-08-11 21:01:52
609
原创 【Android】【架构】【微信模块化】
学习自https://mp.weixin.qq.com/s/6Q818XA5FaHd7jJMFBG60w早期架构的弊端1、进程膨胀,容易被杀,导致推送不及时2、65535、LinearAlloc3、功能增多,原有架构上开发难以维护组件化重构拆分出了简单的组件化但是之前交互都是通过事件总线进行交互,基类就定义了大量的Event而且每次模块交互,比如数据结构...
2019-08-11 16:24:53
418
原创 【Android】【架构】【美团猫眼模块化】
学习自https://mp.weixin.qq.com/s/kd3VUJkQLAcyjvkaDGKhng?tdsourcetag=s_pctim_aiomsg背景美团猫眼lib需要移植到团App、点评App这里希望底层服务使用宿主App的(服务:网络库,缓存库,下拉刷新...)于是每次调用到这些服务的时候,面向接口所有的接口实现类,需要写进一个配置类使用这个lib的时候,...
2019-08-11 14:28:39
439
原创 【Android】【架构】【Atlas】
包结构其整体包结构和正常Apk包结构类似区别在于armeabi中存放大量的so,每个so都是APK转过来的,作为一个单独的bundle打包流程项目架构可以看到架构很通俗,就和正常的组件化架构类似底层存放功能库业务组件的交互通过底层来实现Atlas架构系统能力扩展 Bundle管理,复杂加载Bundle,并暴露其生命周期 Bu...
2019-08-11 12:07:54
1098
原创 【Android】【架构】【页面】【MVC、MVP、MVVM】
架构分类首先明确一点,MVC、MVP、MVVM是页面架构,把一个页面,分成几个部分管理,然后这几个部分进行交互此外还有项目架构,比如组件化;还有模块架构,负责模块内部的解耦、通信机制MVC其思想是,拆分数据,拆分UI,同时设计一个中介层进行交互MVP和MVC最大的不同是,V和M不能直接交互此外,你可以用2种方式进行思考:1、V是事件的出发点当你处理...
2019-08-11 01:12:01
362
原创 【Android】【架构】【美团外卖平台化】
背景美团外卖有多个流量入口,外卖App,美团App,微信小程序等其中外卖作为美团App的一个频道接入,其功能和外卖App大体相似早期由2个团队维护,如果可以由一个团队维护,人力成本就可以下降一半,这是极其重要的所以平台化可以理解为App融合技术,一份代码,多平台运行我所在的部门同样有2个功能相似的App,存在不少的两端代码拷贝问题,所以学习此文希望可以从中得到借鉴早期失败尝试...
2019-08-10 23:09:25
1348
原创 【Android】【Handler】
架构最简单的一幅图即可阐述其机制:子线程可以给队列增加元素主线程无限循环,从队列中取元素一旦主线程没有取到,会通过epoll多路复用机制阻塞而子线程在给队列增加元素的时候,会通过epoll callback唤醒阻塞中的主线程为什么要有Handler?// 点击的时候,在子线程更新UI,会报错@Overridepublic void onClick() { ...
2019-08-10 21:21:15
211
原创 【Android】【框架】【性能】【监控】【内存】【LeakCanary】
架构原理:检测最核心的点在于JVM的一个特性:当检测到某对象可以被GC,并且它有WeakReference,会把此对象放入WeakReference的ReferenceQueue中这个ReferenceQueue是可以外部传入的,所以新建WeakReference的时候,给所有WeakReference传入的都是公共的一个ReferenceQueue同时对于每个WeakRef...
2019-08-09 23:33:30
370
原创 【Android】【框架】【网络】【OkHttp】
使用1、接入implementation 'com.squareup.okhttp3:okhttp:3.10.0'2、使用// OkHttpClient初始化,全局仅需初始化一次OkHttpClient okHttpClient = new OkHttpClient();// 构建请求final Request request = new Request.Builde...
2019-08-06 00:10:38
257
原创 【Android】【框架】【网络】【Retrofit】
使用1、接入 compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:retrofit-converters:2.3.0' compile 'com.squareup.retrofit2:retrofit-adapters:2.3.0' compile...
2019-08-04 21:46:59
313
原创 服务器搭建
最近要写推送后台,记得第一次配置Linux服务器的时候很烦,而且推送后台不是那么好写。所以拖了很久。但是没想到找到了对的攻略,搭起来很快;推送后台也有了解决方案。搭服务器1.购买阿里云ECS,系统是CentOS7.3,开通端口2.所需软件:XShell-操作Linux服务器、WinsCP-可视化操作服务器文件3.所需环境:MySQL,Java,Tomcathttps://...
2019-04-18 22:14:02
510
原创 数据库索引
学习自https://blog.csdn.net/weiliangliang111/article/details/51333169 索引是怎么工作的?比如某个表上,有这样的一列,user_name user_name------------alibababaidutencent 如果 想找tencent,太慢了 ,需要一个个 检索,检索 最后一条或...
2018-07-28 17:17:24
390
原创 数据库之select时取别名
怎么取别名?select列名 as 列别名,//方法1列名 列别名,//方法2from表名;这两种取别名方法是所有数据库通用的 取了别名后返回的字段是如何的?如果你在写应用的时候,把取到的东西放在了Map中,那么你的获取方式是Map.get(列别名)。但是你要注意有些数据库是默认转换成大写的,有些不会。所以取别名的时候,最好给别名设置成大写。 取别名...
2018-07-28 13:00:51
16156
原创 类加载机制
学习自https://www.cnblogs.com/ldq2016/p/9035649.html ---内存区域 共享1.堆2.方法区:运行时常量池,Class对象 私有1.Java方法栈2.Native方法栈3.PC ---类加载机制 加载类的全限定名——>二进制字节流——>字节码——>Class对象(加...
2018-07-28 00:26:34
322
原创 自定义 类加载器
学习自https://blog.csdn.net/seu_calvin/article/details/52315125 为什么需要自定义类加载器?1.代码安全把自己的代码加密,然后自定义类加载器的时候解密2.支持多来源比如类在云端,可以自定义类加载器到某个url里下载 双亲委托模型是怎么工作的?protected Class<?> loadC...
2018-07-28 00:17:43
565
原创 责任链模式
写一个项目,功能模块需要拆分其实 责任链,他的每一个 链节,其实就是不同的功能,只不过比之于正常的写项目的 功能拆分,他的功能是有依赖性的。比如okhttpResponse getResponseWithInterceptorChain() throws IOException { List<Interceptor> interceptors = new Arra...
2018-07-27 22:39:17
391
原创 final关键字的一些作用
本文本不想写,为了第4点而写 1.父类不可被继承2.父类方法不可被重写3.final提升基础数据类型到运行时常量池里4.方法中,final指向的东西,匿名内部类也可以进行访问 第四点重点讲一下void test(final Object o) { new Thread(new Runnable() { @Override p...
2018-07-27 15:48:46
509
原创 进程和线程的区别
面试的时候 不能一句话概括:1.前者资源单位,后者CPU单位需要多讲一下它们之间的区别 2.进程开销太大进程有独立的、隔绝的地址空间,系统维护的开销很大;我们不能想要并发地执行一个功能就要开启一个新的进程,所以就有了线程;线程是共享进程的地址空间的,其创建、上下文切换的开销都很小 3.通信线程的通信简单的多,因为共享了地址空间;进程是隔绝的(为了一个进程crash不影响...
2018-07-27 15:11:25
276
原创 Fragment的一些注意事项
其实本不想写此文 不符我深的特点 但是连续两个面试官都问了我Fragment的创建方式 我觉得得写一下了 顺便扩充一些其他的知识 1.Fragment的3种创建方式(连续2个面试官问过)new(有些喜欢你说newInstance的)静态在xml中创建,本质还是和正常View一样,反射(这个我漏回答两次!!!)Fragment.instantiate,本质也是反射 2.F...
2018-07-27 14:25:13
266
原创 程序计数器、指令寄存器的区别
学习自https://blog.csdn.net/legend_x/article/details/19619327 DR 数据寄存器IR 指令寄存器PC 程序(指令)计数器 一条指令分为 操作+地址 在执行一条指令的时候,先把指令存内存取到DR,然后再取到IR,然后再交给指令译码器来转换指令,再向操作控制器发出对应的信号为了保证程序的顺利执行,所以才 需要...
2018-07-27 00:08:45
10845
3
原创 TCP 3握4挥
学习自https://mp.weixin.qq.com/s/yH3PzGEFopbpA-jw4MythQ 文中出现的问题是TCP 3握 完成,但是服务端响应不到这个连接,这一点在程序启动的时候尤其明显(判断出现这个问题的现象:client的56911端口 established,但是server没有对应连接) 推断出accept队列满了(这里还有点深奥,后面细讲)...
2018-07-26 21:04:02
474
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人