1.gradle配置多个打包
android层级下可以配置签名信息:
signingConfigs {
release {
storeFile file("C:\\Users\\Administrator\\Desktop\\xqw.jks")
storePassword "111111"
keyAlias "111111"
keyPassword "111111"
}
dev {
storeFile file("C:\\Users\\Administrator\\Desktop\\xqw.jks")
storePassword "111111"
keyAlias "111111"
keyPassword "111111"
}
}
buildTypes中配置对应版本
buildTypes {
release {
signingConfig signingConfigs.release
applicationIdSuffix ".release"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
dev {
signingConfig signingConfigs.dev
applicationIdSuffix ".dev"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
可以自己指定签名和后缀信息以区分包
productFlavors区分不同渠道的包的信息,与buildType中配置不能重名,例如再命名为release,dev等。利用manifestPlaceholders可以配置清单文件中的信息。其中AndroidManifest.xml中的um的值是以$[xxx]方式配置的。
productFlavors {
flavors_release {
manifestPlaceholders["um", "release"]
resValue("string", "flag", "release")
}
flavors_dev {
manifestPlaceholders["um", "dev"]
resValue("string", "flag", "release")
}
}
2.java嵌套类造成内存泄漏的原因
成员内部类
局部内部类
匿名内部类
静态内部类
成员内部类:
编译后,成员内部类中有指向外部类对象的引用,所以成员内部类依赖于外部类,如果没有创建外部类的对象,
则无法对this$0进行赋值,所以可以直接访问外部类的方法和成员。
局部内部类(匿名内部类):
编译后,匿名内部类的构造器中包含两个参数,指向外部类对象的引用和使用的局部变量,如果编译器能确定则确定该参数,如果不能
确定,则会在初始化内部类对象时通过构造方法传入,为保证数据一致性,所以用final修饰该局部变量
静态内部类:
不依赖外部类,不会持有外部类对象的引用。
Handler造成内存泄露的原因:
Handler属于Thread Local Storage 变量,生命周期与Activity不一致。
如果声明的Handler是普通内部类,则会引用外部activity。而ActivityThread创建UI线程时会创建一个Looper对象,Looper对象维护
一个简单的消息队列,处理里面的Message。Looper生命周期是整个应用的生命周期。
初始化Handler会与Looper的消息队列关联,Message会引用Handler对象,从而阻止了handler的回收,从而阻止了activity的回收。