This repository has been archived by the owner on Dec 28, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
make_android.sh
319 lines (240 loc) · 6.45 KB
/
make_android.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
#!/bin/bash
# declFlag flagName flagVar
declFlag() {
for var in ${BASH_ARGV[*]}
do
if [ "$var" == "-$1" ] ; then
eval $2=true
return
fi
done
}
# declParam paramName paramVar
declParam() {
for var in ${BASH_ARGV[*]}
do
if [[ "$var" = "-$1="* ]] ; then
eval $2="${var/-$1=/}"
return
fi
done
}
# If latest command failed; quit
checkErrors() {
if ! [ $? == 0 ] ; then
exit 1
fi
}
# Default params
abi=all
lvl=24
dev=linux-x86_64
# Params and flags
declFlag release release
declFlag exclude_ext_formats exexfo
declFlag help helpMe
declFlag strip_debug_info strip
declFlag apk apk
declFlag rebuild rebuild
declFlag run run
declFlag cmake cmake
declParam abi abi
declParam lvl lvl
declParam dev dev
declParam jobs jobs
if [ "$abi" == "all" ] ; then
abi=x86,x64,ARM32,ARM64
fi
if [ "$dev" == "windows-x86_64" ] ; then
gen=MinGW\ Makefiles
makeCmd=mingw32-make
android_ndk=${ANDROID_NDK}
android_ndk="${android_ndk//\\//}"
else
makeCmd=make
android_ndk=${ANDROID_NDK}
fi
# Help
if [ $helpMe ] ; then
echo Android requires the following dependencies to be installed:
echo - Java
echo - Android SDK
echo - Android NDK set up as environment variable ANDROID_NDK
echo - MinGW Makefiles 64-bit
echo - Vulkan SDK
echo
echo "Command line args:"
echo "-cmake Reloads or initializes the CMake data"
echo "-rebuild Regenerates the apk and gets rid of old files"
echo "-apk Creates apk file; otherwise only compiles"
echo "-run Runs the build"
echo "-abi=all Android ABI (ARM64, ARM32, x64, x86)"
echo "-lvl=24 Android API level (>=24)"
echo "-dev=linux-x86_64 Dev environment (linux-x86_64, windows-x86_64)"
echo "-release Release environment (debug by default)"
echo "-exclude_ext_formats Exclude external formats (only allow baked formats to be packaged)"
echo "-strip_debug_info Strips debug info (shaders)"
echo "-jobs=2 To set the max compilation jobs for parallel compilation"
exit
fi
# cmake abi
build(){
if [ $cmake ] ; then
echo "Making Android build ($dev $lvl $1)"
mkdir -p builds
mkdir -p builds/Android
mkdir -p builds/Android/$1
cd builds/Android/$1
if ! [ "$gen" == "" ] ; then
cmake "../../../" -G "$gen" -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" -DANDROID_NATIVE_API_LEVEL=android-$lvl -DCMAKE_MAKE_PROGRAM="${ANDROID_NDK}/prebuilt/$dev/bin/make" -DANDROID_ABI="$1" -DAndroid=ON -DANDROID_STL=c++_shared $cmakeParams
else
cmake "../../../" -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" -DANDROID_NATIVE_API_LEVEL=android-$lvl -DCMAKE_MAKE_PROGRAM="${ANDROID_NDK}/prebuilt/$dev/bin/make" -DANDROID_ABI="$1" -DAndroid=ON -DANDROID_STL=c++_shared $cmakeParams
fi
checkErrors
cd ../../../
fi
}
# build abi
buildAbi(){
if [ $1 == "ARM32" ] ; then
d="armeabi-v7a"
elif [ $1 == "ARM64" ] ; then
d="arm64-v8a"
elif [ $1 == "x64" ] ; then
d="x86_64"
elif [ $1 == "x86" ] ; then
d="x86"
fi
# Make build
build "$d"
cd builds/Android/$d
eval "$makeCmd" $params
checkErrors
cd ../
mkdir -p build/lib/$d
# Dependencies (shared/dynamic)
if ! [ $release ] ; then
cp -r $android_ndk/sources/third_party/vulkan/src/build-android/jniLibs/$d/* build/lib/$d
fi
cp -r $android_ndk/sources/cxx-stl/llvm-libc++/libs/$d/libc++_shared.so build/lib/$d
cd ../../
}
# CMake & build
if [ $release ] ; then
cmakeParams=-DCMAKE_BUILD_TYPE=Release
else
cmakeParams=-DCMAKE_BUILD_TYPE=Debug
fi
if ! [ $jobs ] ; then
params="-j"
else
params="-j$jobs"
fi
if [ $rebuild ] ; then
rm -rf build
fi
mkdir -p build
mkdir -p build/lib
for i in $(echo $abi | sed "s/,/ /g")
do
buildAbi "$i"
done
# Prepare assets, src and AndroidManifest, build.xml
firstAbi=$(echo $abi | cut -d, -f1)
if [ $firstAbi == "ARM32" ] ; then
d="armeabi-v7a"
elif [ $firstAbi == "ARM64" ] ; then
d="arm64-v8a"
elif [ $firstAbi == "x64" ] ; then
d="x86_64"
elif [ $firstAbi == "x86" ] ; then
d="x86"
fi
cd builds/Android
cp -r $d/bin/build/* build
# Prepare assets and src
mkdir -p build/src
cp -r ../../app/app_android/src/* build/src
cp -r ../../app/app_android/res/* build/res
mkdir -p build/assets
mkdir -p build/assets/res
# Run baker
if [ "$dev" == "windows-x86_64" ] ; then
cd ../../app
if [ $strip ] ; then
"../oibaker.exe" -strip_debug_info
else
"../oibaker.exe"
fi
checkErrors
cd ../builds/Android
fi
# Copy results
if [ $apk ] ; then
cp -r ../../app/res/* build/assets/res
# Filter out some extensions
if [ $exexfo ]
then
cd build/assets/res
find . -type f -name '*.oiBM' -exec rm -f {} +
find . -type f -name '*.fbx' -exec rm -f {} +
find . -type f -name '*.obj' -exec rm -f {} +
find . -type f -name '*.glsl' -exec rm -f {} +
find . -type f -name '*.ogsl' -exec rm -f {} +
find . -type f -name '*.hlsl' -exec rm -f {} +
find . -type f -name '*.vert' -exec rm -f {} +
find . -type f -name '*.frag' -exec rm -f {} +
find . -type f -name '*.geom' -exec rm -f {} +
find . -type f -name '*.comp' -exec rm -f {} +
find . -type f -name '*.rahit' -exec rm -f {} +
find . -type f -name '*.rchit' -exec rm -f {} +
find . -type f -name '*.rgen' -exec rm -f {} +
find . -type f -name '*.rmiss' -exec rm -f {} +
find . -type f -name '*.rcall' -exec rm -f {} +
cd ../../../
fi
for i in $(echo $abi | sed "s/,/ /g")
do
d=none
if [ $i == "ARM32" ] ; then
d="armeabi-v7a"
elif [ $i == "ARM64" ] ; then
d="arm64-v8a"
elif [ $i == "x64" ] ; then
d="x86_64"
elif [ $i == "x86" ] ; then
d="x86"
fi
if ! [ $d == "none" ] ; then
cp $d/lib/libapp_android.so build/lib/$d
fi
done
cd build
# Create APK and add libs
mkdir -p bin
aapt package -f -I "${ANDROID_SDK}/platforms/android-$lvl/android.jar" -M AndroidManifest.xml -A assets -S res -m -F bin/app-unsigned.apk
libs=$(find . -type f -name '*.so' | sed 's/\\/\//g')
aapt add bin/app-unsigned.apk $(echo ${libs//.\//})
# Align and sign APK
cd bin
zipalign -v -f 4 app-unsigned.apk app.apk
if ! [ -e "../../.keystore" ] ; then
"${JAVA_HOME}/bin/keytool" -genkeypair -v -keystore ../../.keystore -keyalg RSA -keysize 2048 -validity 10000
fi
if [ "$dev" == "windows-x86_64" ] ; then
apksigner.bat sign --ks ../../.keystore --min-sdk-version $lvl app.apk
else
apksigner.sh sign --ks ../../.keystore --min-sdk-version $lvl app.apk
fi
cd ../
fi
# run script
if [ $run ] ; then
cd bin
adb install -r app.apk
adb shell am start -n net.osomi.Osomi_Core/android.app.NativeActivity
adb logcat -c
adb logcat -s "oi_Log"
cd ../
fi
cd ../../../