SharedPreference相关内容
返回值
apply()没有返回值,而commit()返回boolean表明修改是否提交成功。
操作效率
apply()是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘。
而commit()是同步的提交到硬件磁盘。因此,在多并发commit()的时候,会等待正在处理的commit保存到磁盘后再操作,从而降低了效率。
而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,从一定程度上提高了效率。
- 注意这个static的sSharedPrefsCache,它保存了你所有使用的sp,然后sp里面有一个成员mMap保存了所有的键值对;这样,你程序中使用到的那些个sp永远就呆在内存中
- SharedPreferences在实例化时首先会从sdcard异步读文件,然后缓存在内存中;接下来的读操作都是内存缓存操作而不是文件操作。正式这种特性决定它是一个轻量级的存储,不要存储大的value。
- 在SharedPreferences的Editor中如果用commit()方法提交数据,其过程是先把数据更新到内存,然后在当前线程中写文件操作,提交完成返回提交状态;如果用的是apply()方法提交数据,首先也是写到内存,接着在一个新线程中异步写文件,然后没有返回值。
- 在写操作commit时有三级锁操作,效率很低,所以当我们一次有多个修改写操作时等都批量put完了再一次提交确认,这样可以提高效率。
SharedPreferences注意点
SharedPreferences注意点带源码分析
Sqlite
性能优化
性能优化
多线程打开关闭数据库,保证操作数据库安全
APK打包流程
![](https://img.haomeiwen.com/i4264145/89f10df55e14d331.png)
![](https://img.haomeiwen.com/i4264145/4603741a06faf388.png)
- 打包资源文件,生成R.java文件
打包资源的工具是aapt(The Android Asset Packaing Tool)(E:\Documents\Android\sdk\build-tools\25.0.0\aapt.exe)。
在这个过程中,项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制。
存放在APP的res目录下的资源,该类资源在APP打包前大多会被编译,变成二进制文件,并会为每个该类文件赋予一个resource id。对于该类资源的访问,应用层代码则是通过resource id进行访问的。Android应用在编译过程中aapt工具会对资源文件进行编译,并生成一个resource.arsc文件,resource.arsc文件相当于一个文件索引表,记录了很多跟资源相关的信息。 - 处理aidl文件,生成相应的Java文件
这一过程中使用到的工具是aidl(Android Interface Definition Language),即Android接口描述语言(E:\Documents\Android\sdk\build-tools\25.0.0\aidl.exe)。
aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。 - 编译项目源代码,生成class文件
项目中所有的Java代码,包括R.java和.aidl文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下。 - 转换所有的class文件,生成classes.dex文件
dx工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件,该工具位于(E:\Documents\Android\sdk\build-tools\25.0.0\dx.bat)。
任何第三方的libraries和.class文件都会被转换成.dex文件。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。 - 打包生成APK文件
所有没有编译的资源,如images、assets目录下资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问);编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。
打包的工具apkbuilder位于 android-sdk/tools目录下。apkbuilder为一个脚本文件,实际调用的是(E:\Documents\Android\sdk\tools\lib)文件中的com.android.sdklib.build.ApkbuilderMain类。 - 对APK文件进行签名
一旦APK文件生成,它必须被签名才能被安装在设备上。
在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore。
另一种就是用于发布正式版本的keystore。 - 对签名后的APK文件进行对齐处理
如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign(E:\Documents\Android\sdk\build-tools\25.0.0\zipalign.exe)
对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。
组件化
![](https://img.haomeiwen.com/i4264145/f241151c12d1b006.png)
GC
java内存结构分析
垃圾回收机制
判断是否是垃圾内存:
1.引用计数法(互相引用对象)
2.可达性分析算法(二次标记finalize)
垃圾回收算法:
1.标记清除算法(标记可回收,清除,碎片化)
2.复制算法(分区,将存活对象复制到一个区,其他区清除,有一些区域不能用,采用Eden:A:B = 8:1:1)
3.标记整理算法(标记存活对象,复制到左上角,其他地方清除,效率低)
4.分代回收算法(经常回收的用复制算法,不常回收的用标记整理算法)
内存泄漏
MAT Android
RecyclerView 以及使用
静态代理和动态代理的优缺点
RxJava项目使用
https://blog.csdn.net/zhangxiangliang2/article/details/74055571
操作符使用
APP后台被杀,如何复原
Android开发进阶:Activity和进程的回收和状态恢复
下面推荐的文章比较好
Fragment懒加载
Rxjava,OkHttp的原理
组件化,插件化
Java类加载过程,双亲委托
双亲委托:实现双亲委托的代码都集中在java.lang.ClassLoader的loadClass()方法中,逻辑清晰易懂:先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载器加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass方法进行加载。
使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,当程序中出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的某一个类。
![](https://img.haomeiwen.com/i4264145/33ab83f7390c80b2.png)
类加载过程
加载:3点
验证:4个阶段
准备:static变量初始零值
解析:符号引用变直接引用
初始化:合并执行<clinit>
![](https://img.haomeiwen.com/i4264145/1452c060df3b6da8.png)
https://blog.csdn.net/justloveyou_/article/details/72466416
Handler
容器
LinkedBlockingQueue和ArrayBlockingQueue
SynchronousQueue
热修复
类似Andfix,Native修改ArtMethod
d8将修复的class打包成dex
使用jni,添加Android.mk Application.mk
生成.h文件 javah -jni -classpath E:\JulyApplication\app\build\intermediates\classes\debug com.example.chenpeng.julyapplication.Hotfix.Andfix.PatchManager
创建cpp文件,引用.h,将native方法实现
进入jni文件夹,ndk-build
defaultConfig {
applicationId "com.example.chenpeng.julyapplication"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk{
abiFilters "armeabi" //要生成的so文件
}
}
sourceSets{
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
网友评论