-
Notifications
You must be signed in to change notification settings - Fork 1
/
compile.sh
371 lines (342 loc) · 10.3 KB
/
compile.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
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
#! /bin/sh
set -e
#############
# FUNCTIONS #
#############
diagnostic()
{
echo "$@" 1>&2;
}
checkfail()
{
if [ ! $? -eq 0 ];then
diagnostic "$1"
exit 1
fi
}
# Read the Android Wiki http://wiki.videolan.org/AndroidCompile
# Setup all that stuff correctly.
# Get the latest Android SDK Platform or modify numbers in configure.sh and libvlc/default.properties.
while [ $# -gt 0 ]; do
case $1 in
help|--help|-h)
echo "Use -a to set the ARCH:"
echo " ARM: (armeabi-v7a|arm)"
echo " ARM64: (arm64-v8a|arm64)"
echo " X86: x86, x86_64"
echo "Use --release to build in release mode"
echo "Use --signrelease to build in release mode and sign apk, see vlc-android/build.gradle"
echo "Use -s to set your keystore file and -p for the password"
echo "Use -c to get a ChromeOS build"
echo "Use -l to build only LibVLC"
exit 0
;;
a|-a)
ANDROID_ABI=$2
shift
;;
-r|release|--release)
RELEASE=1
;;
signrelease|--signrelease)
SIGNED_RELEASE=1
RELEASE=1
;;
-s|--signature)
KEYSTORE_FILE=$2
shift
;;
-p|--password)
PASSWORD_KEYSTORE=$2
shift
;;
-l)
BUILD_LIBVLC=1
NO_ML=1
;;
-ml)
BUILD_MEDIALIB=1
;;
run)
RUN=1
;;
--asan)
ASAN=1
;;
--no-ml)
NO_ML=1
;;
--publish)
RELEASE=1
PUBLISH=1
;;
--init)
GRADLE_SETUP=1
;;
*)
diagnostic "$0: Invalid option '$1'."
diagnostic "$0: Try --help for more information."
exit 1
;;
esac
shift
done
if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
diagnostic "You must define ANDROID_NDK, ANDROID_SDK before starting."
diagnostic "They must point to your NDK and SDK directories."
exit 1
fi
if [ -z "$ANDROID_ABI" ]; then
diagnostic "*** No ANDROID_ABI defined architecture: using ARMv7"
ANDROID_ABI="armeabi-v7a"
fi
if [ "$ANDROID_ABI" = "armeabi-v7a" -o "$ANDROID_ABI" = "arm" ]; then
GRADLE_ABI="ARMv7"
elif [ "$ANDROID_ABI" = "arm64-v8a" -o "$ANDROID_ABI" = "arm64" ]; then
GRADLE_ABI="ARMv8"
elif [ "$ANDROID_ABI" = "x86" ]; then
GRADLE_ABI="x86"
elif [ "$ANDROID_ABI" = "x86_64" ]; then
GRADLE_ABI="x86_64"
elif [ "$ANDROID_ABI" = "all" ]; then
GRADLE_ABI="all"
else
diagnostic "Invalid arch specified: '$ANDROID_ABI'."
diagnostic "Try --help for more information"
exit 1
fi
##########
# GRADLE #
##########
if [ ! -d "gradle/wrapper" ]; then
diagnostic "Downloading gradle"
GRADLE_VERSION=4.10.1
GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-bin.zip
wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
checkfail "gradle: download failed"
unzip -o gradle-${GRADLE_VERSION}-bin.zip
checkfail "gradle: unzip failed"
cd gradle-${GRADLE_VERSION}
./bin/gradle --offline wrapper
checkfail "gradle: wrapper failed"
./gradlew -version
checkfail "gradle: wrapper failed"
cd ..
mkdir -p gradle
mv gradle-${GRADLE_VERSION}/gradle/wrapper/ gradle
mv gradle-${GRADLE_VERSION}/gradlew .
chmod a+x gradlew
rm -rf gradle-${GRADLE_VERSION}-bin.zip
fi
####################
# Configure gradle #
####################
if [ -z "$KEYSTORE_FILE" ]; then
KEYSTORE_FILE="$HOME/.android/debug.keystore"
STOREALIAS="androiddebugkey"
else
if [ -z "$PASSWORD_KEYSTORE" ]; then
diagnostic "No password"
exit 1
fi
rm -f gradle.properties
STOREALIAS="vlc"
fi
if [ ! -f gradle.properties ]; then
echo android.enableJetifier=true > gradle.properties
echo android.useAndroidX=true >> gradle.properties
echo keyStoreFile=$KEYSTORE_FILE >> gradle.properties
echo storealias=$STOREALIAS >> gradle.properties
if [ -z "$PASSWORD_KEYSTORE" ]; then
echo storepwd=android >> gradle.properties
fi
fi
init_local_props() {
(
# initialize the local.properties file,
# or fix it if it was modified (by Android Studio, for example).
echo_props() {
echo "sdk.dir=$ANDROID_SDK"
echo "ndk.dir=$ANDROID_NDK"
}
# first check if the file just needs to be created for the first time
if [ ! -f "$1" ]; then
echo_props > "$1"
return 0
fi
# escape special chars to get regex that matches string
make_regex() {
echo "$1" | sed -e 's/\([[\^$.*]\)/\\\1/g' -
}
android_sdk_regex=`make_regex "${ANDROID_SDK}"`
android_ndk_regex=`make_regex "${ANDROID_NDK}"`
# check for lines setting the SDK directory
sdk_line_start="^sdk\.dir="
total_sdk_count=`grep -c "${sdk_line_start}" "$1"`
good_sdk_count=`grep -c "${sdk_line_start}${android_sdk_regex}\$" "$1"`
# check for lines setting the NDK directory
ndk_line_start="^ndk\.dir="
total_ndk_count=`grep -c "${ndk_line_start}" "$1"`
good_ndk_count=`grep -c "${ndk_line_start}${android_ndk_regex}\$" "$1"`
# if one of each is found and both match the environment vars, no action needed
if [ "$total_sdk_count" -eq "1" -a "$good_sdk_count" -eq "1" \
-a "$total_ndk_count" -eq "1" -a "$good_ndk_count" -eq "1" ]
then
return 0
fi
# if neither property is set they can simply be appended to the file
if [ "$total_sdk_count" -eq "0" -a "$total_ndk_count" -eq "0" ]; then
echo_props >> "$1"
return 0
fi
# if a property is set incorrectly or too many times,
# remove all instances of both properties and append correct ones.
replace_props() {
temp_props="$1.tmp"
while IFS= read -r LINE || [ -n "$LINE" ]; do
line_sdk_dir="${LINE#sdk.dir=}"
line_ndk_dir="${LINE#ndk.dir=}"
if [ "x$line_sdk_dir" = "x$LINE" -a "x$line_ndk_dir" = "x$LINE" ]; then
echo "$LINE"
fi
done <"$1" >"$temp_props"
echo_props >> "$temp_props"
mv -f -- "$temp_props" "$1"
}
echo "local.properties: Contains incompatible sdk.dir and/or ndk.dir properties. Replacing..."
replace_props "$1"
echo "local.properties: Finished replacing sdk.dir and/or ndk.dir with current environment variables."
)
}
init_local_props local.properties || { echo "Error initializing local.properties"; exit $?; }
if [ ! -d "$ANDROID_SDK/licenses" ]; then
mkdir "$ANDROID_SDK/licenses"
echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" > "$ANDROID_SDK/licenses/android-sdk-license"
echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_SDK/licenses/android-sdk-license"
fi
if [ "$GRADLE_SETUP" = 1 ]; then
exit 0
fi
####################
# Fetch VLC source #
####################
TESTED_HASH=7af4ddf
if [ ! -d "vlc" ]; then
diagnostic "VLC source not found, cloning"
git clone https://git.videolan.org/git/vlc/vlc-3.0.git vlc
checkfail "vlc source: git clone failed"
fi
diagnostic "VLC source found"
cd vlc
if ! git cat-file -e ${TESTED_HASH}; then
cat 1>&2 << EOF
***
*** Error: Your vlc checkout does not contain the latest tested commit: ${TESTED_HASH}
***
EOF
exit 1
fi
if [ "$RELEASE" = 1 ]; then
git reset --hard ${TESTED_HASH}
git am ../libvlc/patches/*.patch
fi
cd ..
############
# Make VLC #
############
diagnostic "Configuring"
compile() {
OPTS="-a $1"
if [ "$RELEASE" = 1 ]; then
OPTS="$OPTS release"
fi
if [ "$CHROME_OS" = 1 ]; then
OPTS="$OPTS -c"
fi
if [ "$ASAN" = 1 ]; then
OPTS="$OPTS --asan"
fi
# Build LibVLC if asked for it, or needed by medialibrary
if [ "$BUILD_MEDIALIB" != 1 -o ! -d "libvlc/jni/libs/$1" ]; then
./compile-libvlc.sh $OPTS
fi
if [ "$NO_ML" != 1 ]; then
./compile-medialibrary.sh $OPTS
fi
}
if [ "$ANDROID_ABI" = "all" ]; then
if [ -d tmp ]; then
rm -rf tmp
fi
mkdir tmp
LIB_DIR="libvlc"
if [ "$NO_ML" != 1 ]; then
LIB_DIR="medialibrary"
fi
compile armeabi-v7a
cp -r $LIB_DIR/jni/libs/armeabi-v7a tmp
compile arm64-v8a
cp -r $LIB_DIR/jni/libs/arm64-v8a tmp
compile x86
cp -r $LIB_DIR/jni/libs/x86 tmp
compile x86_64
mv tmp/* $LIB_DIR/jni/libs
rm -rf tmp
else
compile $ANDROID_ABI
fi
##################
# Compile the UI #
##################
BUILDTYPE="Dev"
if [ "$SIGNED_RELEASE" = 1 ]; then
BUILDTYPE="signedRelease"
elif [ "$RELEASE" = 1 ]; then
BUILDTYPE="Release"
fi
if [ "$BUILD_LIBVLC" = 1 ];then
GRADLE_ABI=$GRADLE_ABI ./gradlew -p libvlc assemble${BUILDTYPE}
RUN=0
CHROME_OS=0
if [ "$PUBLISH" = 1 ];then
GRADLE_ABI=$GRADLE_ABI ./gradlew -p libvlc install bintrayUpload
fi
elif [ "$BUILD_MEDIALIB" = 1 ]; then
GRADLE_ABI=$GRADLE_ABI ./gradlew -p medialibrary assemble${BUILDTYPE}
RUN=0
CHROME_OS=0
if [ "$PUBLISH" = 1 ];then
GRADLE_ABI=$GRADLE_ABI ./gradlew -p medialibrary install bintrayUpload
fi
else
if [ "$RUN" = 1 ]; then
ACTION="install"
else
ACTION="assemble"
fi
TARGET="${ACTION}${BUILDTYPE}"
CLI="" GRADLE_ABI=$GRADLE_ABI ./gradlew $TARGET
fi
#######
# RUN #
#######
if [ "$RUN" = 1 ]; then
export PATH="${ANDROID_SDK}/platform-tools/:$PATH"
adb wait-for-device
if [ "$RELEASE" = 1 ]; then
adb shell am start -n mudiAudioVideo/mudiAudioVideo.StartActivity
else
adb shell am start -n mudiAudioVideo.debug/mudiAudioVideo.StartActivity
fi
fi
#########################
# Chrome OS repackaging #
#########################
# You need to run the armv7 version first, then relaunch this script for x86
if [ "$CHROME_OS" = 1 -a "$ANDROID_ABI" = "x86" ]; then
unzip -o vlc-android/build/outputs/apk/VLC-Android-CHROME-*-ARMv7.apk lib/armeabi-v7a/libvlcjni.so
zip -rv vlc-android/build/outputs/apk/VLC-Android-CHROME-*-x86.apk lib/armeabi-v7a/libvlcjni.so
rm -rf lib/
apk_to_crx.py --zip vlc-android/build/outputs/apk/VLC-Android-CHROME-*-x86.apk --metadata vlc-android/flavors/chrome/VLC-Android-CHROME.crx.json
mv vlc-android/build/outputs/apk/VLC-Android-CHROME-*-x86.zip vlc-android/build/outputs/apk/VLC-Android-CHROME-ALL.zip
fi