2017-11-07 11 views
0

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"にマニフェストの値を変更しました。それでも、私は正確に同じエラーメッセージを取得します。

+0

でした。これはAndroidスタジオで生成されたデバッグビルドですか? 'Build - > Generate Signed APK ... 'を使ってビルドを生成し、' debug'または 'release'ビルドをインストールしてみてください。それでも同じエラーが出ますか? – Henry

+0

問題が発生したときにUnity3dでgradble build機能を使用しました。私は、Unity3dからgradleプロジェクトをエクスポートしようとしましたが、これは手動でgradleを実行することで構築できます。私がこれを行うとき、私はこの問題とは無関係なようにランタイムに他の問題に遭遇します。私は現在、そこに起こっていることを理解しようとしています。 –

+0

私はAndroidスタジオをまだ試していませんでした - 私が知る限りは、とにかくフードの下にgradleを走らせるので、私は現在調査中の同じエラーがあると思います。とにかく、私は私の現在の実験でやってしまうとすぐにAndroid Studioを試してみます。 –

答えて

0

私自身の問題に対する解決策を見つけました。私はスーパークラスを欠いていました。私はリリースビルドを作ってみました

、私はこの行を含むいくつかのエラーメッセージを、得た(前、私はいつもデバッグがを構築しようとした):

実際に

Warning: de.companyname.appname.rebuild.AppNameActivity: can't find superclass or interface de.companyname.appname.rebuild.UnityPlayerActivity

、I AppName.jarをバンドルしている間に間違いを犯し、スーパークラスが見つからないようにしました。私はまだAppNameActivityを指摘したAndroidRuntimeからのむしろ不特定のランタイムエラーについて驚いています。

私はjarリリースビルドを再構築し、今、このエラーが固定され、AppNameActivityがロードされ、それのコンストラクタが実行され(その後、原因範囲を超えているいくつかの他の問題に実行時にクラッシュします)。私はUnityPlayerActivityの存在を確認した(私は私の質問に、部分的に引用された)dexdump古い出力を見ているので瞬間のために

は、私はまだこの全体のことについて不明な点でした。詳細を確認すると、com.unity3d.player.UnityPlayerActivityが含まれていましたが、実際のスーパークラスはde.companyname.appname.rebuild.UnityPlayerActivity

関連する問題