· 6 years ago · Apr 17, 2020, 07:08 AM
1@echo off
2setlocal EnableDelayedExpansion
3
4REM Define required raylib variables
5set Working_Directory=!CD!
6set Raylib_Folder=!Working_Directory!\external\raylib
7set Raygui_Folder=!Working_Directory!\external\raygui
8
9REM Define Android architecture (armeabi-v7a, arm64-v8a, x86, x86-64) and API version
10REM Starting in 2019 using ARM64 is mandatory for published apps,
11REM and minimum required target API is Android 9 (API level 28)
12set Android_API=28
13
14REM Required path variables
15set Java_Home=!Working_Directory!\..\Tools\jdk-13.0.2
16set Android_SDK=!Working_Directory!\..\Tools\android-sdk-6200805\sdk
17set Android_Toolchain=!Working_Directory!\..\Tools\android-ndk-r21\toolchains\llvm\prebuilt\windows-x86_64
18set Android_Build_Tools=!Android_SDK!\build-tools\29.0.3
19set Android_Platform_Tools=!Android_SDK!\platform-tools
20
21REM Android app configuration variables
22set Company_Name=dqn
23set Version_Code=1
24set Version_Name=1.0
25set Icon_LDPI=!Working_Directory!\..\Data\raylib_32x32.png
26set Icon_MDPI=!Working_Directory!\..\Data\raylib_32x32.png
27set Icon_HDPI=!Working_Directory!\..\Data\raylib_32x32.png
28
29REM landscape or portrait
30set Screen_Orientation=portrait
31set Keystore_Password=password
32
33REM Android project configuration variables
34set Project_Name=Kay
35set Build_Folder=!Working_Directory!\..\Build\Android
36set Project_Source=!Working_Directory!\Kay_GameEntryPointExample.cpp
37set Project_Assets=!Working_Directory!\..\Data
38
39REM Compiler and archiver
40set ARM64=0
41if !ARM64!==1 (
42 set Android_Arch_Name=arm64-v8a
43 set CC=!Android_Toolchain!\bin\aarch64-linux-android!Android_API!-clang
44 set AR=!Android_Toolchain!\bin\aarch64-linux-android-ar
45 set Compile_Arch_Flags=-target aarch64 -mfix-cortex-a53-835769
46) else (
47 set Android_Arch_Name=armeabi-v7a
48 set CC=!Android_Toolchain!\bin\armv7a-linux-androideabi!Android_API!-clang
49 set AR=!Android_Toolchain!\bin\arm-linux-androideabi-ar
50 set Compile_Arch_Flags=-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
51)
52
53REM Create required temp directories for APK building
54if not exist !Build_Folder!\obj mkdir !Build_Folder!\obj
55if not exist !Build_Folder!\src\com\!Company_Name!\!Project_Name! mkdir !Build_Folder!\src\com\!Company_Name!\!Project_Name!
56if not exist !Build_Folder!\lib\!Android_Arch_Name! mkdir !Build_Folder!\lib\!Android_Arch_Name!
57if not exist !Build_Folder!\bin mkdir !Build_Folder!\bin
58if not exist !Build_Folder!\res mkdir !Build_Folder!\res
59if not exist !Build_Folder!\res\drawable-ldpi mkdir !Build_Folder!\res\drawable-ldpi
60if not exist !Build_Folder!\res\drawable-mdpi mkdir !Build_Folder!\res\drawable-mdpi
61if not exist !Build_Folder!\res\drawable-hdpi mkdir !Build_Folder!\res\drawable-hdpi
62if not exist !Build_Folder!\res\values mkdir !Build_Folder!\res\values
63
64REM Compile Flags For Your Application
65set Defines=-DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=!Android_API! -D !ProjectName!_OS_ANDROID
66set CPP_Flags=!Compile_Arch_Flags! -fPIC
67
68REM Paths containing required header files
69set Include_Paths=-I !Working_Directory!\External\Raylib
70
71REM Linker Flags For Your Application
72REM Force linking of library module to define symbol
73set LD_Flags=!LD_Flags! -u ANativeActivity_onCreate
74set LD_Flags=!LD_Flags! -L !Build_Folder!\obj -L !Build_Folder!\lib\!Android_Arch_Name! -L !Android_Toolchain!\sysroot\usr\lib
75set LD_Libs=!LD_Libs! -lm -lc -lraylib -llog -landroid -lEGL -lGLESv2 -lOpenSLES -ldl -static-libstdc++
76
77REM ------------------------------------------------------------------------------------------------
78REM
79echo -- Copy Android Icon Files
80REM
81REM ------------------------------------------------------------------------------------------------
82copy !Icon_LDPI! !Build_Folder!\res\drawable-ldpi\icon.png /Y
83copy !Icon_MDPI! !Build_Folder!\res\drawable-mdpi\icon.png /Y
84copy !Icon_HDPI! !Build_Folder!\res\drawable-hdpi\icon.png /Y
85
86set Resource_Strings_File=!Build_Folder!\res\values\strings.xml
87if not exist !Resource_Strings_File! (
88 REM ------------------------------------------------------------------------------------------------
89 REM
90 echo -- Generate Android Strings: !Resource_Strings_File!
91 REM
92 REM ------------------------------------------------------------------------------------------------
93 echo ^<?xml version="1.0" encoding="utf-8"^?^>> !Resource_Strings_File!
94 echo ^<resources^>^<string name="app_name"^>!Project_Name!^</string^>^</resources^>>> !Resource_Strings_File!
95)
96
97set Native_Loader_File=!Build_Folder!\src\com\!Company_Name!\!Project_Name!\NativeLoader.java
98REM ------------------------------------------------------------------------------------------------
99REM
100echo -- Generate Java Entry Point to Native Libraries: !Native_Loader_File!
101REM
102REM ------------------------------------------------------------------------------------------------
103echo package com.!Company_Name!.!Project_Name!; > !Native_Loader_File!
104echo public class NativeLoader extends android.app.NativeActivity { >> !Native_Loader_File!
105echo static { >> !Native_Loader_File!
106echo System.loadLibrary("!Project_Name!");>> !Native_Loader_File!
107echo }>> !Native_Loader_File!
108echo }>> !Native_Loader_File!
109
110set Manifest_File=!Build_Folder!\AndroidManifest.xml
111if not exist !Manifest_File! (
112 REM ------------------------------------------------------------------------------------------------
113 REM
114 echo -- Generate Android Manifest: !Manifest_File!
115 REM
116 REM ------------------------------------------------------------------------------------------------
117 @echo ^<?xml version="1.0" encoding="utf-8"^?^>> !Manifest_File!
118 @echo ^<manifest xmlns:android="http://schemas.android.com/apk/res/android">> !Manifest_File!
119 @echo package="com.!Company_Name!.!Project_Name!">> !Manifest_File!
120 @echo android:versionCode="!Version_Code!" android:versionName="!Version_Name!"^>>> !Manifest_File!
121
122 @echo ^<uses-sdk android:minSdkVersion="!Android_API!"/^>>> !Manifest_File!
123 @echo ^<uses-feature android:glEsVersion="0x00020000" android:required="true"/^>>> !Manifest_File!
124 @echo ^<application android:allowBackup="false" android:label="@string/app_name" android:icon="@drawable/icon"^>>> !Manifest_File!
125
126 @echo ^<activity android:name="com.!Company_Name!.!Project_Name!.NativeLoader">> !Manifest_File!
127 @echo android:theme="@android:style/Theme.NoTitleBar.Fullscreen">> !Manifest_File!
128 @echo android:configChanges="orientation|keyboardHidden|screenSize">> !Manifest_File!
129 @echo android:screenOrientation="!Screen_Orientation!" android:launchMode="singleTask">> !Manifest_File!
130 @echo android:clearTaskOnLaunch="true"^>>> !Manifest_File!
131
132 REM The manifest specifies android:value as the name of the shared
133 REM library to be built, minus the initial lib and the .so extension. This value
134 REM must be the same as the name of LOCAL_MODULE in Android.mk.
135 @echo ^<meta-data android:name="android.app.lib_name" android:value="!Project_Name!"/^>>> !Manifest_File!
136
137 @echo ^<intent-filter^>>> !Manifest_File!
138 @echo ^<action android:name="android.intent.action.MAIN"/^>>> !Manifest_File!
139 @echo ^<category android:name="android.intent.category.LAUNCHER"/^>>> !Manifest_File!
140 @echo ^</intent-filter^>>> !Manifest_File!
141
142 @echo ^</activity^>>> !Manifest_File!
143 @echo ^</application^>>> !Manifest_File!
144 @echo ^</manifest^>>> !Manifest_File!
145)
146
147set Keystore_File=!Working_Directory!\..\Data\!Project_Name!.keystore
148if not exist !Keystore_File! (
149 REM ------------------------------------------------------------------------------------------------
150 REM
151 echo -- Generate Signing Key For APK: !Keystore_File!
152 REM
153 REM ------------------------------------------------------------------------------------------------
154 REM NOTE: Configure here your Distinguished Names (-dname) if required!
155 if not exist !Keystore_File! !Java_Home!\bin\keytool -genkeypair -validity 1000 -dname "CN=!Company_Name!,O=Android,C=ES" -keystore !Keystore_File! -storepass !Keystore_Password! -keypass !Keystore_Password! -alias !Project_Name!Key -keyalg RSA
156)
157
158set Java_Resource_File=!Build_Folder!\src\com\!Company_Name!\!Project_Name!\R.java
159if not exist !Java_Resource_File! (
160 REM ------------------------------------------------------------------------------------------------
161 REM
162 echo -- Generate Java Resource File: !Java_Resource_File!, metaprogramming to resolve resource locations at compile-time in Android
163 REM Located at: src\com\<CompanyName>\<ProjectName>\R.java
164 REM
165 REM ------------------------------------------------------------------------------------------------
166 call !Android_Build_Tools!\aapt package -f -m -S !Build_Folder!\res -J !Build_Folder!\src -M !Build_Folder!\AndroidManifest.xml -I !Android_SDK!\platforms\android-!Android_API!\android.jar
167)
168
169set Raylib_Static_Library=!Build_Folder!\lib\!Android_Arch_Name!\libraylib.a
170if not exist !Raylib_Static_Library! (
171 REM ------------------------------------------------------------------------------------------------
172 REM
173 echo -- Compile Static Raylib + Android Platform Layer: !Raylib_Static_Library!
174 REM
175 REM ------------------------------------------------------------------------------------------------
176
177 set Raylib_Flags=!Compile_Arch_Flags! -std=c99 -Wall -Wno-missing-braces -Werror=pointer-arith -Wformat -Werror=format-security -no-canonical-prefixes -Wno-unused-function -Wno-unused-variable -fno-strict-aliasing -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wa,--noexecstack
178 set Raylib_Defines=!Defines! -D GRAPHICS_API_OPENGL_ES2 -D _DEFAULT_SOURCE -D SUPPORT_GESTURES_SYSTEM -D RAYGUI_SUPPORT_ICONS
179 set Raylib_Includes=-I !Raylib_Folder!\external\android\native_app_glue -I !Raylib_Folder!
180 set Raylib_Source="!Raylib_Folder!\core.c" "!Raylib_Folder!\shapes.c" "!Raylib_Folder!\textures.c" "!Raylib_Folder!\text.c" "!Raylib_Folder!\models.c" "!Raylib_Folder!\utils.c" "!Raylib_Folder!\raudio.c" "!Working_Directory!\Kay_Raygui.c"
181
182 pushd !Build_Folder!\obj
183 call !CC! -c !Raylib_Flags! !Raylib_Defines! !Raylib_Includes! !Raylib_Source!
184 call !CC! -c !Raylib_Flags! !Raylib_Defines! !Raylib_Folder!\external\android\native_app_glue\android_native_app_glue.c -o !Build_Folder!\obj\android_native_app_glue.o
185 call !AR! rcs !Raylib_Static_Library! core.o shapes.o textures.o text.o models.o utils.o raudio.o raygui.o android_native_app_glue.o
186 popd
187)
188
189REM ------------------------------------------------------------------------------------------------
190REM
191echo -- Compile Our Code into Shared Library with NDK CPP Compiler
192REM Our library is loaded at run-time via NativeLoader.java
193REM
194REM ------------------------------------------------------------------------------------------------
195call !CC!++ !CPP_Flags! !Defines! !Include_Paths! -o !Build_Folder!\lib\!Android_Arch_Name!\lib!Project_Name!.so !Project_Source! -shared !LD_Flags! !LD_Libs!
196
197set Native_Loader_Bytecode=!Build_Folder!\obj\com\!Company_Name!\!Project_Name!\NativeLoader.class
198if not exist !Native_Loader_Bytecode! (
199 REM ------------------------------------------------------------------------------------------------
200 REM
201 echo -- Compile NativeLoader.java into Java bytecode: !Native_Loader_Bytecode!
202 REM
203 REM ------------------------------------------------------------------------------------------------
204 call !Java_Home!\bin\javac -source 1.7 -target 1.7 -d !Build_Folder!\obj -bootclasspath !Java_Home!\jre\lib\rt.jar -classpath "!Android_SDK!\platforms\android-!Android_API!\android.jar;!Build_Folder!\obj" -sourcepath !Build_Folder!\src !Build_Folder!\src\com\!Company_Name!\!Project_Name!\R.java !Native_Loader_File!
205)
206
207set Native_Loader_Dex=!Build_Folder!\bin\classes.dex
208if not exist !Native_Loader_Dex! (
209 REM ------------------------------------------------------------------------------------------------
210 REM
211 echo -- Compile NativeLoader.class into Dalvik Executable Bytecode: !Native_Loader_Dex!
212 REM Since Android 5.0, Dalvik interpreter (JIT) has been replaced by ART (AOT)
213 REM
214 REM ------------------------------------------------------------------------------------------------
215 REM NOTE(2020-03-14) Originally used to call dx script, but DX script is
216 REM broken in that one of the helper scripts is no longer packaged with the
217 REM default Android SDK. So I pulled out the script contents and call the
218 REM commands manually.
219 REM !Android_Build_Tools!\dx --verbose --dex --output=!Build_Folder!\bin\classes.dex !Build_Folder!\obj
220
221 REM NOTE(2020-03-14) Default 1GB Heap Size
222 call !Java_Home!\bin\java -Xmx1024M -Xss1m -classpath !Android_Build_Tools!\lib -jar !Android_Build_Tools!\lib\dx.jar --dex --output=!Build_Folder!\bin\classes.dex !Build_Folder!\obj
223)
224
225set Unsigned_APK=!Build_Folder!\bin\!Project_Name!.unsigned.apk
226REM ------------------------------------------------------------------------------------------------
227REM
228echo -- Create Unsigned Android APK to !Unsigned_APK!
229REM NOTE: Requires compiled classes.dex and the our compiled shared library
230REM NOTE: Use -A resources to define additional directory in which to find raw asset files in the packaging step
231REM
232REM ------------------------------------------------------------------------------------------------
233
234REM NOTE(2020-03-14) If !Build_Folder!\bin\!Project_name!.unsigned.apk exists, AAPT hangs indefinitely ...
235if exist !Unsigned_APK! del !Unsigned_APK!
236
237!Android_Build_Tools!\aapt package -f -M !Manifest_File! -S !Build_Folder!\res -A !Project_Assets! -I !Android_SDK!\platforms\android-!Android_API!\android.jar -F !Build_Folder!\bin\!Project_Name!.unsigned.apk !Build_Folder!\bin
238
239REM NOTE: This step needs to be done with relative paths from the !Build_Folder! to pack the APK folders properly
240REM IMPORTANT: MUST USE UNIX STYLE '/' forward slashes, otherwise Android doesn't detect native libraries properly ...
241pushd !Build_Folder!
242!Android_Build_Tools!/aapt add bin/!Project_Name!.unsigned.apk lib/!Android_Arch_Name!/lib!Project_Name!.so
243popd
244
245REM ------------------------------------------------------------------------------------------------
246REM
247echo -- Sign the APK with !Keystore_File!
248REM
249REM ------------------------------------------------------------------------------------------------
250REM Create signed APK package using generated Key: bin\!Project_Name!.signed.apk
251call !Java_Home!\bin\jarsigner -keystore !Keystore_File! -storepass !Keystore_Password! -keypass !Keystore_Password! -signedjar !Build_Folder!\bin\!Project_Name!.signed.apk !Build_Folder!\bin\!Project_Name!.unsigned.apk !Project_Name!Key
252
253set Final_APK=!Build_Folder!\!Project_Name!.apk
254REM ------------------------------------------------------------------------------------------------
255REM
256echo -- ZipAlign the APK: !Final_Apk!
257REM Align uncompressed data to 4-byte boundaries allowing parts of the APK to be accessed by mmap
258REM
259REM ------------------------------------------------------------------------------------------------
260call !Android_Build_Tools!\zipalign -f 4 !Build_Folder!\bin\!Project_Name!.signed.apk !Final_Apk!