D on android and d_android

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Apr 7 14:51:15 UTC 2020


On Tue, Apr 07, 2020 at 12:43:20PM +0000, Adam D. Ruppe via Digitalmars-d-learn wrote:
> On Monday, 6 April 2020 at 08:38:03 UTC, Jan Hönig wrote:
> > Is there some "Hello World!" example for D on Android?
[...]
> > However there is just so much to know.
> > It is really overwhelming.
> 
> no kidding, I spent several weekends just trying to understand the
> setup and build process. And I still basically don't really know,
> which is why my thing there builds the D code externally and copies
> the files where gradle can find them instead of actually changing the
> gradle config.

I managed to build APKs without Gradle (yes, I'm crazy like that). There
are several steps, and you do need some tools from the Android SDK/NDK,
namely aapt, apksigner, dx (called dalvik-exchange on some distros),
zipalign, and a Java 1.7 compiler (the last time I checked; maybe they
support 1.8 now, I don't know).

I haven't tried a native app so far, so the way I set it up is to create
a dummy Java wrapper that contains main() that calls native methods that
are implemented in D.  You can use Adam's jni.d to generate
implementations for your native methods.

Steps:

1) Follow LDC wiki to build an Android cross-compiler and cross-compiled
   LDC libraries (this may already be prepackaged with the latest LDC
   releases). Most important thing you need is the path to the droid32
   or droid64 directories containing the libraries libdruntime-ldc.a,
   libphobos2-ldc.a, libdruntime-ldc-debug.a, libphobos2-ldc-debug.a.

	DROID32_PATH=/usr/src/d/android/droid32/lib	# for example

2) Generate R.java:

	TARGET_API_LEVEL=23 # for example
	/usr/bin/aapt package -f -m -M AndroidManifest.xml -S res -I ${PATH_TO_ANDROID_SDK}/platforms/android-${TARGET_API_LEVEL}/android.jar -J ${PATH_TO_JAVA_SOURCE_CODE}

3) Compile Java sources:

	/usr/bin/javac -source 1.7 -target 1.7 -bootclasspath ${PATH_TO_ANDROID_SDK}/platforms/android-${TARGET_API_LEVEL}/android.jar -d obj -sourcepath src ${JAVA_SOURCE_FILES (including R.java)}

4) Generate classes.dex (on some systems dalvik-exchange might be called
simply 'dx'):

	/usr/bin/dalvik-exchange --dex --output=classes.dex ${PATH_TO_OBJ_DIR}

5) Setup linker config file (for optimizing apk size):

	LINKER_VERSION_FILE=lib${YOUR_APP_NAME}.version
	cat > $LINKER_VERSION_FILE
	LIBGAME_1.0 {
		global:
			Java_*;
		local:
			*;
	};

6) Cross-compile D code with LDC:

	${PATH_TO_LDC}/bin/ldmd2 -c -mtriple=armv7-none-linux-androideabi -mcpu=cortex-a8 -L-L${DROID32_PATH}/lib -Xcc=-fpie -Xcc=-pie -Xcc=--sysroot=${PATH_TO_ANDROID_NDK}/platforms/android-${TARGET_API_LEVEL}/arch-arm -Xcc=-fuse-ld=bfd -Xcc=-gcc-toolchain -Xcc=${PATH_TO_ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -Xcc=-target -Xcc=armv7-none-linux-androideabi -O4 -inline -Isrc/d -od${PATH_TO_OBJ_DIR} ${D_SOURCE_FILES}
	${PATH_TO_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -Wl,-soname,lib${YOUR_APP_NAME}.so -shared -Wl,--gc-sections -Wl,--version-script=${LINKER_VERSION_FILE} -llog -landroid -lEGL -lGLESv2 --sysroot=${PATH_TO_ANDROID_NDK}/platforms/android-${TARGET_API_LEVEL}/arch-arm -fuse-ld=bfd -gcc-toolchain ${PATH_TO_ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -target armv7-none-linux-androideabi ${D_OBJECT_FILES} ${DROID32_PATH}/lib/libphobos2-ldc.a ${DROID32_PATH}/lib/libdruntime-ldc.a -o lib/armeabi-v7a/lib${YOUR_APP_NAME}.so

7) Create unaligned APK:
	/usr/bin/aapt package -f -m -M AndroidManifest.xml -S res -I ${PATH_TO_ANDROID_SDK}/platforms/android-${TARGET_API_LEVEL}/android.jar -F bin/${YOUR_APP_NAME}.unaligned.apk
	/usr/bin/aapt add bin/${YOUR_APP_NAME}.unaligned.apk classes.dex
	/usr/bin/aapt add bin/${YOUR_APP_NAME}.unaligned.apk lib/armeabi-v7a/lib${YOUR_APP_NAME}.so

8) Sign the APK:
	/usr/bin/apksigner sign --ks-pass file:${YOUR_SIGNING_KEY_PASSWORD_FILE} --ks ${YOUR_SIGNING_KEY_STORE_FILE} bin/${YOUR_APP_NAME}.unaligned.apk

9) Align the APK:
	/usr/bin/zipalign -f 4 bin/${YOUR_APP_NAME}.unaligned.apk bin/${YOUR_APP_NAME}.apk

10) Copy bin/${YOUR_APP_NAME}.apk to your device and install it.


T

-- 
The two rules of success: 1. Don't tell everything you know. -- YHL


More information about the Digitalmars-d-learn mailing list