Kotlin
Proguard
KotlinDay 7

data classとclassを難読化してデコンパイルした時のjavaコードについてみてみる

More than 1 year has passed since last update.

data classみなさん便利に使っていますよね。
ところで、難読化した時はどうなるのでしょうか?
普通のclassと難読化した結果はどう違うのでしょうか?

ふと気になったので、data classとclassを難読化した結果を比較してみました。

作ったdata class, class, javaのclass達

難読化したdata classとclassは以下のように定義しています。

data class Cat(
        val name: String,
        val age: Int,
        val memo: String
)
class Dog(
        val name: String,
        val age: Int,
        val memo: String
)

また、比較の為にjavaで作ったクラスも入れています。久しぶりにjavaのクラスを作ったので書き方を完全に忘れていました。

public class Penguin {
    private final String name;
    private final int age;
    private final String memo;

    public Penguin(final String name, final int age, final String memo) {
        this.name = name;
        this.age = age;
        this.memo = memo;
    }

    public String getName() {
        return this.name;
    }
}

実験に使ったソースは以下にアップしています。
https://github.com/mapyo/KotlinDataClassProGuardSample

さてこちらを難読化してjavaにデコンパイルするとどうなっているのでしょうか?

デコンパイルの方法は過去に自分が書いた以下の方法でデコンパイルしています。
https://qiita.com/mapyo/items/d52715feab9188db6629

デコンパイルした結果

デコンパイルした結果は長いのでgistに貼りました。

data class Cat をデコンパイルしたもの
https://gist.github.com/mapyo/cefc38d562e292a10b81302cc6a3f761

class Dogをデコンパイルしたもの
https://gist.github.com/mapyo/defc2e426b6baadf01e144514e27c75b

class Penguin(java)をデコンパイルしたもの
https://gist.github.com/mapyo/f9cc80e48395fb3952673cdfeb613c10

気になった事

その1

data class Catの以下の部分

    public String toString()
    {
        return (new StringBuilder()).append("Cat(name=").append(a).append(", age=").append(b).append(", memo=").append(c).append(")").toString();
    }

普通にクラス名とプロパティ名が見えてますね。。。!
また、data classが自動生成してくれるequalsやtoStringなどのメソッドは難読化されていないようです。

その2

kotlinで書いたdata classと普通のclassは、以下のように何故か文字列のプロパティ名が見えてしまっている状態でした。なんでだろう。。?

        a.a.a.a.a(s, "name");
        a.a.a.a.a(s1, "memo");

一方のjavaで書いたclassは特に何事もなく難読化されているようでした。

まとめ

難読化した結果どうなってるかをデコンパイルして比較してみる機会は特になかったので面白かったです!