在升级时, 调试使用命令: gradle clean; gradle build
, 多次执行, 检验错误.
本文的合集已经编著成书,高级Android开发强化实战,欢迎各位读友的建议和指导。在京东即可购买:https://item.jd.com/12385680.html
1. 替换Gradle
替换全部项目的Gradle配置, 使用版本号23.
repositories {
mavenCentral()
maven {
url "http://maven.chunyu.mobi/content/groups/public/"
credentials {
username maven_user
password maven_password
}
}
}
android {
buildToolsVersion "23.0.2"
compileSdkVersion 23
defaultConfig {
minSdkVersion 14
targetSdkVersion 22
// multidex
multiDexEnabled true
}
useLibrary 'org.apache.http.legacy'
// 支持Java1.7
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
// Java的注释冲突
packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:support-v4:23.2.0'
compile 'com.android.support:design:23.2.0'
}
2. 替换标注库
替换G7的注释库
compile 'me.chunyu.android:g7anno-core:0.1.4@jar'
为
compile 'me.chunyu.android:g7anno-core-v23:0.1.4@jar'
修改Fragment的getFragmentManager为getChildFragmentManager.
3. FloatMath删除
FloatMath库被删除, 替换为Math. 参考
4. Notification修改
Notification的setLatestEventInfo方法被删除, 需要替换.
5. abc_action_bar_default_height删除
替换ActionBar的高度为Android5.0属性, 即
android:layout_height="@dimen/abc_action_bar_default_height"
为
android:layout_height="?attr/actionBarSize"
位置: activity_volunteer_doctor_list.xml 和 activity_offline_clinic_list.xml
6. 腾讯和阿里的低版本不兼容
com.alipay.android.phone.mrpc.core.b
com.tencent.connect.avatar.b
7. GC的OOM问题
错误: java.lang.OutOfMemoryError: GC overhead limit exceeded
原因: GC的内存不够, 超出限制, 指定新的参数即可.
解决:
android {
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
}
8. 主dex的类过多
错误: com.android.dex.DexException: Too many classes in --main-dex-list, main dex capacity exceeded
参考
在build.gradle中添加
def patchKeepSpecs() {
def taskClass = "com.android.build.gradle.internal.tasks.multidex.CreateManifestKeepList";
def clazz = this.class.classLoader.loadClass(taskClass)
def keepSpecsField = clazz.getDeclaredField("KEEP_SPECS")
keepSpecsField.setAccessible(true)
def keepSpecsMap = (Map) keepSpecsField.get(null)
if (keepSpecsMap.remove("activity") != null) {
println "KEEP_SPECS patched: removed 'activity' root"
} else {
println "Failed to patch KEEP_SPECS: no 'activity' root found"
}
}
patchKeepSpecs()
9. ActionBar留白
升级以后, 项目使用ActionBar全部都无法全部显示了, 前后各有一处留白. 原因是新版本对ActionBar添加了额外属性, 控制边界, 需要设置AppBar的Styles.
<style name="CYActionBar"
parent="@style/Widget.AppCompat.ActionBar">
...
<item name="contentInsetStart">0dp</item>
<item name="contentInsetEnd">0dp</item>
</style>
contentInset分别表示前后的留白, 设置0dp则可以避免.