Magicode logo
Magicode
0
2 min read

【Android】一体いつから─────難読化後の ::class.java.simpleName がユニークだと錯覚していた?

https://cdn.apollon.ai/media/notebox/4a9d6342-c52f-45b2-8b30-a59351e0ab8f.jpeg
以下のサンプル コードのように ::class.java.simpleName の値によって処理を分岐させる実装を行うと、 R8 または ProGuard による難読化後のアプリでは期待通りの挙動になりませんでした 🙅‍♀️
kotlin
class Qiita
class Zenn
class Magicode

when (Magicode::class.java.simpleName) {
    Qiita::class.java.simpleName -> print("想定外です ×")
    Zenn::class.java.simpleName -> print("想定外です ×")
    Magicode::class.java.simpleName -> print("想定通りです ◎ Magicode::class.java.simpleName = ${Magicode::class.java.simpleName}") // なぜか実行されない 🧐
}

問題点

Qiita クラスと Zenn クラスと Magicode クラスは同一パッケージ内に配置していたのですが、難読化後の ::class.java.simpleName は重複する値に書き変わっていました。
Qiita::class.java.simpleNamed
Zenn::class.java.simpleNamef
Magicode::class.java.simpleNamef
同じパッケージ配下であれば難読化されても ::class.java.simpleName の値は被らないであろうと思い込んでいました( ::class.java.simpleName の Javadoc や中身を読めていませんでした 🙇‍♂️ )。

結論

::class.java.simpleName は使用せずに、難読化の影響を受けない文字列などの定数や、唯一無二を担保できる EnumSealed classes を条件分岐に用いる方が無難ではないかと斯様に思いました。

関連記事


Discussion

コメントにはログインが必要です。