Unity 2017.3 Beta 1でAndroidアプリを開発しています(AppName)。起動時にJavaコードを実行するためのカスタムアクティビティが必要です。私はgradle
を使用してAppName.jar
ファイルにアクティビティをパッケージ化し、UnityのAppName/Assets/Plugins/Android
フォルダにドロップし、それを参照するカスタムAndroidManifest.xml
と一緒に別のプロジェクトにAppNameActivity
のコードがあります。私はUnityのビルドと実行の機能を使用します(ビルドシステム:Gradle、Development Build)。クラスがデックス逆アセンブリで表示されても、アクティビティクラスが見つかりません
Android搭載端末でアプリを起動すると、即座にクラッシュします。 Activityクラスが欠落しているように見えますが、より詳細な検査では、実際にそこにあります。
経由adb logcat
私はこのエラーを取得することができます。
V/ActivityThread(24831): Handling launch of ActivityRecord{2609126c [email protected] {de.companyname.appname.rebuild/de.companyname.appname.rebuild.AppNameActivity}}
D/OpenGLRenderer(23986): Flushing caches (mode 0)
D/OpenGLRenderer(23986): Flushing caches (mode 0)
I/art (24831): Rejecting re-init on previously-failed class java.lang.Class<de.companyname.appname.rebuild.AppNameActivity>
D/AndroidRuntime(24831): Shutting down VM
E/AndroidRuntime(24831): FATAL EXCEPTION: main
E/AndroidRuntime(24831): Process: de.companyname.appname.rebuild, PID: 24831
E/AndroidRuntime(24831): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.companyname.appname.rebuild/de.companyname.appname.rebuild.AppNameActivity}: java.lang.ClassNotFoundException: Didn't find class "de.companyname.appname.rebuild.AppNameActivity" on path: DexPathList[[zip file "/data/app/de.companyname.appname.rebuild-2/base.apk"],nativeLibraryDirectories=[/data/app/de.companyname.appname.rebuild-2/lib/arm, /vendor/lib, /system/lib]]
E/AndroidRuntime(24831): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381)
E/AndroidRuntime(24831): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2532)
E/AndroidRuntime(24831): at android.app.ActivityThread.access$900(ActivityThread.java:169)
E/AndroidRuntime(24831): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
E/AndroidRuntime(24831): at android.os.Handler.dispatchMessage(Handler.java:111)
E/AndroidRuntime(24831): at android.os.Looper.loop(Looper.java:194)
E/AndroidRuntime(24831): at android.app.ActivityThread.main(ActivityThread.java:5562)
E/AndroidRuntime(24831): at java{de.companyname.appname.rebuild/de.companyname.appname.rebuild.AppNameActivity}.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(24831): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(24831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968)
E/AndroidRuntime(24831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763)
E/AndroidRuntime(24831): Caused by: java.lang.ClassNotFoundException: Didn't find class "de.companyname.appname.rebuild.AppNameActivity" on path: DexPathList[[zip file "/data/app/de.companyname.appname.rebuild-2/base.apk"],nativeLibraryDirectories=[/data/app/de.companyname.appname.rebuild-2/lib/arm, /vendor/lib, /system/lib]]
E/AndroidRuntime(24831): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(24831): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(24831): at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/AndroidRuntime(24831): at android.app.Instrumentation.newActivity(Instrumentation.java:1070)
E/AndroidRuntime(24831): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2371)
E/AndroidRuntime(24831): ... 10 more
E/AndroidRuntime(24831): Suppressed: java.lang.NoClassDefFoundError: de.companyname.appname.rebuild.AppNameActivity
E/AndroidRuntime(24831): at dalvik.system.DexFile.defineClassNative(Native Method)
E/AndroidRuntime(24831): at dalvik.system.DexFile.defineClass(DexFile.java:226)
E/AndroidRuntime(24831): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
E/AndroidRuntime(24831): at dalvik.system.DexPathList.findClass(DexPathList.java:321)
E/AndroidRuntime(24831): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
E/AndroidRuntime(24831): ... 14 more
E/AndroidRuntime(24831): Suppressed: java.lang.ClassNotFoundException: de.companyname.appname.rebuild.AppNameActivity
E/AndroidRuntime(24831): at java.lang.Class.classForName(Native Method)
E/AndroidRuntime(24831): at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
E/AndroidRuntime(24831): at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
E/AndroidRuntime(24831): at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
E/AndroidRuntime(24831): ... 13 more
E/AndroidRuntime(24831): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
私AndroidManifest.xml
の関連部分:
<application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:isGame="false" android:banner="@drawable/app_banner">
<activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection" android:name="de.companyname.appname.rebuild.AppNameActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
(...)
</application>
ここで引数を指定してadb shell
経由でAndroidデバイス上で実行dexdump
の出力は、です/data/app/de.companyname.appname.rebuild-2/base.apk
。
sh: 0: getcwd() failed: No such file or directory
P d 465 944 66105 <TOTAL>
P d 420 454 49362 com
(...)
C d 8 10 1067 de.companyname.appname.rebuild.AppNameActivity
M d 1 1 119 de.companyname.appname.rebuild.AppNameActivity <init>()
(...)
は、だから私はクラス
de.companyname.appname.rebuild.AppNameActivity
がデバイス上に存在していることではなく確信している:
Processing './base.apk'...
Opened './base.apk', DEX version '035'
(...)
Class #69 -
Class descriptor : 'Lde/companyname/appname/rebuild/AppNameActivity;'
Access flags : 0x0001 (PUBLIC)
Superclass : 'Lde/companyname/appname/rebuild/UnityPlayerActivity;'
Interfaces -
Static fields -
#0 : (in Lde/companyname/appname/rebuild/AppNameActivity;)
name : 'ACTION_USB_PERMISSION'
type : 'Ljava/lang/String;'
access : 0x001a (PRIVATE STATIC FINAL)
#1 : (in Lde/companyname/appname/rebuild/AppNameActivity;)
name : 'TAG'
type : 'Ljava/lang/String;'
access : 0x001a (PRIVATE STATIC FINAL)
Instance fields -
#0 : (in Lde/companyname/appname/rebuild/AppNameActivity;)
name : 'mUsbManager'
type : 'Landroid/hardware/usb/UsbManager;'
access : 0x0002 (PRIVATE)
#1 : (in Lde/companyname/appname/rebuild/AppNameActivity;)
name : 'mUsbReceiver'
type : 'Landroid/content/BroadcastReceiver;'
access : 0x0012 (PRIVATE FINAL)
#2 : (in Lde/companyname/appname/rebuild/AppNameActivity;)
name : 'validProductNames'
type : 'Ljava/util/Collection;'
access : 0x0002 (PRIVATE)
Direct methods -
#0 : (in Lde/companyname/appname/rebuild/AppNameActivity;)
name : '<init>'
type : '()V'
access : 0x10001 (PUBLIC CONSTRUCTOR)
code -
registers : 4
ins : 1
outs : 2
insns size : 32 16-bit code units
catches : (none)
positions :
0x0000 line=27
0x0003 line=22
0x000a line=25
0x0018 line=28
0x001f line=29
locals :
0x0000 - 0x0020 reg=3 this Lde/companyname/appname/rebuild/AppNameActivity;
(...)
は私ももたらし、私のdevのMACHIN、上の解体を取得するためのツールAndroidSdk/tools/bin/apkanalyzer dex packages ~/src/appname/UnityExport.apk
を使用しました。
更新: Iは、エラーログに2回続けて述べているパッケージについて心配していた:{de.companyname.appname.rebuild/de.companyname.appname.rebuild.AppNameActivity}
ので、私はandroid:name="de.companyname.appname.rebuild.AppNameActivity"
からandroid:name=".AppNameActivity"
にマニフェストの値を変更しました。それでも、私は正確に同じエラーメッセージを取得します。
でした。これはAndroidスタジオで生成されたデバッグビルドですか? 'Build - > Generate Signed APK ... 'を使ってビルドを生成し、' debug'または 'release'ビルドをインストールしてみてください。それでも同じエラーが出ますか? – Henry
問題が発生したときにUnity3dでgradble build機能を使用しました。私は、Unity3dからgradleプロジェクトをエクスポートしようとしましたが、これは手動でgradleを実行することで構築できます。私がこれを行うとき、私はこの問題とは無関係なようにランタイムに他の問題に遭遇します。私は現在、そこに起こっていることを理解しようとしています。 –
私はAndroidスタジオをまだ試していませんでした - 私が知る限りは、とにかくフードの下にgradleを走らせるので、私は現在調査中の同じエラーがあると思います。とにかく、私は私の現在の実験でやってしまうとすぐにAndroid Studioを試してみます。 –