APK主要由以下几部分组成:
* META-INF/ :包含了签名文件CERT.SF、CERT.RSA,以及 manifest 文件MANIFEST.MF。
* assets/ : 存放资源文件,这些资源不会被编译成二进制。
* lib/ :包含了一些引用的第三方库。
* resources.arsc :包含res/values/中所有资源,例如strings,styles,以及其他未被包含在resources.arsc中的资源路径信息,例如layout 文件、图片等。
* res/ :包含res中没有被存放到resources.arsc的资源。
* classes.dex :经过dx编译能被android虚拟机理解的Java源码文件。
* AndroidManifest.xml :清单文件
其中占据较大内存的是res资源、lib、class.dex,因此我们可以从下面的几个方面下手:
* 代码方面可以通过代码混淆,这个一般都会去做。平时也可以删除一些没有使用类。
* 去除无用资源。使用`lint`工具来检测没有使用到的资源,或者在gradle中配置`shrinkResources`来删除包括库中所有的无用的资源,需要配合proguard压缩代码使用。这里需要注意项目中是否存在使用getIdentifier方式获取资源,这种方式类似反射lint及shrinkResources无法检测情况。如果存在这种方式,则需要配置一个keep.xml来记录使用反射获取的资源。([https://developer.android.com/studio/build/shrink-code)\[](https://developer.android.com/studio/build/shrink-code)%5B)压缩代码和资源\]
* 去除无用国际化支持。对于一些第三库来说(如support),因为国际化的问题,它们可能会支持了几十种语言,但我们的应用可能只需要支持几种语言,可以通过配置resConfigs提出不要的语言支持。
* 不同尺寸的图片支持。通常情况下只需要一套xxhpi的图片就可以支持大部分分辨率的要求了,因此,我们只需要保留一套图片。
* 图片压缩。 png压缩或者使用webP图片,完美支持需要Android版本4.2.1+
* 使用矢量图形。简单的图标可以使用矢量图片。
- Android面试题集
- Android系统架构图
- Activity与Service通信
- Service的生命周期与启动方法
- 广播
- ContentProvider、ContentResolver与ContentObserver之间的关系
- 关于Fragment的问题
- Android里的Intent传递的数据限制
- Android的事件分发机制
- View的绘制原理
- APK的打包流程
- BroadcastReceiver与LocalBroadcastReceiver
- Handler
- Android Binder机制
- Activity的生命周期
- Activity的通信方式
- Android应用里的Context对象
- 进程和Application的生命周期
- 内存泄漏
- Android的几种进程
- SharePreference性能优化
- SQLite升级
- 进程保护
- 序列化
- 计算一个Bitmap占用内存
- 内存缓存和磁盘缓存
- PathClassLoader与DexClassLoader
- WebView优化
- JNI
- 插件化和热修复
- 性能优化
- 防止过度绘制,做布局优化
- 提交代码质量
- 64k问题
- MVC、MVP与MVVM之间的对比分析
- Android中高级面试题
- Activity生命周期
- onStart()与onResume()有什么区别
- Activity启动流程
- Android类加载器
- Android消息机制
- Looper.loop()为什么不会阻塞主线程
- IdleHandler (闲时机制)
- 同步屏障机制(sync barrier)
- View的绘制原理
- 什么是MeasureSpec
- getWidth()方法和getMeasureWidth()区别
- requestLayout,invalidate,postInvalidate区别与联系
- Binder机制,共享内存实现原理
- 序列化的方式
- Fragment的懒加载实现
- RecyclerView与ListView(缓存原理,区别联系,优缺点)
- Android两种虚拟机区别与联系
- adb常用命令行
- apk打包流程
- apk安装流程
- apk瘦身
- HTTP缓存机制
- 组件化
- okhttp原理
- Retrofit的实现与原理
- RxLifecycle原理
- 类的加载机制
- 什么时候发生类初始化
- 双亲委派模型
- 为什么使用双亲委托模型
- HashMap原理,Hash冲突
- 什么是Fail-Fast机制
- Java多线程中调用wait() 和 sleep()方法有什么不同?
- volatile的作用和原理
- 一个int变量,用volatile修饰,多线程去操作++,线程安全吗?
- 那如何才能保证i++线程安全?
- CAS实现原子操作会出现什么问题?
- synchronized
- 偏向锁
- 轻量级锁
- 线程池
- 假如有n个网络线程,你需要当n个网络线程完成之后,再去做数据处理,你会怎么解决?
- Java中interrupted 和 isInterruptedd方法的区别?
- 懒汉式单例的同步问题
- 什么是ThreadLocal
- 什么是数据竞争
- Java内存模型(Java Memory Model JMM)
- Java内存区域
- 判断对象是否需要回收的方法
- 引用类型
- 垃圾收集算法
- 内存分配策略