Caused by: androidx.fragment.app.Fragment$d: Unable to instantiate fragment androidx.navigation.fragment.NavHostFragment: make sure class name exists|開発裏話
スレッド式メモ帳アプリ『CBnotes』を、Ver.1.1.0 で Android 10 ターゲット(targetSdkVersion 29)に変更しました。
しかし、リリースアプリで以下が発生し、アプリが全く起動できない状態になっていました。
Caused by: androidx.fragment.app.Fragment$d: Unable to instantiate fragment androidx.navigation.fragment.NavHostFragment: make sure class name exists
(クラス名が存在することを確認してください)
見当たらない関連情報
WEB で調べても関連記事は一切なく、全くの不明。
『CBnotes』の xml 上(レイアウトファイル)の実装は以下の通りです。
...
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
...
Android 10 ターゲット(targetSdkVersion 29)で問題が発生し、Android 9 ターゲット(targetSdkVersion 28)では発生しません。又、デバッグアプリでも発生しません。
リリースアプリの難読化
デバッグアプリとリリースアプリでの違いは、以下の通り、難読化しているという点。
build.gradle (:app)
...
buildTypes {
release {
debuggable false
minifyEnabled true
...
え、まさか。
解決方法
以下の通り、リリースアプリの難読化を部分的に解除してみました。
proguard-rules.pro
...
-keep public class androidx.navigation.fragment.** {
public *;
}
...
すると、無事、リリースアプリの起動に成功!
情報が無いので定かではありませんが、難読化の範囲が広くなったようです。ふぅ、やれやれ。
『CBnotes』ソースコード一式
以下 note で、実際に Google Play へ公開リリースしている『CBnotes』のソースコード一式を販売しております。
Android(Kotlin)アプリ開発を学習している方々には「参考教材」として、業務で動作実績のあるサンプルコード&開発環境一式が必要なプロの方々には「工数削減」として、大変にオススメです。