Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using native-image and Android apk files. #8941

Closed
maryammsd opened this issue May 19, 2024 · 3 comments
Closed

Using native-image and Android apk files. #8941

maryammsd opened this issue May 19, 2024 · 3 comments

Comments

@maryammsd
Copy link

GraalVM Native Image Error Report

Build Output

========================================================================================================================
GraalVM Native Image: Generating 'native-image' (executable)...
========================================================================================================================
[1/8] Initializing...                                                                                    (0.0s @ 0.35GB)

Stack Trace

java.lang.NoClassDefFoundError: android/app/Application
	at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
	at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578)
	at java.base/java.lang.Class.getDeclaredMethod(Class.java:2846)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:461)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:720)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:142)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:97)
Caused by: java.lang.ClassNotFoundException: android.app.Application
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageClassLoader.loadClass(NativeImageClassLoader.java:652)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	... 7 more
Caused by:
java.lang.NoClassDefFoundError: android/app/Application
	at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
	at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578)
	at java.base/java.lang.Class.getDeclaredMethod(Class.java:2846)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:461)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:720)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:142)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:97)
Caused by: java.lang.ClassNotFoundException: android.app.Application
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageClassLoader.loadClass(NativeImageClassLoader.java:652)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	... 7 more

GraalVM Setup

Name Value
Java version 21.0.1+12
Vendor version GraalVM CE 21.0.1-dev+12.1
Runtime version 21.0.1+12-jvmci-23.1-b22
GraalVM release file
IMPLEMENTOR="GraalVM Community"
JAVA_RUNTIME_VERSION="21.0.1+12-jvmci-23.1-b22"
JAVA_VERSION="21.0.1"
JAVA_VERSION_DATE="2023-10-17"
LIBC="gnu"
MODULES="java.base java.logging jdk.internal.vm.ci jdk.unsupported org.graalvm.collections java.management jdk.management org.graalvm.truffle.compiler org.graalvm.word jdk.internal.vm.compiler com.oracle.graal.graal_enterprise org.graalvm.nativeimage com.oracle.svm.enterprise.truffle com.oracle.svm.extraimage_enterprise com.oracle.svm.svm_enterprise com.oracle.svm_enterprise.ml_dataset java.transaction.xa java.xml java.sql jdk.jfr org.graalvm.polyglot java.datatransfer java.prefs java.desktop org.graalvm.truffle org.graalvm.jniutils org.graalvm.truffle.runtime com.oracle.truffle.enterprise com.oracle.truffle.enterprise.svm java.compiler java.instrument java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.jvmstat jdk.attach jdk.charsets jdk.internal.opt jdk.zipfs jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.graal.compiler jdk.graal.compiler.management jdk.hotspot.agent jdk.httpserver jdk.incubator.vector jdk.internal.le jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jlink jdk.jpackage jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.random jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom org.graalvm.extraimage.builder org.graalvm.extraimage.librarysupport org.graalvm.locator org.graalvm.sdk"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:git:b04c6ce11eae+ labsjdk-builder:1b5943f0f992bfdfd964593195aeaff9cdd16e27 compiler:81aafab919601dfac922a20219ed6ce66bbdbce2 java-benchmarks:81aafab919601dfac922a20219ed6ce66bbdbce2 regex:81aafab919601dfac922a20219ed6ce66bbdbce2 sdk:81aafab919601dfac922a20219ed6ce66bbdbce2 substratevm:81aafab919601dfac922a20219ed6ce66bbdbce2 truffle:81aafab919601dfac922a20219ed6ce66bbdbce2 vm:81aafab919601dfac922a20219ed6ce66bbdbce2"
GRAALVM_VERSION="24.0.0-dev"
COMMIT_INFO={"compiler": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}, "java-benchmarks": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}, "regex": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}, "sdk": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}, "substratevm": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}, "truffle": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}, "vm": {"commit.committer": "Andreas Woess <andreas.woess@oracle.com>", "commit.committer-ts": 1697419751, "commit.rev": "81aafab919601dfac922a20219ed6ce66bbdbce2"}}

Builder Setup

