質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

5958閲覧

[Android Kotlin] MainActivityでClassNotFoundが発生してしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/01/13 23:44

編集2019/01/14 08:47

前提・実現したいこと

AndroidStudioで、Fragmentの挙動を勉強するためのアプリを作っています。
ですが、AVDで動作確認をしようとする際に、「MainActivityがないよ」という旨の
ClassNotFoundExceptionが発生してしまいます。

発生している問題・エラーメッセージ

01-13 23:17:30.605 13912-13912/com.audoc314159.androidaurum E/AndroidRuntime: FATAL EXCEPTION: main Process: com.audoc314159.androidaurum, PID: 13912 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.audoc314159.androidaurum/com.audoc314159.androidaurum.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.audoc314159.androidaurum.MainActivity" on path: DexPathList[[zip file "/data/app/com.audoc314159.androidaurum-2/base.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]] . . . Caused by: java.lang.ClassNotFoundException: Didn't find class "com.audoc314159.androidaurum.MainActivity" on path: DexPathList[[zip file "/data/app/com.audoc314159.androidaurum-2/base.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.app.Instrumentation.newActivity(Instrumentation.java:1066) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  at android.app.ActivityThread.access$800(ActivityThread.java:151)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  Suppressed: java.io.IOException: Zip archive '/data/app/com.audoc314159.androidaurum-2/split_lib_slice_2_apk.apk' doesn't contain classes.dex (error msg: Entry not found) at dalvik.system.DexFile.openDexFileNative(Native Method) at dalvik.system.DexFile.openDexFile(DexFile.java:295) at dalvik.system.DexFile.<init>(DexFile.java:80) at dalvik.system.DexFile.<init>(DexFile.java:59) at dalvik.system.DexPathList.loadDexFile(DexPathList.java:262) at dalvik.system.DexPathList.makeDexElements(DexPathList.java:231) at dalvik.syst

作成したクラス内でエラーが発生しているわけではなく、
かつコンパイルとビルド自体は成功するため文法等の問題ではないような気がしているのですが、原因が全くつかめていません。

よく見るとMainActivityクラスのクラス名に黄色いハイライトがかかっているのに気づきました。
Warningの内容は

The <activity> MainActivity is not registered in the manifest
Activities, services and content providers should be registered in the AndroidManifest.xml file using <activity>, <service> and <provider> tags. If your activity is simply a parent class intended to be subclassed by other "real" activities, make it an abstract class. Issue id: Registered

と出ていたのでマニフェスト関連のエラーかもしれません。

以下AndroidManifestとMainActivity.ktとactivity_main.xmlです。

該当のソースコード

Manifest

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.audoc314159.androidaurum"> 4 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/ic_launcher" 8 android:label="@string/app_name" 9 android:roundIcon="@mipmap/ic_launcher_round" 10 android:supportsRtl="true" 11 android:theme="@style/AppTheme"> 12 <activity android:name="MainActivity"> 13 <intent-filter> 14 <action android:name="android.intent.action.MAIN"/> 15 <category android:name="android.intent.category.LAUNCHER"/> 16 </intent-filter> 17 </activity> 18 </application> 19 20</manifest>

Kotlin

