Mani kandan
Mani kandan

Reputation: 53

Building Signed APK of Javafx application with GluonFX plugin

I am using HelloFX project from gluon-samples repository. I've used a keystore (which was generated for a different project) and tried to build APK of this app.

COMPILE TASK and LINK TASK completed successfully. But PACKAGE TASK failed with following log message.

Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]   Caused by: com.android.builder.errors.EvalIssueException: Failed to parse XML in /home/manikandan/eclipse-workspace/HelloFX - Build signed APK/target/gluonfx/aarch64-android/gvm/android_project/app/src/main/AndroidManifest.xml
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]   The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.builder.errors.IssueReporter.reportError(IssueReporter.kt:106)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.builder.errors.IssueReporter.reportError$default(IssueReporter.kt:102)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.builder.errors.IssueReporter.reportError(IssueReporter.kt)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.build.gradle.internal.ide.ModelBuilder.createVariant(ModelBuilder.java:616)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.build.gradle.internal.ide.ModelBuilder.buildAndroidProject(ModelBuilder.java:361)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.build.gradle.internal.ide.ModelBuilder.buildAll(ModelBuilder.java:195)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at com.android.build.gradle.internal.AppModelBuilder.buildAll(AppModelBuilder.kt:63)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.tooling.provider.model.internal.DefaultToolingModelBuilderRegistry$BuildOperationWrappingToolingModelBuilder$1$1.create(DefaultToolingModelBuilderRegistry.java:104)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.api.internal.project.DefaultProjectStateRegistry.withLenientState(DefaultProjectStateRegistry.java:134)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.tooling.provider.model.internal.DefaultToolingModelBuilderRegistry$BuildOperationWrappingToolingModelBuilder$1.call(DefaultToolingModelBuilderRegistry.java:100)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
[Mon Jan 03 19:06:32 IST 2022][FINE] [SUB]      at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)

Full log can be found here.

Following is the pom.xml file.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>hellofx</groupId>
    <artifactId>hellofx</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>HelloFX</name>

    <properties>
        <main.class>hellofx.HelloFX</main.class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.release>11</maven.compiler.release>
        <javafx.version>15.0.1</javafx.version>
        <javafx.maven.plugin.version>0.0.6</javafx.maven.plugin.version>
        <gluonfx.version>1.0.10</gluonfx.version>
        <charm.version>6.0.6</charm.version>
        <glisten.afterburner.version>2.0.5</glisten.afterburner.version>
        <attach.version>4.0.10</attach.version>
        <connect.version>2.0.1</connect.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>

        <!-- Added jackson dependency here -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.1</version>
        </dependency>
        <!-- Added JavaTime data type -->
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.12.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>

            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx.maven.plugin.version}</version>
                <configuration>
                    <mainClass>${main.class}</mainClass>
                </configuration>
            </plugin>

            <plugin>
                <groupId>com.gluonhq</groupId>
                <artifactId>gluonfx-maven-plugin</artifactId>
                <version>${gluonfx.version}</version>
                <configuration>
                     <target>${gluonfx.target}</target>
                     <mainClass>${main.class}</mainClass>
                     <reflectionList>
                        <list>com.fasterxml.jackson.core.JsonFactory</list>
                     </reflectionList>
                     <nativeImageArgs>
                        <nativeImageArg>--allow-incomplete-classpath</nativeImageArg>
                     </nativeImageArgs>
                     <releaseConfiguration>
                          <providedKeyStorePath>${keystore.path}</providedKeyStorePath>
                          <providedKeyStorePassword>${keystore.password}</providedKeyStorePassword>
                          <providedKeyAlias>${key.alias}</providedKeyAlias>
                          <providedKeyAliasPassword>${key.password}</providedKeyAliasPassword>
                      </releaseConfiguration>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>desktop</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <client.target>host</client.target>
            </properties>
        </profile>
        <profile>
            <id>ios</id>
            <properties>
                <gluonfx.target>ios</gluonfx.target>
            </properties>
        </profile>
        <profile>
            <id>android</id>
            <properties>
                <gluonfx.target>android</gluonfx.target>
                <keystore.path>/keystore/path/keystore.jks</keystore.path>
                <keystore.password>someKeystorePath</keystore.password>
                <key.alias>someKeyAlias</key.alias>
                <key.password>someKeyPath</key.password>
            </properties>
        </profile>
    </profiles>

</project>

Following is the AndroidManifest file:-

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hellofx" android:versionCode="3" android:versionName="1.0">
  <supports-screens android:xlargeScreens="true" />

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />]
  <uses-permission android:name="android.permission.CALL_PHONE" />
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />

  <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />

  <application android:label="Forest Parent" android:icon="@mipmap/ic_launcher">
        <!-- Below one is for solving apache commons logger issue -->
        <uses-library android:name="org.apache.http.legacy" android:required="false" />
        <activity android:name='com.gluonhq.helloandroid.MainActivity'
                  android:configChanges="orientation|keyboardHidden"
                  android:launchMode="singleTop">
             <intent-filter>
                <category android:name='android.intent.category.LAUNCHER'/>
                <action android:name='android.intent.action.MAIN'/>
             </intent-filter>
             <intent-filter>
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.BROWSABLE" />
             </intent-filter>
        </activity>
        <activity android:name='com.gluonhq.impl.attach.android.PermissionRequestActivity'/>
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
                android:exported="true"
                android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
          <action android:name="com.google.android.c2dm.intent.RECEIVE" />
          <category android:name="com.fivedtech.parent.app.forestse" />
        </intent-filter>
      </receiver>
      <service android:name="com.gluonhq.helloandroid.PushFcmMessagingService">
        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
      </service>
      <service android:name="com.gluonhq.helloandroid.PushInstanceIdService">
        <intent-filter>
          <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
      </service>
      <service android:name="com.google.firebase.components.ComponentDiscoveryService">
        <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar"
                   android:value="com.google.firebase.components.ComponentRegistrar"/>
      </service>
      <service android:name="com.gluonhq.helloandroid.PushNotificationJobService"
               android:permission="android.permission.BIND_JOB_SERVICE"
               android:exported="true" />
      <activity android:name="com.gluonhq.helloandroid.PushNotificationActivity"
                android:parentActivityName="com.gluonhq.helloandroid.MainActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                       android:value="com.gluonhq.helloandroid.MainActivity"/>
      </activity>
    </application>

</manifest>

Why does this issue occur and how to fix this?

And another doubt, does current version of gluonfx plugin use files under /target folder or the files under actual project while building APK?

Upvotes: 0

Views: 161

Answers (0)

Related Questions