2021-07-29 01:48:04
一个线程中执行的任务如何确保顺序执行
使用同步机制:通过synchronized关键字或ReentrantLock确保任务按顺序获取锁,避免并发执行。
单线程执行器:利用ExecutorService的SingleThreadExecutor,所有任务由单一线程串行处理。
任务队列:将任务按顺序加入队列(如BlockingQueue),线程从队列头部依次取出执行。
Binder无参调用如何知道Client是谁
Binder线程池与线程跟踪:Binder驱动为每个Client连接分配唯一线程,Server端通过Binder.getCallingUid()或Binder.getCallingPid()获取调用方身份。
Token机制:Client在调用前传递唯一Token,Server端通过Token反向查询Client信息。
ANR是如何分析的
日志分析:通过traces.txt文件定位主线程阻塞位置,结合logcat中的ANR日志(如Input dispatching timed out)。
工具辅助:使用Android Studio的Profiler或systrace监控主线程耗时操作,或通过adb pull /data/anr/traces.txt提取日志。
中教云API设计:访问所有指定类型文件
统一接口设计:定义通用接口(如List<File> getAllFilesByType(String type)),内部通过文件扩展名或MIME类型过滤。
文件扫描策略:递归遍历目录,使用File.listFiles()结合过滤器(FilenameFilter)筛选目标文件。
TCP三次握手与四次挥手
三次握手:
Client发送SYN包(seq=x)到Server。
Server回复SYN+ACK包(seq=y, ack=x+1)。
Client发送ACK包(ack=y+1),连接建立。
四次挥手:
Client发送FIN包(seq=u),进入FIN_WAIT1状态。
Server回复ACK包(ack=u+1),进入CLOSE_WAIT状态。
Server发送FIN包(seq=v),进入LAST_ACK状态。
Client回复ACK包(ack=v+1),连接终止。
线程死锁
死锁条件:互斥、占有并等待、非抢占、循环等待。
预防方法:按固定顺序获取锁、使用tryLock超时机制、避免嵌套锁。
实现O(1)复杂度的LRU
哈希表+双向链表:哈希表存储键值对,双向链表维护访问顺序。访问时移动节点至头部,淘汰时直接删除尾部节点。
DNS解析域名访问网站过程
浏览器查询本地DNS缓存,未命中则向配置的DNS服务器(如ISP的DNS)发起递归查询。
DNS服务器查询根域名服务器,获取顶级域(如.com)的NS记录。
继续查询顶级域服务器,获取权威域名服务器(如example.com的NS记录)。
权威服务器返回域名对应的IP地址,浏览器发起HTTP请求。
进程与线程的区别
资源分配:进程是资源分配的基本单位,线程共享进程资源(如内存、文件句柄)。
切换开销:进程切换需保存完整上下文,线程切换开销更小。
通信方式:进程间通信(IPC)需通过内核(如管道、Socket),线程间可直接共享内存。
死锁的概念与预防
概念:多个线程因竞争资源陷入无限等待状态。
预防方法:破坏死锁条件(如资源有序分配、超时释放)。
onNewIntent调用时机
SingleTop模式:Activity位于栈顶时,重复启动不会创建新实例,直接调用onNewIntent()。
SingleTask模式:Activity存在于栈中时,系统将其移至栈顶并调用onNewIntent(),清除其上所有Activity。
RecyclerView区分Header和Footer
自定义ItemType:在onCreateViewHolder中根据viewType返回不同ViewHolder(如TYPE_HEADER=0、TYPE_ITEM=1)。
布局分离:通过getItemViewType(position)判断位置,加载对应布局文件。
跨进程通信方式
Binder:Android原生IPC机制,基于C/S架构。
Socket:支持跨网络通信,但性能较低。
ContentProvider:用于数据共享(如联系人、媒体库)。
Broadcast:通过Intent发送广播,需注意权限控制。
HashMap底层原理与线程安全
原理:数组+链表(Java 8后引入红黑树),通过hash(key)%length定位桶位置。
不安全原因:多线程扩容时可能导致链表成环(如Java 7的transfer方法)。
线程安全方案:使用ConcurrentHashMap(分段锁或CAS+synchronized)或Collections.synchronizedMap。
HTTP与HTTPS区别
安全性:HTTPS通过SSL/TLS加密数据,防止中间人攻击。
端口:HTTP默认80,HTTPS默认443。
证书:HTTPS需CA签发的数字证书验证服务器身份。
安卓安全机制
权限系统:声明式权限(AndroidManifest.xml)与运行时权限(Android 6.0+)。
沙箱机制:每个应用运行在独立Dalvik/ART实例中,数据隔离。
代码签名:APK必须使用开发者证书签名,确保代码完整性。
ART虚拟机
AOT编译:安装时将DEX字节码编译为本地机器码,提升运行效率。
垃圾回收优化:采用并发标记-清除算法,减少STW(Stop-The-World)时间。
安卓启动流程
BootLoader阶段:加载内核和初始化硬件。
Kernel阶段:启动内核,挂载根文件系统。
Init阶段:解析init.rc脚本,启动Zygote进程。
Zygote阶段:预加载类与资源,孵化SystemServer进程。
SystemServer阶段:启动Binder线程池、PackageManagerService等核心服务。
Linux启动模型
SysVinit:基于脚本的串行启动,通过/etc/inittab定义运行级别。
Systemd:并行启动服务,依赖关系通过单元文件(.service)定义。
网络安全性与密钥验证
TLS握手:通过数字证书验证服务器身份,使用非对称加密交换对称密钥。
证书链验证:客户端验证证书是否由受信任CA签发,且未过期或吊销。
OSI七层模型
物理层:传输比特流(如以太网、WiFi)。
数据链路层:封装成帧(如MAC地址、交换机)。
网络层:路由选择(如IP协议、路由器)。
传输层:端到端通信(如TCP/UDP)。
会话层:建立/管理会话(如RPC、NetBIOS)。
表示层:数据格式转换(如加密、压缩)。
应用层:用户接口(如HTTP、FTP)。
Socket位置
传输层:Socket是应用层与传输层之间的接口,封装了TCP/UDP协议细节。
内存溢出(OOM)
原因:申请内存超过系统限制(如堆内存溢出、栈溢出)。
解决方案:优化数据结构、使用内存缓存(如LruCache)、增加堆大小(-Xmx)。
热修复方案
代码热修复:
类加载方案:如Tinker通过替换Dex文件实现(需兼容不同Android版本)。
Instant Run:Android Studio工具,通过增量编译快速部署。
资源热修复:通过AssetManager动态加载补丁资源文件。