场景:
对于加固包通过tinker进行热更新,补丁显示下发生成,并且已经激活,但是补丁实际上没有生效。
问题:
是什么原因导致的补丁不能生效?
解决方案:
分三种情况:
1.显示补丁下发成功,并且显示已经激活,但是实际上没有生效。
通过各种原因的排查,最终锁定在混淆问题上。因为混淆规则不正确。
我的混淆规则中,排除的是系统的activity和fragment
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
但我实际应用的是v7包的AppCompatActivity和v4包的Fragment
-keep public class * extends android.support.v7.app.AppCompatActivity
-keep public class * extends android.support.v4.app.Fragment
修改之后,下发补丁,修复成功。
如果还无法解决,就把所有引用的base类要排除混淆。
2.显示下发成功,但是一直没有激活。
如果是补丁下发成功,但是一直显示没有激活,那就是签名有问题,要确保基准包和补丁包签名一致。在buildTypes里面配置签名,可以确保签名的一致性。
buildTypes {
debug {
buildConfigField "boolean", "IS_DEBUG", "true"
minifyEnabled false
signingConfig signingConfigs.debug
}
release {
buildConfigField "boolean", "IS_DEBUG", "false"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
3.一直没有下发成功。
可能是因为混淆规则中没有添加tinker的混淆规则,导致tinker异常。添加tinker混淆规则配置如下规则。
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
# tinker混淆规则
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }
-keep class android.support.**{*;}