0

在我的应用程序中,我最近将 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 上代码也无法运行。

我一直在阅读有关testProguardFilesgradle 的内容,但我不知道这是否有用,或者至少我无法使其按预期工作。

这是我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 版本之间发生了哪些改变而破坏了我的代码......是另一个故事。

4

0 回答 0