月: 2023年7月

AndroidGradlePlugin8.0対応時の追加メモ

android.enableR8.fullMode=trueにする場合でretrofit2、RxJava2を使う場合は下記のルールをproguardのルールに追加する必要があります。

https://github.com/square/retrofit/issues/3751#issuecomment-1192043644

 -keep,allowobfuscation,allowshrinking interface retrofit2.Call 
 -keep,allowobfuscation,allowshrinking class retrofit2.Response
 -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation 

https://github.com/square/retrofit/issues/3774#issuecomment-1525677491

 -keep,allowobfuscation,allowshrinking class io.reactivex.rxjava3.core.Flowable 
 -keep,allowobfuscation,allowshrinking class io.reactivex.rxjava3.core.Maybe 
 -keep,allowobfuscation,allowshrinking class io.reactivex.rxjava3.core.Observable 
 -keep,allowobfuscation,allowshrinking class io.reactivex.rxjava3.core.Single 

[Android] override fun onResume()は使わない方向になっている

https://developer.android.com/topic/architecture/recommendations?hl=ja

Android アーキテクチャに関する推奨事項を見ると少しづつアップデートされているようです。(どの項目がいつから追加/変更されているかわからないので追っていたほうが良さそう)

https://developer.android.com/topic/architecture/recommendations?hl=ja#lifecycle

強く推奨:アクティビティやフラグメントの onResume などのライフサイクル メソッドをオーバーライドしないようにします。

いつから追加されたかわからないのですが強く推奨でonResumeはオーバーライドしないように実装しないといけないようです。具体的には下記のようにします。

import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner

class MyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onResume(owner: LifecycleOwner) {
                super.onResume(owner)
                // onResume時の処理
            }
        })
    }
}
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner

class MyFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onDestroy(owner: LifecycleOwner) {
                super.onDestroy(owner)
                // onDestroy()時の処理
            }
        })
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onResume(owner: LifecycleOwner) {
                super.onResume(owner)
                // onResume()時の処理
            }

            override fun onDestroy(owner: LifecycleOwner) {
                super.onDestroy(owner)
                // onDestroyView()時の処理
            }
        })
    }
}

書き換えること自体はそんなに難しくないので書き換えていきましょう。


リフレクションを使うのはやめておいたほうが良さそう

https://kotlinlang.org/docs/reflection.html

kotlinにリフレクションという機能があり、privateなプロパティを書き換えたりすることが可能です。Androidだと本来設定できないGUIの表示を書き換えたりできます。しかしこの機能は本来アクセスすることができないパラメータを使うのでライブラリのアップデートや難読化の影響で動作しなくなる場合があるので使わないほうが良さそうです。(有用な使い方も今のところわからん)