在我的应用程序中,我最近将 Kotlin 从 1.5.31 更新到了 1.6.10。从那时起,使用反射 (kotlin-reflect) 的特定功能停止按预期工作。它在 1.5.31 中运行良好。
现在,当我运行调试版本时,该功能可以正常工作,但是当我运行发布版本(缩小和混淆的版本)时,它却没有。
这是我纯偶然发现的(不幸的是,我没有使用 TDD……是的,我知道我应该这样做,但有时我们学习困难重重),所以我决定是时候开始测试以避免这种意外问题了,尤其是这个。
我一直在做一些研究,但我没有发现如何做这个具体的事情。
这个想法是能够运行一个测试来捕捉这个问题,这个问题只有在代码被混淆时才会出现。
我已经实现了一个简单的测试并且测试没有失败,因为它使用的代码没有被混淆。
测试如下:
class UtilsTest {
@Test
fun dataClassAsStringToDataClass_ValidInput_OutputShouldBeEqualInput(){
//GIVEN
val defaultTimerData = TimerViewModelData(
hours = DEFAULT_HOURS,
minutes = DEFAULT_MINUTES,
seconds = DEFAULT_SECONDS,
showSmallTimer = DEFAULT_SHOW_SMALL_TIMER,
elapsedTimeMode = DEFAULT_ELAPSED_TIME_MODE
)
val defaultTimerDataAsString = defaultTimerData.toString()
//WHEN
val dataClassRecovered = dataClassAsStringToDataClass<TimerViewModelData>(defaultTimerDataAsString)
//THEN
assertEquals(dataClassRecovered, defaultTimerData)
}
}
您可能已经猜到了,我的文件中-keep
实现了一些规则proguard-rules.pro
,否则即使在 Kotlin 1.5.31 上代码也无法运行。
我一直在阅读有关testProguardFiles
gradle 的内容,但我不知道这是否有用,或者至少我无法使其按预期工作。
这是我build.gradle
文件的一部分:
buildTypes {
debug {
versionNameSuffix "-debug"
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
testProguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
ndk {
debugSymbolLevel "FULL"
}
}
}
如果您需要任何其他信息,请在评论中告诉我,我很乐意分享。
以防万一,让我们澄清一下,这个问题的目的是知道如何进行测试,当代码由于被混淆而改变其行为时应该失败的测试,而不是在 Kotlin 版本之间发生了哪些改变而破坏了我的代码......是另一个故事。