android - Kotlin 委托(delegate)属性名称在混淆后仍然可见

标签 android kotlin proguard

我注意到 Kotlin 委托(delegate)属性名称在混淆后的字节码中仍然可见。

示例源代码:

class MainActivity : AppCompatActivity() {
    val testProperty by lazy { "this is testProperty value" }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        testMethod()
        Log.d("MainActivity", "testProperty: $testProperty")
    }

    fun testMethod() {
        Log.d("MainActivity", "this is testMethod")
    }
}

我正在构建启用缩小的 apk,然后使用 Android Studio 中的 APK 分析功能来浏览字节码:

.method private final l()V
    .registers 3

    const-string v0, "MainActivity"

    const-string v1, "this is testMethod"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    return-void
.end method

...

invoke-static {v2}, La/a/b/k;->a(Ljava/lang/Class;)La/b/b;

    move-result-object v2

    const-string v3, "testProperty"

    const-string v4, "getTestProperty()Ljava/lang/String;"

    invoke-direct {v1, v2, v3, v4}, La/a/b/j;-><init>(La/b/c;Ljava/lang/String;Ljava/lang/String;)V

    invoke-static {v1}, La/a/b/k;->a(La/a/b/i;)La/b/e;

在上面的 fragment 中,您可以看到 testMethod 混淆得很好,但是 testProperty 仍然可见。

我如何从字节码中删除此信息以改进混淆并使其更难进行逆向工程?

最佳答案

委托(delegate)属性的名称是其 API 的一部分:属性委托(delegate)接收名称作为参数,并且可以将其用作例如数据库列的名称或持久格式的键。因此,它不能简单地从字节码中删除;它与任何其他字符串文字(如“这是 testProperty 值”字符串)一样具有同样的含义。

如果您真的担心知道特定属性的名称会对试图对您的应用程序进行逆向工程的人产生本质影响,请不要在此类代码中使用委托(delegate)属性。但是,我很确定在 95% 的情况下,这种担忧是没有根据的。

关于android - Kotlin 委托(delegate)属性名称在混淆后仍然可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53334476/

相关文章:

java - 在Android中将毫秒转换为本地时间时,为什么时间不正确?

android - Proguard:如何处理大型函数

android - 地址类 getCountryCode() 方法返回数字

java - Eclipse Aether 未正确解析 `LATEST`

jpa - 将Kotlin不可变实体与JPA一起使用时发生意外更改

java - 在 pom.xml 中包含 proguard 配置文件

Proguard:如何保留除特定条件外的所有内容?

android - 升级到 Android Gradle 插件 3.3.0 时出现无效的 Crashlytics API key 错误

java - Android:从MySQL数据库获取数据

java - 使用谷歌地图的 Android 编程错误 "No view found for id for fragment "