1、https,如何避免Client和Server中间劫持?
客户端是如何校验证书的呢?这里发生在第三步,客户端接收到服务端的证书,里面主要包含公钥和签名。根据证书上的签发机构去浏览器内置的CA签发证书里面找到保存的证书公钥,而后用这个公钥解开签名,获得数字摘要(digest,证书内容的hash值),和服务端的证书进行对比验证。 因此https能够被拦截,可是不能被劫持。html
2、插件化hook IActivityManager采用什么代理方式?为何? hook IActivityManager是采用动态代理的方式。由于它并无一个具体的实现类,而是使用代理的方式。java
3、找车App白屏问题,内存泄漏
找车app是汽车之家主app里面很重要的一个模块,在无网络的状况下也须要可以展现默认数据。这些默认数据会在app第一次启动的时候须要序列化到数据库里面,因为在主线程作的会有一下子白屏。
须要把这个序列化放在后端作处理,这里我用AsyncTask,在后端去作处理。可是这里若是匿名内部类会有持有Activity的引用,这样若是退出Activity后台操做尚未处理完成,那么activity就无法被回收,会有内存泄漏问题。
这里使用静态内部类来解决这个问题,可是若是想要在onPostExecute里面去去处理调用activity的成员变量就变得不可能了,那么怎么办?这里用到弱引用,用弱引用保存当前Activity引用,那么久能够经过get获取到Activity了。react
4、HashMap的数据结构
(1)HashMap是链表的数组,是Entry的集合,Entry是队列也是健值对。在Java8的时候链表长度大于8则采用红黑树。程序员
5、为何HashMap线程不安全?算法
由于HashMap在put的时候有可能两个线程put一个hashCode相同的key,这个时候在相同的bucket上,A线程获取了链表的头节点;正好A的时间片用完了,切换到了B,B在这个节点头上挂了一个元素,在切换成A线程,A也直接把B给替换了,这样B线程的元素就丢失了。sql
resize会致使死循环链表。 综合上面两点,能够说明HashMap是线程不安全的。 ConcurrentHashMap在Java1.7采用的架构是segment+hashEntry+ReentrantLock。而在Java1.8中采用的是Node + CAS + Synchronized的结构。为何Java1.8的get操做不须要枷锁都能保证数据安全呢?那是由于在Java1.8的Node节点和value是volatile修饰,保证了线程的可见性。数据库
既然volatile修饰数组对get操做没有效果那加在数组上的volatile的目的是什么呢?
其实就是为了使得Node数组在扩容的时候对其余线程具备可见性而加的volatile后端
在1.8中ConcurrentHashMap的get操做全程不须要加锁,这也是它比其余并发集合好比hashtable、用Collections.synchronizedMap()包装的hashmap;安全效率高的缘由之一。数组
get操做全程不须要加锁是由于Node的成员val是用volatile修饰的和数组用volatile修饰没有关系。 数组用volatile修饰主要是保证在数组扩容的时候保证可见性。 www.cnblogs.com/keeya/p/963…promise
6、AsyncTask能够设置线程池吗? 能够的,经过excuteOnExecutor(Executor exec, Params... params)来设置线程
7、线程如何同步? join、wait/notify
9、有哪些跨进城的方式,底层是binder的算一种,能说说binder吗?
一、Intent跨进程访问别的Activity
二、ContentProvider的底层是采用 Android中的Binder机制
三、广播(Broadcast)
四、AIDL服务
五、文件
六、socket
Android Jetpack 一个有生命周期的可观察的数据持有者。
LiveData如何实现数据可观察: 其实LiveData的原理仍是订阅。从observe方法开始,注册owner,和Observer,把owner封装成LifecycleBoundObserver包装类,让这个监听者安全,即inactive的时候不回调。而后把这个包装类put进去课迭代的Map中。最后,更改数据都会走到setValue();这个方法把map里面的观察者遍历出来,挨个判断与之关联的owner是否是mActive,是就调用onChanged方法。
MutableLiveData 数据持有者的最简单的实现类
MediatorLiveData
能够合并多个Livedata的数据持有者
Transformations.map()
能够对数据流作一些链式操做的的方法,入加入一些数据
Transformations.switchMap() 能够根据条件选择监听那个数据持有者(LiveData) 看源码可知道,LiveData可被监听数据的变化的原理就是订阅。 里面维护着能够迭代的健值对数组
Lifecycle 和 LifecycleObserver ,让咱们作MVP的时候Presenter层能够完美和View分离开来。 Lifecycle源码解读 ViewModel是经过ViewModelFactory反射建立的,同时保存在ViewModelStore里面。
单例模式有几种写法?
AsyncTask的优缺点 优势:简单、好用,封装性好 缺点: 一、容易内存泄漏
二、AsyncTask是默认(execute())在线程池串行执行的,并无彻底发挥线程池的做用。能够经过setDefaultExcutor()设置本身的线程池,也能够经过execueOnExcutor()设置本身的线程池,达到并行的目的。
三、不少开发者会认为一个在Activity中建立的AsyncTask会随着Activity的销毁而销毁,事实并非,没有及时取消AsyncTask所带来的问题,AsyncTask.cancel()进行取消。
防止handler带来的内存泄漏: 一、弱引用(没有第二种好,由于Google说它的虚拟机不擅长处理非强引用的对象)
二、在onDestroy 移除消息
handler.removeMessages();
handler.removeCallbacksAndMessages();
Android系统架构 应用层 //应用
Framework层 //应用框架层 ContentProvider ViewSystem 各大Manager
Library层 Native C/C++ 一些三方库好比SQLite, WebKit OpenGL Android Runtime
HAL层 硬件层BlueTooth Audio Camera Sensors
Linux内核层 Linux kernel (BlueTooth Audio Camera)的驱动
若是开启多个页面,如何避免OOM?(目前还不知道,知道的请告知我) Okhttp设置支持https、封装缓存配置,封装get、post请求
Okhttp的缓存设置:
Okhttp是经过Cache对象来设置缓存路径和缓存大小的。以后经过读取后端数据的header的Cache-Control配置来决定多久更新数据。若是后弹没有设置能够本身配置缓存的CacheInterceptor。实现intercept方法,在里面给Response添加Cache-Control配置。固然个性化配置Okhttp还提供了CacheConCrol来个性化配置缓存过时时间。 www.2cto.com/kf/201611/5…
如何计算一张图片大小,Lrucache 加载一张本地资源图片,那么它占用的内存 = 1、图像占用空间的大小计算: 大小=分辨率位深/8 (位深: 一个像素所占的内存。) 分辨率=宽高(如:1024768,640480) 位深:如24位,16位,8位 /8计算的是字节数。
例如:
一幅图像分辨率:1024768,24位,则其大小计算以下: 大小=1024768×24/8=2359296byte=2304KB
二、显示的使用事务优化写操做,频繁的开闭IO是很耗性能的,用事务来提交多条语句,会先把数据缓存到系统中,而后再一次性提交更改到数据文件,此时数据文件的IO只须要开闭一次。大大提升性能。
三、使用索引提升查询效率。
四、查询尽可能只查询须要的信息
五、合理调整ContentValues容量,减小扩容次数。
六、提早获取索引,cursor.getColumnIndex放在循环外
Android虚拟机Dalvik和Art用什么算法来进行垃圾回收?
一、如何实现进程间通讯的总线订阅模式?
二、自定义控件的过程 www.jianshu.com/p/a5758c69e…
举例自定义GroupView:
一、重写onMeasure(),在方法里面迭代子View,而后调用measureChild,测量每一个字View的长度和宽度,计算。而后根据父View传来的建议宽高,和mode决定是否选择建议宽高仍是计算的,AT_MOST酒选择咱们计算的不然选择建议的,就是match_parent的意思。
二、重写onLayout,迭代子View,根据measure的宽高,调用child的layout来布局子View。
三、若是要在布局里面设置能够建立attr文件,在里面建立属性,而后在构造方法的attrs入餐获取用户传来的参数来作计算。
自定义View: 重写onDraw()方法,不要在里面作耗时长的操做,减小建立对象。不要在里面建立bitmap等大的对象在构造方法建立。
(1)以引用模块的方式调用原声方法RN->native: 自定义module类继承自ReactContextBaseJavaModule,重写getName,返回react层的调用名。 建立一个方法,方法里面使用@ReactMoudle,方法里面能够传Callback callback(或者Promise promise),来返回数据给RN。 在RN层使用NativeModules调用相应模块。示例: NativeModus.[ToastExample中getName的返回值].[ToastExample中的方法]来调用原生的方法
(2)原生调用RN native->RN:
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName,params); 再原生能够经过 DeviceEventEmitter.addListener('EventName',(msg)=>{});来注册监听。
六、requestLayout、invalidate、postInvalidate
通常来讲,若是View肯定自身再也不适合当前区域,好比说它的LayoutParams发生了改变,须要父布局对其进行从新测量、布局、绘制这三个流程,每每使用requestLayout。而invalidate则是刷新当前View,使当前View进行重绘,不会进行测量、布局流程,所以若是View只须要重绘而不须要测量,布局的时候,使用invalidate方法每每比requestLayout方法更高效。
postInvalidate与invalidate方法的做用是同样的,都是使View树重绘,但二者的使用条件不一样,postInvalidate是在非UI线程中调用,invalidate则是在UI线程中调用。
复制代码
接下来咱们分析postInvalidate方法的原理。 原文连接:blog.csdn.net/a553181867/…
一、另外一个进程的Service被杀死了,怎么知道? onStartCommand() 返回START_STICKY能够重启一次Service。
二、如何减小读取磁盘的次数
三、binder的原理,为何只须要拷贝一次。弄懂、用binder通讯一次。
四、用什么取代SharedPreferences跨进城同步数据?
SharedPreferences底层是经过读写XML来实现的,多进程并发显然是可能出问题的,因此SharedPreferences不支持多进程。能够用ContentProvider替代。经过ContentProvider对于数据的操做都是同步的,不过contentResolver.notifyChange通知是异步的。因此ContentProvider能够替代SharedPreferences。
五、
一、动态代理和静态代理的区别 静态代理类:由程序员建立或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理类:在程序运行时,运用反射机制动态建立而成。 blog.csdn.net/tb9125256/a…
不少东西不是会用就能够 了的,你要深刻去解剖它的原理,你须要了解的不是同样东西,而是一类东西。