我注意到,在模糊的字节码中仍然可以看到Kotlin委托的属性名称。
示例源代码:
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;
在上面的片段中,您可以看到testMethod
混淆得很好,但是testProperty
仍然可见。
如何从字节码中删除此信息以改善混淆并使其更难以反向工程?
答案 0 :(得分:0)
委托属性的名称是其API的一部分:属性委托接收名称作为参数,并可以将其用作数据库列名称或持久性格式的键。因此,不能简单地将其从字节码中删除。它在那里的含义与任何其他字符串文字(例如“ this is testProperty value”字符串)一样重要。
如果您真正担心知道某个特定属性的名称对于试图对您的应用程序进行反向工程的人有本质的不同,请不要在此类代码中使用委托的属性。但是,我很确定在95%的情况下这种担心都是没有根据的。