見出し画像

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)アプリ開発を学習している方々には「参考教材」として、業務で動作実績のあるサンプルコード&開発環境一式が必要なプロの方々には「工数削減」として、大変にオススメです。


この記事が気に入ったらサポートをしてみませんか?