【问题标题】:Android installation is looking for classes in the wrong placeAndroid安装在错误的地方寻找类
【发布时间】:2017-03-23 11:18:53
【问题描述】:

为了解决更大的问题,我创建了一个示例应用程序,我可以在该应用程序上测试问题出在哪里。代码与单视图向导生成的代码基本一致。

当我通过appliaction > run 在桌面上启动它时,它运行良好。当我通过other > androidInstall 从我的设备运行它时,我得到一个黑屏(我也事先运行了clean)。于是我启动了adb logcat,发现了这个错误:

E DalvikLauncher: java.lang.ClassNotFoundException: 找不到类 路径上的“com.gluonapplication.GluonApplication”:DexPathList[[zip 文件 "/data/app/com.gluonapplication-1/base.apk"],nativeLibraryDirectories=[/data/app/com.gluonapplication-1/lib/arm, /data/app/com.gluonapplication-1/base.apk!/lib/armeabi, /vendor/lib, /system/lib]]

这并不奇怪,因为那里没有课程。主类位于main.GluonApplication(可能是错误的包名,但它是测试应用程序)。 build.gradle 专门指定 mainClassName = 'main.GluonApplication'。那么为什么Android版本会在其他地方寻找呢?是否有我需要编辑/重新创建的清单?是否在以前版本的应用程序可能驻留并影响当前版本的地方进行了某种缓存?

【问题讨论】:

    标签: gluon-mobile


    【解决方案1】:

    每当您使用 IDE 插件创建项目时,都会有一个默认清单 AndroidManifest.xml,添加到 src/android/ 文件夹中。

    如果你打开它,你会发现分配的包名,这将匹配主类的包,以及它的全名。

    根据您在日志中找到的内容,这将是您当前的清单:

    <?xml version="1.0" encoding="UTF-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
              package="com.gluonapplication" 
              android:versionCode="1" 
              android:versionName="1.0">
            <supports-screens android:xlargeScreens="true"/>
            <uses-permission android:name="android.permission.INTERNET"/>
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
            <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="21"/>
            <application android:label="GluonApplication" android:name="android.support.multidex.MultiDexApplication" android:icon="@mipmap/ic_launcher">
                    <activity android:name="javafxports.android.FXActivity" android:label="GoNative" android:configChanges="orientation|screenSize">
                            <meta-data android:name="main.class" android:value="com.gluonapplication.GluonApplication"/>
                            <meta-data android:name="debug.port" android:value="0"/>
                            <intent-filter>
                                    <action android:name="android.intent.action.MAIN"/>
                                    <category android:name="android.intent.category.LAUNCHER"/>
                            </intent-filter>
                    </activity>
            </application>
    </manifest>
    

    只需确保包名与真实包名匹配,否则进行必要的更改。

    另请注意,在 Android 上,有效的包名称至少需要两个单词和一个点,例如 com.gluonapplication

    【讨论】:

    • 嗯,如果我在 gradle 文件中指定混合和目标 SDK 版本是什么?并且不能从带有包和版本信息的 gradle 文件中自动更新清单吗?
    • 关于包名:我刚刚将清单 packageandroid:value 更改为我的 main.GluonApplication 并且它有效。因此,当您说“至少 2 个词”时,您的意思是 package.subPackage.Class 还是 package.Class 足够?
    • 包名用于在Google Play中唯一标识你的应用,建议使用反向域名,至少需要两个段/词。
    • 关于您的第一条评论,一旦您有了默认清单,就不会从构建文件中对其进行编辑,因此您必须自己进行编辑。如果您删除该清单,则会创建一个新清单,其中包含构建文件中的值。
    猜你喜欢
    • 2013-01-25
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多