Updated steps

Ferdinand E. Silva
2024-12-02 11:50:06 +08:00
parent 2d5aebfab2
commit 246b424a0a

@ -6,15 +6,18 @@ This is simple as in we're just using shell commands, no cmake, no builders of a
## Initial folder setup ## Initial folder setup
> Note: project.c is copied from raylib/templates/simple_game/simple_game.c > Note: project.c is copied from raylib/examples/examples_template.c
/toolchain_arm_api28 put android_toolchain_arm_api28 here
/raylib put raylib here /raylib put raylib here
/project1/lib /project1/lib
/project1/obj /project1/obj
/project1/src /project1/src
/project1/dex /project1/dex
/project1/res/values/strings.xml /project1/res/values/strings.xml
/project1/res/drawable-hdpi
/project1/res/drawable-ldpi
/project1/res/drawable-mdpi
/project1/res/drawable-xhdpi
/project1/assets /project1/assets
/project1/project.c /project1/project.c
/project1/AndroidManifest.xml /project1/AndroidManifest.xml
@ -46,8 +49,12 @@ This is simple as in we're just using shell commands, no cmake, no builders of a
<?xml version='1.0' encoding="utf-8" ?> <?xml version='1.0' encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package='com.seth.project' android:versionCode='0' <manifest xmlns:android="http://schemas.android.com/apk/res/android" package='com.seth.project' android:versionCode='0'
android:versionName='0' > android:versionName='0' >
<application> <uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="30" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="com.seth.project.NativeLoader" <activity android:name="com.seth.project.NativeLoader"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTask" android:launchMode="singleTask"
@ -63,131 +70,122 @@ This is simple as in we're just using shell commands, no cmake, no builders of a
## Outline of the Process ## Outline of the Process
cp Copy libs from raylib to lib cp Copy libs from raylib to lib and copy icons from raylib/logo to res
gcc Gen native_app_glue.o from raylib clang Gen native_app_glue.o from raylib
ar rcs Gen obj/libnative_app_glue.a from native_app_glue.o llvm-ar rcs Gen obj/libnative_app_glue.a from native_app_glue.o
gcc Gen project.o from project.c clang Gen project.o from project.c
gcc Gen lib/libproject.so from obj/project.o clang Gen lib/libproject.so from obj/project.o
aapt package Gen R.java aapt package Gen R.java
javac Gen classes from R.java and NativeLoader.java javac Gen classes from R.java and NativeLoader.java
dx Gen classes.dex from objects zip Gen zip file from obj directory
d8 Gen classes.dex from objects inside zip file (Replaced dx)
unzip Extract classes.dex file
mv Move classes.dex file to dex directory
aapt package Gen project.unsigned.apk aapt package Gen project.unsigned.apk
aapt add Add shared library to project.unsigned.apk aapt add Add shared library to project.unsigned.apk
keytool Generate keystore keytool Generate keystore
jarsigner Gen project.signed.apk
zipalign Align project zipalign Align project
apksigner Gen project.apk (Replaced jarsigner)
adb install Install project adb install Install project
adb logcat view log adb logcat view log
## Install Standalone Toolchain ## Install Standalone Toolchain
Install ndk-bundle using Android Studio. Install this in t Install ndk-bundle using Android Studio.
~/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-28 --install-dir=./toolchain_arm_api28
## Install raylib ## Install raylib
Compile raylib into ./raylib Compile raylib into ./raylib
## ~/.bash_profile ## ~/.zprofile
> Add these files to path so you won't have a big headache later on > Add these files to path so you won't have a big headache later on
export ANDROID_SDK_ROOT="/Users/watchmyfeet/Library/Android/sdk" export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk
export PATH="${ANDROID_SDK_ROOT}/build-tools/27.0.3/:$PATH" export PATH=$PATH:$ANDROID_SDK_ROOT/emulator
export PATH="${ANDROID_SDK_ROOT}/tools:$PATH" export PATH=$PATH:$ANDROID_SDK_ROOT/build-tools/36.0.0-rc1
export PATH="${ANDROID_SDK_ROOT}/tools/bin:$PATH" export PATH=$PATH:$ANDROID_SDK_ROOT/tools
export PATH="${ANDROID_SDK_ROOT}/platform-tools:$PATH" export PATH=$PATH:$ANDROID_SDK_ROOT/tools/bin
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools
export ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/28.0.12674087
export PATH=$PATH:$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64/bin
## Initial Project Setup ## Initial Project Setup
> Note: Keytool is in java folder on system > Note: Keytool is in java folder on system
cd project1 cd project1
mkdir lib/armeabi-v7a mkdir lib/arm64-v8a
cp ../raylib/src/libraylib.a lib/armeabi-v7a/libraylib.a cp ../raylib/src/libraylib.a lib/arm64-v8a/libraylib.a
cp ../raylib/logo/raylib_72x72.png res/drawable-hdpi/icon.png
cp ../raylib/logo/raylib_36x36.png res/drawable-ldpi/icon.png
cp ../raylib/logo/raylib_48x48.png res/drawable-mdpi/icon.png
cp ../raylib/logo/raylib_96x96.png res/drawable-xhdpi/icon.png
keytool -genkeypair -validity 1000 -dname "CN=seth,O=Android,C=ES" -keystore project.keystore -storepass 'mypass' -keypass 'mypass' -alias projectKey -keyalg RSA keytool -genkeypair -validity 1000 -dname "CN=seth,O=Android,C=ES" -keystore project.keystore -storepass 'mypass' -keypass 'mypass' -alias projectKey -keyalg RSA
## Build Script ## Build Script
> Note: Here's step by step commands which lead to the installation of your project! > Note: Here's step by step commands which lead to the installation of your project!
../toolchain_arm_api28/bin/arm-linux-androideabi-gcc -c ../raylib/src/external/android/native_app_glue/android_native_app_glue.c -o obj/native_app_glue.o -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=28 aarch64-linux-android29-clang -c ../raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c -o obj/native_app_glue.o -std=c99 -march=armv8-a -mfix-cortex-a53-835769 -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=29
# Requires: folder setup # Requires: folder setup
# Creates: obj/native_app_glue.o # Creates: obj/native_app_glue.o
# Note: This gcc uses other tools in the same toolchain folder structure, don't even thing about symlinking to it.
../toolchain_arm_api28/bin/arm-linux-androideabi-ar rcs obj/libnative_app_glue.a obj/native_app_glue.o llvm-ar rcs obj/libnative_app_glue.a obj/native_app_glue.o
# Requires: obj/native_app_glue.o # Requires: obj/native_app_glue.o
# Creates: obj/libnative_app_glue.a # Creates: obj/libnative_app_glue.a
../toolchain_arm_api28/bin/arm-linux-androideabi-gcc -c project.c -o obj/project.o -I. -I../raylib/src -I../raylib/src/external/android/native_app_glue -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=28 --sysroot=../toolchain_arm_api28/sysroot aarch64-linux-android29-clang -c project.c -o obj/project.o -I. -I../raylib/src -I../raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/ -std=c99 -march=armv8-a -mfix-cortex-a53-835769 -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=29 --sysroot=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64/sysroot
# Requires: project.c # Requires: project.c
# Creates: obj/project.o # Creates: obj/project.o
../toolchain_arm_api28/bin/arm-linux-androideabi-gcc -o lib/armeabi-v7a/libproject.so obj/project.o -shared -I. -I../raylib/src -I../raylib/src/external/android/native_app_glue -Wl,-soname,libproject.so -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -u ANativeActivity_onCreate -L. -Lobj -Llib/armeabi-v7a -lraylib -lnative_app_glue -llog -landroid -lEGL -lGLESv2 -lOpenSLES -latomic -lc -lm -ldl aarch64-linux-android29-clang -o lib/arm64-v8a/libproject.so obj/project.o -shared -I. -I../raylib/src -I../raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity -Wl,-soname,libproject.so -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -u ANativeActivity_onCreate -L. -Lobj -Llib/arm64-v8a -lraylib -lnative_app_glue -llog -landroid -lEGL -lGLESv2 -lOpenSLES -latomic -lc -lm -ldl
# Requires: obj/project.o # Requires: obj/project.o
# Creates: lib/armeabi-v7a/libproject.so # Creates: lib/arm64-v8a/libproject.so
aapt package -f -m -S res -J src -M AndroidManifest.xml -I ${ANDROID_SDK_ROOT}/platforms/android-28/android.jar aapt package -f -m -S res -J src -M AndroidManifest.xml -I ${ANDROID_SDK_ROOT}/platforms/android-29/android.jar
# Requires: AndroidManifest.xml, res/ # Requires: AndroidManifest.xml, res/
# Creates: src/com/seth/project/R.java # Creates: src/com/seth/project/R.java
javac -verbose -source 1.7 -target 1.7 -d obj -bootclasspath `/usr/libexec/java_home`/jre/lib/rt.jar -classpath ${ANDROID_SDK_ROOT}/platforms/android-28/android.jar:obj -sourcepath src src/com/seth/project/R.java src/com/seth/project/NativeLoader.java javac -verbose -source 1.7 -target 1.7 -d obj -bootclasspath `/usr/libexec/java_home`/jre/lib/rt.jar -classpath ${ANDROID_SDK_ROOT}/platforms/android-29/android.jar:obj -sourcepath src src/com/seth/project/R.java src/com/seth/project/NativeLoader.java
# Requires: src/com/seth/project/R.java, src/com/seth/project/NativeLoader.java # Requires: src/com/seth/project/R.java, src/com/seth/project/NativeLoader.java
# Creates: obj/com/seth/project/NativeLoader.class ... R&attr.class R$string.class R.class # Creates: obj/com/seth/project/NativeLoader.class ... R&attr.class R$string.class R.class
dx --verbose --dex --output=dex/classes.dex obj zip -r obj.zip obj
d8 obj.zip --output obj.zip
unzip obj.zip
mv classes.dex dex/
# Requires: obj/com/seth/project/NativeLoader.class ... R&attr.class R$string.class R.class # Requires: obj/com/seth/project/NativeLoader.class ... R&attr.class R$string.class R.class
# Creates: dex/classes.dex # Creates: dex/classes.dex
aapt package -f -M AndroidManifest.xml -S res -A assets -I ${ANDROID_SDK_ROOT}/platforms/android-28/android.jar -F project.unsigned.apk dex aapt package -f -M AndroidManifest.xml -S res -A assets -I ${ANDROID_SDK_ROOT}/platforms/android-29/android.jar -F project.unsigned.apk dex
# Creates: project.unsigned.apk # Creates: project.unsigned.apk
# Note: The "dex" at the end is the directory the classes.dex file is in! This folder can not contain the manifest file for whatever reason. # Note: The "dex" at the end is the directory the classes.dex file is in! This folder can not contain the manifest file for whatever reason.
aapt add project.unsigned.apk lib/armeabi-v7a/libproject.so aapt add project.unsigned.apk lib/arm64-v8a/libproject.so
# Does: Adds shared library to apk # Does: Adds shared library to apk
jarsigner -keystore project.keystore -storepass mypass -keypass mypass -signedjar project.signed.apk project.unsigned.apk projectKey zipalign -v 4 project.unsigned.apk project.unsigned-align.apk
# Does: Signs
zipalign -f 4 project.signed.apk project.apk
# Does: Aligns # Does: Aligns
apksigner sign --ks project.keystore --ks-pass pass:mypass --key-pass pass:mypass --ks-key-alias projectKey --out project.apk project.unsigned-align.apk
# Does: Signs
adb install -r project.apk adb install -r project.apk
# Does: install # Does: install
## Error: couldn't find libprojectlibrary.so
You'll get this if your shared library's name does not match across the build. In my case, I was referencing projectlibrary in the java file where it should have just been "project"
## Error: INSTALL_FAILED_NO_MATCHING_ABIS
This one was tricky! Make sure the platform of the standalone toolchain you build matches the platform you are using on your system.
make-standalone-toolchain.sh --arch=arm --platform=android-28 --install-dir=./toolchain_arm_api28
${ANDROID_SDK_ROOT}/platforms/android-28
This command may also help.
adb shell getprop ro.product.cpu.abi
## Error: INSTALL_FAILED_DEXOPT
This one was easier. The Apk generated must contain classes/classes.dex. If it doesn't, check aapt package -f -M to make sure you are including the folder dex is in at the end of it.
## Dealing with Segmentation Faults - Using adb logcat ## Dealing with Segmentation Faults - Using adb logcat
In the event of a segfault, don't despair! You can get the entire backtrace using adb logcat. In the event of a segfault, don't despair! You can get the entire backtrace using adb logcat.