有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

即使类出现在dex反汇编中,也找不到java活动类

我正在Unity 2017.3 Beta 1中开发一款Android应用程序(我们称之为AppName)。我需要一个自定义活动来在启动时运行一些Java代码。我在一个单独的项目中有AppNameActivity的代码,该项目使用gradle将活动打包到AppName.jar文件中,然后将该文件放入Unity的AppName/Assets/Plugins/Android文件夹,以及引用它的自定义AndroidManifest.xml。我使用Unity的构建和运行功能(构建系统:Gradle,开发构建)

当我在Android设备上启动应用程序时,它会立即崩溃。看起来好像活动类不见了,但仔细观察,它确实存在

通过adb logcat我可以获得此错误:

V/ActivityThread(24831): Handling launch of ActivityRecord{2609126c token=安卓.os.BinderProxy@2101f035 {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 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381)
E/AndroidRuntime(24831):    at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2532)
E/AndroidRuntime(24831):    at 安卓.app.ActivityThread.access$900(ActivityThread.java:169)
E/AndroidRuntime(24831):    at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
E/AndroidRuntime(24831):    at 安卓.os.Handler.dispatchMessage(Handler.java:111)
E/AndroidRuntime(24831):    at 安卓.os.Looper.loop(Looper.java:194)
E/AndroidRuntime(24831):    at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968)
E/AndroidRuntime(24831):    at com.安卓.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 安卓.app.Instrumentation.newActivity(Instrumentation.java:1070)
E/AndroidRuntime(24831):    at 安卓.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 安卓:theme="@style/UnityThemeSelector" 安卓:icon="@drawable/app_icon" 安卓:label="@string/app_name" 安卓:isGame="false" 安卓:banner="@drawable/app_banner">
    <activity 安卓:label="@string/app_name" 安卓:screenOrientation="fullSensor" 安卓:launchMode="singleTask" 安卓:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection" 安卓:name="de.companyname.appname.rebuild.AppNameActivity">
      <intent-filter>
        <action 安卓:name="安卓.intent.action.MAIN" />
        <category 安卓:name="安卓.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data 安卓:name="unityplayer.UnityActivity" 安卓:value="true" />
    </activity>
    (...)
  </application>

下面是dexdump的输出,通过adb shell在Android设备上执行,参数为/data/app/de.companyname.appname.rebuild-2/base.apk

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          : 'L安卓/hardware/usb/UsbManager;'
      access        : 0x0002 (PRIVATE)
    #1              : (in Lde/companyname/appname/rebuild/AppNameActivity;)
      name          : 'mUsbReceiver'
      type          : 'L安卓/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; 
(...)

我还使用工具AndroidSdk/tools/bin/apkanalyzer dex packages ~/src/appname/UnityExport.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

更新: 我担心在错误日志中连续两次提到包:{de.companyname.appname.rebuild/de.companyname.appname.rebuild.AppNameActivity},所以我将清单中的值从安卓:name="de.companyname.appname.rebuild.AppNameActivity"更改为安卓:name=".AppNameActivity"。不过,我还是得到了完全相同的错误消息


共 (1) 个答案

  1. # 1 楼答案

    我找到了解决我自己问题的方法:我错过了一个超类

    当我尝试进行发布版本(之前,我总是尝试调试版本)时,我收到了几条错误消息,包括这一行:

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

    事实上,我在绑定AppName.jar时犯了一个错误,因此超类丢失了。我仍然对AndroidRuntime中相当不具体的运行时错误感到惊讶,它只提到了AppNameActivity

    我重建了jar和发布版本,现在这个错误被修复了,AppNameActivity被加载,它的构造函数被执行(然后在执行过程中由于一些超出范围的其他问题崩溃)

    有一段时间,我仍然不确定这整件事,因为我查看了dexdump输出(我在问题中部分引用了它),它证实了UnityPlayerActivity的存在。仔细检查后,我注意到com.unity3d.player.UnityPlayerActivity被包括在内,但实际的超类是de.companyname.appname.rebuild.UnityPlayerActivity