1import android.support.v7.app.AppCompatActivity 2import android.os.Bundle 3import com.audoc314159.androidaurum.R 4import com.audoc314159.androidaurum.R.layout.activity_main 5 6class MainActivity : AppCompatActivity() { 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(activity_main) 11 12 //初期表示?? 13 if (savedInstanceState == null) { 14 15 // fragmentManagerのインスタンス生成 16 val fragmentManager = supportFragmentManager 17 // FragmentTransactionのインスタンスを取得 18 val fragmentTransaction = fragmentManager.beginTransaction() 19 20 // BackStackを設定 21 //これをトランザクションに設定すると、トランザクションの開始時のFragment状態がスタックに積まれて、 22 //戻るボタンで前の状態に戻ることが可能になる。 23 fragmentTransaction.addToBackStack(null) 24 25 // インスタンスに対して張り付け方を指定する 26 //引数で、Fragmentに使わせたいものを渡す 27 //遷移先指定 28 fragmentTransaction.replace(R.id.id_fl_intro, IntroFragment.newInstance("")) 29 30 /* 31 add(int containerViewId, Fragment fragment) 32 add(int containerViewId, Fragment fragment, String tag) 33 remove(Fragment fragment) 34 35 置き換え、remove()してadd()すること 36 replace(int containerViewId, Fragment fragment) 37 replace(int containerViewId, Fragment fragment, String tag) 38 39 Fragmentを非表示にする 40 hide(Fragment fragment) 41 42 hideされたものを表示させる 43 show(Fragment fragment) 44 45 UIからは外れるがFragmentMangerでactiveな状態として管理されている 46 detach(Fragment fragment) 47 48 detachされたものをattachする 49 attach(Fragment fragment) 50 */ 51 52 // 張り付けを実行 53 fragmentTransaction.commit() 54 } 55 } 56}

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context="MainActivity" tools:layout_editor_absoluteY="81dp"> 8 9 <FrameLayout 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" android:id="@+id/id_fl_intro"> 12 13 </FrameLayout> 14 <LinearLayout 15 android:orientation="vertical" 16 android:layout_width="match_parent" 17 android:layout_height="match_parent" android:id="@+id/id_ll_main"> 18 <FrameLayout 19 android:layout_width="match_parent" 20 android:layout_height="262dp" android:id="@+id/id_fl_battle"> 21 22 </FrameLayout> 23 <FrameLayout 24 android:layout_width="match_parent" 25 android:layout_height="161dp" android:id="@+id/id_fl_message"> 26 27 </FrameLayout> 28 <FrameLayout 29 android:layout_width="match_parent" 30 android:layout_height="match_parent" android:id="@+id/id_fl_buttons"> 31 32 </FrameLayout> 33 </LinearLayout> 34</android.support.constraint.ConstraintLayout> 35 36

試したこと

  • プロジェクトのクリーン、リビルド
  • 「./.gradle」「./app/build」「./build」以下のファイルの削除、リビルド
  • レイアウト系xmlで赤文字になっていた箇所は全て修正し、見た目はエラーがない状態に

補足情報(FW/ツールのバージョンなど)

  • AndroidStudio 3.2.1
  • kotlin_version '1.2.71'

初心者かつ質問させていただくのが初めての為、情報が足りなかったら申し訳ありませんが、
何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2019/01/14 14:48 編集

Kotlinソースコードの1行目にpackage文がないのは、実際のコード上には存在するものを提示する際に省いたのでしょうか?実際のコード上でも除去されているのでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/17 03:05

環境のせいかコメントできているか定かでないため、何重かに送られてしまっていたらすみません。パッケージ宣言はもともと省いてしまっていたのですが、追記したところ正常に動作するようになりました。ありがとうございます。ベストアンサーとさせていただきたいので、ぜひ回答としてご記入いただければと思います。
keicha_hrs

2019/01/17 03:45

推測が当たったようで、解決して良かったです。なぜpackage文が抜けるとエラーになるのかの原理も含めて回答欄に記述しました。
guest

回答1

0

ベストアンサー

Androidのパッケージマネージャーでは、実行するクラスのインスタンスを生成するために、リフレクションという機能を使っています。リフレクションでは、対象のクラスの完全修飾名が必要です。その情報源とするために、AndroidManifest.xmlにpackageを記述したり、activityタグのandroid:name属性にクラス名を指定しています。

一方で、JavaやKotlinのソースコードでは、一般的に1行目に

kotlin

1package com.audoc314159.androidaurum

のようなpackage文を記述します。これと、同じソースファイルに記述されたクラス名を合わせることで、コンパイラーはこのクラスの完全修飾名を得ることができます。

今回の問題では、package文の記述が抜けてしまったために、Androidのパッケージマネージャーがマニフェストで指定されているクラスを見つけることができず、アプリケーションを開始することができなかったということだと思います。

投稿2019/01/17 03:39

編集2019/01/17 03:40
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/17 10:31

わかりやすい解説をありがとうございます。Kotlinだとパッケージ宣言を書かなくてもコンパイルエラーにならないようで当たり前のことを見落としていました……ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問