当前位置: 首页 > 知识库问答 >
问题:

Android版gluonfx nativePackage

澹台华晖
2023-03-14

如何为类启用multiDex,以便在DexPathList中包含或跟踪它们?

我正在使用graalvm(带有本机图像)和gluonfx nativePackage任务生成apk。

id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.3' //build.gradle

但是当我尝试访问SMS广播接收器时,我得到了DexPathList中找不到的类。。。

这是androidManifest设置。。

     <application ... package="demo"   ...>
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
        <receiver android:name=".services.SmsListener" 
                  android:enabled="true" 
                  android:exported="true"
                  android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
     </application>

当手机上的短信掉落时,我得到的错误如下...无法实例化接收器demo.services.SmsListener:java.lang.ClassNotFoundExc0019:没有找到类"demo.services.SmsListener"在路径: DexPathList[[[zip file"/data/app/.../base.apk"], nativeLibraryDirectory=[/data/app/...-g==/lib/arm64,/data/app/... g==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]

那么我如何将MultiDexEnabled True传递给android任务呢?或者有没有一种方法可以通过java代码启动这个广播类?项目结构

共有1个答案

关飞翔
2023-03-14

最初的问题是在将项目打包到最终的APK之前,向Android源代码中添加Java代码。

由于gluonfx插件还没有自动程序,因此这是一个手动过程:

>

  • 运行mvn-Pandroid gluonfx: build gluonfx: pack一次,这将在Target/gluonfx/aarch 64-android/gvm/android_project下创建Android项目。

    添加Java /Android源到Target/gluonfx/aarch 64-android/gvm/android_project/app/src/main/java

    手动构建APK:

    cd target/gluonfx/aarch64-android/gvm/android_project/
    export ANDROID_SDK_ROOT=~/.gluon/substrate/Android
    ./gradlew app:assembleDebug
    

    继续此过程:mvn-Pandroid gluonfx:安装gluonfx:运行

    虽然这允许修改Android部分,但主要的警告是,这一部分与Java/JavaFX/GraalVM部分之间缺乏通信,因此只有在Android端进行单独修改时,它才会起作用。

    为了修改Android部分并访问Java/JavaFX端,最好的方法是创建一个附加服务。

    为此,一个选项是克隆附件,添加新服务,并发布/分发此修改后的附件版本,但更好的是在附件之外创建一个自定义的附件服务。

    这个实验性存储库包含一个新服务:LogService,作为概念证明。

    自述文件已包含如何开始使用此服务的说明。

    总结如下:

    • 确保你遵循必要条件
    • 克隆仓库
    • 构建并发布到本地:./gradlew的清洁发布ToMavenlocal.
    • 请确保您在下有工件~/. m2/repository/org/jpereda/atti/log/4.0.12-SNAPSHOT
       log-4.0.12-SNAPSHOT-android.jar
       log-4.0.12-SNAPSHOT-ios.jar 
       log-4.0.12-SNAPSHOT-desktop.jar
       log-4.0.12-SNAPSHOT.jar
    

    将依赖项添加到pom。请注意,官方附加依赖项保持不变,但需要4.0.12-SNAPSHOT。

    <dependencies>
        <dependency>
            <groupId>com.gluonhq.attach</groupId>
            <artifactId>storage</artifactId>
            <version>4.0.12-SNAPSHOT</version>
        </dependency>
        ...
        <dependency>
            <groupId>org.jpereda.attach</groupId>
            <artifactId>log</artifactId>
            <version>4.0.12-SNAPSHOT</version>
        </dependency>
    </dependencies>
    
    <repositories>
            <repository>
                <id>snapshots</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            </repository>
        </repositories>
    

    请注意,由于它不是官方附加服务,因此不能使用包名com。gluonhq。附加,并且无法将其添加到附加列表。因此,它被视为常规依赖项,您需要根据目标添加平台依赖项:

    例如,对于Android:

            <profile>
                <id>android</id>
                <properties>
                    <gluonfx.target>android</gluonfx.target>
                </properties>
                <dependencies>
                    <dependency>
                        <groupId>org.jpereda.attach</groupId>
                        <artifactId>log</artifactId>
                        <version>4.0.12-SNAPSHOT</version>
                        <classifier>android</classifier>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </profile>
    

    根据您的代码,像往常一样呼叫服务:

    LogService.create().ifPresent(service -> service.log("This is a message"));
    

    例如,在Android上:

    mvn -Pandroid gluonfx:build gluonfx:package gluonfx:install gluonfx:nativerun
    

    首先,阅读https://docs.gluonhq.com/#_device_interface以便更好地了解附加服务。

    LogService项目之后,创建自己的服务应该或多或少是简单的。

    更复杂的部分是Java(11)/JavaFX/GraalVM和Java(7)/Android之间的通信,其中需要JNI。Java端是AOT编译的,并进入lib${service}。a,Android端转到Android项目,并作为${service}分发

  •  类似资料:
    • 我的布局如下,其中包含3个,它们分别对齐、和。 我现在面临的问题是,在android设备版本<6.0的情况下并不能很好地工作。我的意思是,对于版本的设备,会在达到最大宽度时中断文本,但是对于或版本的设备,可能也会更低, <罢工> 这个 故障发生后 文本和显示中的空格 ,它不会中断长文本。 下面是它在android版本中的样子,它小于: 考虑名称是FName LName 联系人:fname... 以

    • 1.3.Android的版本 同任何软件一样,Android也在不断的改进之中,其间的变化就在版本号上得以呈现。但是容易使人迷惑的是,不同版本号之间又是什么关系?在表格里看会更直观些,如下: 表格 1.1. 截至Android 3.0的Android各版本 Android 版本号 API Level 代号 Android 1.0 1 Android 1.1 2 Android 1.5 3 Cupc

    • Android Support库 22.1 原文链接 : Android Support Library 22.1 原文作者 : Ian Lake 译文出自 : 开发技术前线 www.devtf.cn 译者 : Rocko 校对者: chaossss 状态 : 校对完成 你可能听过这么一句话 “最好的代码就是没有代码。” 然而我想对你说的是:你写下的每一行代码应该能为应用增加独特的价值,而不是为应

    • 我对Android并不陌生,我很习惯于版本处理和如何调整它,但当我看到这一点时,我很困扰。。。 在Lollipop前的任何设备上,这一行都会导致应用程序崩溃,因为构建失败。版本代码。Lollipop字段不存在。。。那么,为什么在文档中推荐的解决方案中会出现这种情况呢? 我真的想知道我错过了什么?

    • 一本介绍Android 开发的入门图书,它循序渐进地介绍了如何利用Android 基本构件来创建用户界面、存储数据和执行连接网络等操作。

    • 问题内容: 如何发布项目的Jar包装? 我发现,位于下面,我想这是正确的Jar包(包含文件)。 有什么正式的方法可以将库发布为JAR而不是AAR? 编辑 我使用Gradle发行了Maven构件,并且我想连同AAR软件包一起发行JAR。因此具有签名,md5,清单… 的JAR 基于https://chris.banes.me/2013/08/27/pushing-aars-to-maven-centr