Android知识点汇总

51 阅读6分钟

一、Java相关

Java基础知识总结

 数据结构与算法总结

二、Android重要知识模块

1.Android基础及重要模块

Android基础知识总结

Android Framework知识总结

Android重要系统应用模块

Android 架构

Android 各版本特性

2.网络

Android网络开发学习总结

3.数据库

Android 数据库相关学习总结

三、kotlin

Android kotlin学习总结

三、架构设计和设计模式

1.常用框架

Android 常用开源框架

2.Jetpack

一系列开发组件的统称,方便快速开发应用。

Jetpack学习总结

3.注解与事件总线框架

注解与依赖注入简介

Android注解框架

事件框架总线对比

4.设计模式

设计模式学习总结

四、性能优化

Android性能优化学习总结

五、模块化、组件化、插件化、热修复区别

模块化、组件化、插件化、热修复区别

  1. 热修复:目的是为了解决线上的bug或者小功能的更新,做到不用为了解决小bug或者小功能而频繁发布版本。核心技术分三类:代码修复、资源修复和动态链接库修复。每个核心技术有不同的方案,每种方案又有不同的实现。

    1. 代码修复:主要有三个方案:底层替换(直接在Native层修改原有类,不需要重新加载类。阿里系为主。)、类加载(基于Dex分包方案,主要有是Google官方方案、Dex自动拆包和动态加载方案。不能即时生效。)、Instant Run。
    2. 资源修复:替换系统AssetManger,加入patch的资源
    3. 动态链接库修复:先加载patch所在的so;
  2. 插件化原理分析:主要涉及类加载和资源加载。插件化目的是为了解耦业务模块,将一个应用里面不同的业务模块都做成一个apk。可并行开发,动态加载。

  3. 模块化实现:分模块开发,解耦。

  4. 项目组件化的理解:一种开发模式,把每个模块使用到的共同的功能抽取出来做成一个Lib去共同依赖,每个业务模块互不依赖、互相解耦,在开发的时候可以安排不同的开发人员去开发不同的模块,开发完毕以后单模块测试,最后整合到一起总体测试上线。

  5. 对于应用更新这块是如何做的?(解答:灰度,强制更新,分区域更新)?

六、JNI

1.JNI注册方式

  1. jni中注册native函数方法: 注册JNI函数的两种方式

    1. 静态注册:每个class都得用javah生成一个头文件,名字长,首次调用慢。类似 android_com_media_Target_test() ,通过函数命令规则查找响应函数。
    2. 动态注册:要在jni_onload 中注册。有类似 { "hello", "()Ljava/lang/String;", (void*)native_hello} 对应关系。 {"native_start",  "()V", (void *)android_media_AudioTrack_start},

2.C调用JAVA

  1. jni如何调用java层代码? C/C++调用JAVA

    1. 获取字节码对象;
    2. 通过字节码对象找到方法对象;
    3. 通过字节码文件创建object对象;
    4. 通过对象调用方法。

3.System.loadLibrary原理

Runtime.loadLibrary0 先用findLibrary去查找so是否存在,然后调用nativeLoad去加载库。

nativeLoad 方法参考:System.loadLibrary 加载 .so 原理

七、开发相关问题

1. 系统开发相关

  1. Android5种签名类型 :platform、media, shared, testkey/releasekey

  2. App 是如何沙箱化,为什么要这么做?  设置UID,底层是基于Linux内核的权限机制。

  3. 权限管理系统(底层的权限是如何进行 grant 的)? 参考 Android权限之底层实现概览

  4. 内存对象的循环引用及避免:内存回收机制的可达性算法。使用弱指针,程序中手动释放。

  5. 系统启动流程是什么?(init--Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程)

  6. 一个应用程序安装到手机上时发生了什么

  7. Android为每个应用程序分配的内存大小是多少?

    dalvik.vm.heapstartsize=8m    ----起始分配内存
    dalvik.vm.heapgrowthlimit=192m ---- 一般情况app申请的最大内存 dalvik.vm.heapsize=512m 
    
  8. Android中进程内存的分配,能不能自己分配定额内存?

  9. 进程保活的方式:Android进程分类?前台,可视,服务,后台,空进程。

  10. 如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill?)比较省电的方式是什么?

  11. 什么是协程?:可看做是轻量级的线程,一个线程内能包含多个协程。协程是串行执行的,由用户自己控制调度。

  12. App中唤醒其他进程的实现方式:通过intent的不同用法,参考 App相互唤醒的几种方式

2.开发遇到的问题

  1. 工作历史问题技术记录
  2. 低版本SDK如何实现高版本api:用@SuppressLint 和 @TargetApi 后加入版本判断。
  3. 为什么不能在子线程更新UI?  在更新UI时都会调用 ViewRootImpl 中的 checkThread()方法来判断当前线程是否是主线程,若不是就会抛异常。在onCreate方法中可以在子线程中更新UI,因为此时ViewRootImpl还没有创建,无法做判断。ViewRootImpl是在handleResumeActivity方法中的makeVisible里面创建的。
  4. Oom 是否可以try catch?为什么? 可以,但不应该这样做。
  5. 怎么去除重复代码? 抽象基类,布局文件,style等。

八、调试技巧

  1. pm, dumpsys 等相关命令
  2. 编译命令
  3. trace, systrace 等
  4. bugreport
  5. debuggerd
  6. gdb
  7. addline

调试经验总结

九、开发工具

AndroidStudio AI