- fork/clone(主流)
- fork:将别人的仓库代码fork到自己的仓库上
- clone:克隆下自己仓库的代码
- update、commit:修改代码并提交到自己的仓库
- push:提交到自己的仓库
- pull request:请求添加到别人的仓库
- clone
5、proguard是什么
ProGuard工具是用于压缩、优化和混淆我们的代码,其主作用是移除或混淆代码中无用类、字段、方法和属性
6、proguard技术功能
- 压缩
- 优化
- 混淆
- 预检测
7、proguard工作原理
将无用的字段或方法存入到EntryPoint中,将非EntryPoint的字段和方法进行替换
8、为什么要混淆
由于Java是一门跨平台的解释性语言,其源代码被编译成class字节码来适应其他平台,而class文件包含了Java源代码信息,很容易被反编译
9、annotationProcessor与compileOnly的区别
annotationProcessor与compileOnly都是只编译并不打入apk中
- annotationProcessor:编译时生成代码,编译完就不需要了
- compileOnly:有重复的库时,可以剃除重复库,只保留一个库
ANR面试题
1、什么是ANR
Application Not Responding,页面无响应的对话框
2、发生ANR的条件
应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框
- Activity超过5秒无响应
- BroadcastReceiver超过10秒无响应
- Service超过20秒无响应
3、造成ANR的主要原因
主线程被IO操作阻塞
- Activity的所有生命周期回调都是执行在主线程的
- Service默认执行在主线程中
- BoardcastReceiver的回调onReceive()执行在主线程中
- AsyncTask的回调除了doInBackground,其他都是在主线程中
- 没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中
4、如何解决ANR
- 使用AsyncTask处理耗时IO操作
- 使用Thread或HandlerThread提高优先级
- 使用Handler处理工作线程的耗时操作
- Activity的onCreate和onResume回调尽量避免耗时操作
OOM面试题
1、什么是OOM
OOM指Out of memory(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常
2、OOM相关概念
- 内存溢出:指程序在申请内存时,没有足够的空间供其使用
- 内存泄漏:指程序分配出去的内存不再使用,无法进行回收
- 内存抖动:指程序短时间内大量创建对象,然后回收的现象
3、解决OOM
Bitmap相关
- 图片压缩
- 加载缩略图
- 在滚动时不加载图片
- 回收Bitmap
- 使用inBitmap属性
- 捕获异常
其他相关
- listview重用convertView、使用lru
- 避免onDraw方法执行对象的创建
- 谨慎使用多进程
Bitmap面试题
1、recycle
- 在安卓3.0以前Bitmap是存放在堆中的,我们只要回收堆内存即可
- 在安卓3.0以后Bitmap是存放在内存中的,我们需要回收native层和Java层的内存
- 官方建议我们3.0以后使用recycle方法进行回收,该方法也可以不主动调用,因为垃圾回收器会自动收集不可用的Bitmap对象进行回收
- recycle方法会判断Bitmap在不可用的情况下,将发送指令到垃圾回收器,让其回收native层和Java层的内存,则Bitmap进入dead状态
- recycle方法是不可逆的,如果再次调用getPixels()等方法,则获取不到想要的结果
2、LruCache原理
LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中
3、计算采样率
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
4、采样率压缩(缩略图)
public