如何为类启用multiDex,以便在DexPathList上包含或跟踪它们?
我使用graalvm (带有本机映像)和gluonfx nativePackage任务来生成apk。
id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.3' //build.gradle但是当我试图访问一个短消息BroadcastReceiver时,我在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>我在手机上发短信时遇到的错误如下..无法实例化接收方nativeLibraryDirectories=/data/app/...-g==/lib/arm64,:java.lang.ClassNotFoundException:没有在路径上找到类"demo.services.SmsListener“:DexPathList[zip file”/data/app/./base.apk“,DexPathList/data/app/.g==/base.apk!/lib/arm64-v8a,/system/lib 64,/system_ext/lib 64]
那么,我如何将MultiDexEnabled True传递给安卓任务呢?或者有什么方法可以通过java代码启动这个广播类?项目结构
发布于 2021-08-06 17:08:01
最初的问题是在将项目打包到最终的APK之前,将Java代码添加到Android源代码中。
修改Android项目
由于还没有来自gluonfx插件的自动过程,这是一个手动过程:
mvn -Pandroid gluonfx:build gluonfx:package一次,这将创建target/gluonfx/aarch64-android/gvm/android_project下的Android项目。target/gluonfx/aarch64-android/gvm/android_project/app/src/main/java中mvn -Pandroid gluonfx:install gluonfx:run虽然这允许修改Android部件,但主要的警告是,这端与Java/JavaFX/GraalVM部件之间缺乏通信,因此只有在Android端是一个孤立的修改的情况下,它才能工作。
创建自定义附加服务
为了修改Android部件并访问Java/JavaFX端,最好的方法是创建一个附加服务。
为此,一个选项是克隆附加,添加新服务,并发布/分发这个修改后的附加版本,但更好的方法是在附加之外创建一个自定义附加服务。
LogService
这个实验性的存储库包含一个新的服务:LogService,作为概念的证明。
自述文件已经包含了有关如何开始和使用此服务的说明。
构建服务
概括如下:
./gradlew clean publishToMavenLocal。~/.m2/repository/org/jpereda/attach/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在项目中使用LogService
假设您正在运行HelloGluon:
pom
将依赖项添加到pom中。请注意,正式的附加依赖项保持不变,但需要4.0.12-快照。
<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.attach,也不能添加到attachList中。因此,它被视为一个常规依赖项,您需要根据目标添加平台依赖项:
例如,对于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创建您自己的服务
首先,阅读接口以更好地理解附加服务。
遵循LogService 项目,创建自己的服务应该比较简单。
更复杂的部分是Java(11+)/JavaFX/GraalVM与Java(7)/Android之间的通信,其中需要JNI。Java端是编译后进入lib${service}.a的AOT,而安卓端则以${service}>.aar的形式发布到Android项目中,没有JavaFX支持。
https://stackoverflow.com/questions/68623490
复制相似问题