Class path
/home/maryam/bin/work/output.jar
Module path
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/library-support.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/truffle/truffle-api.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/truffle/truffle-runtime.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/truffle/truffle-compiler.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/truffle/builder/truffle-runtime-svm.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/javacpp-platform-specific-shadowed.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/objectfile.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/native-image-base.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/pointsto.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/svm.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/svm-llvm.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/llvm-wrapper-shadowed.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/llvm-platform-specific-shadowed.jar
/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/builder/javacpp-shadowed.jar
Builder arguments
-H:CLibraryPath=/home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/clibraries/linux-amd64
-H:Path@driver=/home/maryam/bin/work
-H:GenerateDebugInfo@user+api=2
-H:Optimize@user+api=0
-H:FallbackThreshold@user+api=0
-H:+DumpTargetInfo@user+api
-H:+ReportUnsupportedElementsAtRuntime@user+api
-H:Name@manifest from file:///home/maryam/bin/work/output.jar=output
-H:Class@manifest from file:///home/maryam/bin/work/output.jar=dummyMainClass
-H:Name@explicit image name=native-image
-H:ImageBuildID@driver=6c12f068-7ec9-adf0-0bdf-12d55b801907
-H:Features@jar:file:///home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/library-support.jar!/META-INF/native-image/com.oracle.svm/thirdparty/native-image.properties+api=com.oracle.svm.thirdparty.gson.GsonFeature
-H:Features@jar:file:///home/maryam/bin/work/graal/sdk/mxbuild/linux-amd64/GRAALVM_ADA80BB007_JAVA21/graalvm-ada80bb007-java21-24.0.0-dev/lib/svm/library-support.jar!/META-INF/native-image/com.oracle.svm/polyglot/native-image.properties+api=com.oracle.svm.polyglot.groovy.GroovyIndyInterfaceFeature,com.oracle.svm.polyglot.scala.ScalaFeature
-H:Color@driver=always
-H:+BuildOutputProgress@driver
-H:+BuildOutputLinks@driver
Builder properties
-Dcom.oracle.graalvm.isaot=true
-Dgraalvm.ForcePolyglotInvalid=true
-Dgraalvm.locatorDisabled=true
-Djava.awt.headless=true
-Djava.lang.invoke.InnerClassLambdaMetafactory.initializeLambdas=false
-Djava.system.class.loader=com.oracle.svm.hosted.NativeImageSystemClassLoader
-Djdk.internal.lambda.disableEagerInitialization=true
-Djdk.internal.lambda.eagerlyInitialize=false
-Djdk.module.main=org.graalvm.nativeimage.builder
-Djdk.reflect.useOldSerializableConstructor=true
-Dorg.graalvm.vendor=GraalVM Community
-Dorg.graalvm.vendorurl=https://www.graalvm.org/
-Dorg.graalvm.vendorversion=GraalVM CE 21.0.1-dev+12.1
-Dorg.graalvm.version=24.0.0-dev
-Dsubstratevm.HostLibC=glibc
-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime
-Dtruffle.TrustAllTruffleRuntimeProviders=true

Hello, I wanna use GraalVM to get the binary of an Android apk file for performing static analysis. Since Android apps do not have a main method, I tried to modify the Android APK file with soot that adds dummyMainMethod, get .class files, modify the name of dummyMainMethod to main, and repack .class files to a jar file.
I know the jar is not executable, and that is not my concern right now ( ;) )since I just want to get the binary and do some static analysis :D. However, when I use native-image, I get the error of java.lang.NoClassDefFoundError: android/app/Application
since native-image and JVM are not built with Android packages and classes. I was wondering whether there is any easy way to use --module-path and --add-modules to resolve this issue. Looking forward to your feedback and help :)

Features enabled
*FeatureHandler not present.*
@sgammon
Copy link

sgammon commented May 19, 2024

The Android SDK is required to build an Android application. The SDK is typically provided in a developer's environment, and helps assemble the APK; the Android Runtime then takes over to run the application, and probably provides this class.

GraalVM builds ahead of time (AOT), and, unless it is given access to the Android runtime, it probably won't be able to find those classes, as you've seen here.

What are you trying to accomplish? Android applications run on the Dalvik VM, which executes Java bytecode. I don't think it is possible to natively compile an Android application. It may be possible to build shared libraries and use them on Android.

@maryammsd
Copy link
Author

maryammsd commented May 20, 2024

Thanks for your reply. I want to get the LLVM bitcode of an Android apk file to analyze the app with a static analysis tool called ClearBlue that does so on LLVM IR.
As an Android app is implemented in Java, I thought I could take advantage of GraalVM.
First Challenge: I had to add a main method to an Android app and get jar/class files to use GraalVM. Since Android apps are event-driven and we do not have a main method, I leveraged soot and FlowDroid, which constructs a dummy main method over approximating the callback functions in an app. With FlowDroid, I got a dummy main and packed the Android .class files with a main method into a jar file.
Second Challenge: With GraalVM, I was thinking of just getting either the binary or LLVM bitcode. If I get the binary, I can use other tools to get the app's LLVM bitcode.
Just consider that this is just a research kind of task, and I do not want to get a stable binary of apk with GraalVM. There are several Android platform jar files available and I can identify the proper Android SDK version of an app from apk. Do you have any suggestions on how I can use GraalVM to achieve my goal?

@selhagani
Copy link
Member

Hi @maryammsd,
Thank you for reaching out to us! Unfortunately, we are unable to assist with that issue at the moment, as we do not support matters related to Android. However, I recommend getting in touch with the Gluon team for further assistance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants