From 7e21a08f7e4ba4800e469aebd6080e6f046b4ac0 Mon Sep 17 00:00:00 2001 From: Redwid Date: Mon, 14 May 2018 16:28:29 +0100 Subject: [PATCH 01/90] Added fix for MacOS "ValueError: overflow in number field" --- pythonforandroid/bootstraps/pygame/build/build.py | 2 +- pythonforandroid/bootstraps/sdl2/build/build.py | 2 +- pythonforandroid/bootstraps/service_only/build/build.py | 2 +- pythonforandroid/bootstraps/webview/build/build.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pythonforandroid/bootstraps/pygame/build/build.py b/pythonforandroid/bootstraps/pygame/build/build.py index d9f2dfddfc..b3b2327e71 100755 --- a/pythonforandroid/bootstraps/pygame/build/build.py +++ b/pythonforandroid/bootstraps/pygame/build/build.py @@ -180,7 +180,7 @@ def select(fn): if select(x)] # create tar.gz of thoses files - tf = tarfile.open(tfn, 'w:gz', format=tarfile.USTAR_FORMAT) + tf = tarfile.open(tfn, 'w:gz', format=tarfile.GNU_FORMAT) dirs = [] for fn, afn in files: # print('%s: %s' % (tfn, fn)) diff --git a/pythonforandroid/bootstraps/sdl2/build/build.py b/pythonforandroid/bootstraps/sdl2/build/build.py index e78a753450..01ddaef391 100755 --- a/pythonforandroid/bootstraps/sdl2/build/build.py +++ b/pythonforandroid/bootstraps/sdl2/build/build.py @@ -184,7 +184,7 @@ def select(fn): if select(x)] # create tar.gz of thoses files - tf = tarfile.open(tfn, 'w:gz', format=tarfile.USTAR_FORMAT) + tf = tarfile.open(tfn, 'w:gz', format=tarfile.GNU_FORMAT) dirs = [] for fn, afn in files: # print('%s: %s' % (tfn, fn)) diff --git a/pythonforandroid/bootstraps/service_only/build/build.py b/pythonforandroid/bootstraps/service_only/build/build.py index e5a6e3a094..ff42bd5997 100755 --- a/pythonforandroid/bootstraps/service_only/build/build.py +++ b/pythonforandroid/bootstraps/service_only/build/build.py @@ -175,7 +175,7 @@ def select(fn): if select(x)] # create tar.gz of thoses files - tf = tarfile.open(tfn, 'w:gz', format=tarfile.USTAR_FORMAT) + tf = tarfile.open(tfn, 'w:gz', format=tarfile.GNU_FORMAT) dirs = [] for fn, afn in files: # print('%s: %s' % (tfn, fn)) diff --git a/pythonforandroid/bootstraps/webview/build/build.py b/pythonforandroid/bootstraps/webview/build/build.py index fa6f92b017..c0d79c2b60 100755 --- a/pythonforandroid/bootstraps/webview/build/build.py +++ b/pythonforandroid/bootstraps/webview/build/build.py @@ -174,7 +174,7 @@ def select(fn): if select(x)] # create tar.gz of thoses files - tf = tarfile.open(tfn, 'w:gz', format=tarfile.USTAR_FORMAT) + tf = tarfile.open(tfn, 'w:gz', format=tarfile.GNU_FORMAT) dirs = [] for fn, afn in files: # print('%s: %s' % (tfn, fn)) From d5ec1191369b3f260022bcf6ef3f45478f21dfcf Mon Sep 17 00:00:00 2001 From: Redwid Date: Mon, 14 May 2018 16:33:37 +0100 Subject: [PATCH 02/90] Override native implementation --- .../bootstraps/sdl2/build/jni/src/start.c | 80 ++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c index 121d925d99..9d44496d16 100644 --- a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c +++ b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c @@ -68,6 +68,16 @@ int file_exists(const char *filename) { /* int main(int argc, char **argv) { */ int main(int argc, char *argv[]) { + LOGP("main() begin"); + + char out[1024]; + snprintf(out, 1024, "argc: %d", argc); + LOGP(out); + for (int i = 0; i < argc; i++) { + snprintf(out, 1024, " item[%d]: %s", i, argv[i]); + LOGP(out); + } + char *env_argument = NULL; char *env_entrypoint = NULL; @@ -266,9 +276,11 @@ int main(int argc, char *argv[]) { return -1; } + LOGP("run PyRun_SimpleFile begin"); /* run python ! */ ret = PyRun_SimpleFile(fd, entrypoint); + LOGP("run PyRun_SimpleFile end"); if (PyErr_Occurred() != NULL) { ret = 1; @@ -292,7 +304,8 @@ JNIEXPORT void JNICALL Java_org_kivy_android_PythonService_nativeStart( JNIEnv *env, jobject thiz, jstring j_android_private, jstring j_android_argument, jstring j_service_entrypoint, jstring j_python_name, jstring j_python_home, jstring j_python_path, - jstring j_arg) { + jstring j_arg, jobjectArray j_application_args) { + LOGP("Python for nativeStart begin."); jboolean iscopy; const char *android_private = (*env)->GetStringUTFChars(env, j_android_private, &iscopy); @@ -318,11 +331,72 @@ JNIEXPORT void JNICALL Java_org_kivy_android_PythonService_nativeStart( setenv("PYTHONPATH", python_path, 1); setenv("PYTHON_SERVICE_ARGUMENT", arg, 1); - char *argv[] = {"."}; + const char *argv[20]; + jsize stringCount = (*env)->GetArrayLength(env, j_application_args); + + char out[256]; + snprintf(out, 256, "stringCount: %d", stringCount); + LOGP(out); + + for (int i = 0; i < stringCount; i++) { + LOGP("processing j_application_args"); + jstring string = (jstring) (*env)->GetObjectArrayElement(env, j_application_args, i); + argv[i] = (*env)->GetStringUTFChars(env, string, &iscopy); + } + + /* ANDROID_ARGUMENT points to service subdir, + * so main() will run main.py from this dir + */ + main(stringCount, argv); + LOGP("Python for nativeStart end."); +} + +JNIEXPORT void JNICALL Java_org_youtube_dl_wrapper_YoutubeDlService_nativeStart( + JNIEnv *env, jobject thiz, jstring j_android_private, + jstring j_android_argument, jstring j_application_entrypoint, + jstring j_python_name, jstring j_python_home, jstring j_python_path, jobjectArray j_application_args) { + LOGP("Java_org_youtube_dl_wrapper_YoutubeDlService_nativeStart begin."); + jboolean iscopy; + const char *android_private = + (*env)->GetStringUTFChars(env, j_android_private, &iscopy); + const char *android_argument = + (*env)->GetStringUTFChars(env, j_android_argument, &iscopy); + const char *application_entrypoint = + (*env)->GetStringUTFChars(env, j_application_entrypoint, &iscopy); + const char *python_name = + (*env)->GetStringUTFChars(env, j_python_name, &iscopy); + const char *python_home = + (*env)->GetStringUTFChars(env, j_python_home, &iscopy); + const char *python_path = + (*env)->GetStringUTFChars(env, j_python_path, &iscopy); + + setenv("ANDROID_PRIVATE", android_private, 1); + setenv("ANDROID_ARGUMENT", android_argument, 1); + setenv("ANDROID_APP_PATH", android_argument, 1); + setenv("ANDROID_ENTRYPOINT", application_entrypoint, 1); + setenv("PYTHONOPTIMIZE", "2", 1); + setenv("PYTHON_NAME", python_name, 1); + setenv("PYTHONHOME", python_home, 1); + setenv("PYTHONPATH", python_path, 1); + + const char *argv[20]; + jsize stringCount = (*env)->GetArrayLength(env, j_application_args); + + char out[256]; + snprintf(out, 256, "stringCount: %d", stringCount); + LOGP(out); + + for (int i = 0; i < stringCount; i++) { + LOGP("processing j_application_args"); + jstring string = (jstring) (*env)->GetObjectArrayElement(env, j_application_args, i); + argv[i] = (*env)->GetStringUTFChars(env, string, &iscopy); + } + /* ANDROID_ARGUMENT points to service subdir, * so main() will run main.py from this dir */ - main(1, argv); + main(stringCount, argv); + LOGP("Python for nativeStart end."); } #endif From cdc4e30bca48d687c7fbe7c099a183dc4ade2473 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 15 May 2018 11:24:31 +0100 Subject: [PATCH 03/90] Added bash script to clean, build arm64-v8a and armeabi-v7a architecture and copy *.so files into project /libs folder --- clean-build-copy.sh | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 clean-build-copy.sh diff --git a/clean-build-copy.sh b/clean-build-copy.sh new file mode 100644 index 0000000000..a86c19efb6 --- /dev/null +++ b/clean-build-copy.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +#enviroment set up +export PYTHONIOENCODING=UTF-8 +export PYTHONUNBUFFERED=1 +export VERSIONER_PYTHON_VERSION=2.7 +export PYTHONPATH=$PWD + +#script set up +p4a="$PWD/pythonforandroid/toolchain.py" +pythonApp="~/Projects/git/youtube-dl/youtube_dl" +pythonAppDistName="youtube_dl_wrapper" +pythonAppPackageName="org.youtube.dl" +pythonAppName="youtube_dl" +distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" +ndkDir=~/Library/Android/sdk/ndk-bundle + +clean() { +/usr/bin/python $p4a clean_builds +rm -rfv $distFolder +} + +build() { +/usr/bin/python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ndkDir --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle +} + +copy_libs() { +cp -rfv $distFolder/libs/ $PWD/libs/ +} + +echo "[INFO] Clean" +clean +rm -rfv $PWD/libs +echo "[INFO] Clean done" + +echo "[INFO] Build [arm64-v8a]" +build "arm64-v8a" +copy_libs +echo "[INFO] Build [arm64-v8a] done" + +echo "[INFO] Build [armeabi-v7a]" +clean +build "armeabi-v7a" +copy_libs +echo "[INFO] Build [armeabi-v7a] done" + +echo "[INFO] Build done" \ No newline at end of file From 6b98f5daee887d5e494bf12ab857cdfd3e8223bd Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 15 May 2018 11:31:21 +0100 Subject: [PATCH 04/90] Modified README.rst file --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 4d7ece3cb4..e09800254e 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,10 @@ python-for-android ================== +|Forked version| +Changes: +- Modified native start.c +- Added bash script to easily build + |Build Status| From dba9b072ebdab7a43f637a75f9b7edc7e47f7a52 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 15 May 2018 11:33:11 +0100 Subject: [PATCH 05/90] Modified README.rst file --- README.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index e09800254e..df2da70631 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,8 @@ python-for-android ================== -|Forked version| + +Forked version +============== Changes: - Modified native start.c - Added bash script to easily build From 29bff3fc45fc5fc5b8b74f8c5409eb0a2d52db7e Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 15 May 2018 11:33:52 +0100 Subject: [PATCH 06/90] Modified README.rst file --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index df2da70631..f19d9f2f1a 100644 --- a/README.rst +++ b/README.rst @@ -1,13 +1,18 @@ python-for-android ================== + Forked version ============== + Changes: + - Modified native start.c + - Added bash script to easily build + |Build Status| .. |Build Status| image:: https://secure.travis-ci.org/kivy/python-for-android.png?branch=master From 7edb993d1a4772817e94a509cef661a0d2a68c68 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 15 May 2018 14:38:08 +0100 Subject: [PATCH 07/90] Copy artifacts to /build folder. --- clean-build-copy.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index a86c19efb6..069c0ff3e1 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -7,7 +7,8 @@ export PYTHONPATH=$PWD #script set up p4a="$PWD/pythonforandroid/toolchain.py" -pythonApp="~/Projects/git/youtube-dl/youtube_dl" +#pythonApp="~/Projects/git/youtube-dl/youtube_dl" +pythonApp="$(dirname "$PWD")/youtube-dl/youtube_dl" pythonAppDistName="youtube_dl_wrapper" pythonAppPackageName="org.youtube.dl" pythonAppName="youtube_dl" @@ -24,17 +25,24 @@ build() { } copy_libs() { -cp -rfv $distFolder/libs/ $PWD/libs/ +mkdir $PWD/build +cp -rfv $distFolder/libs/ $PWD/build/libs/ +} + +copy_assets() { +cp -rfv $distFolder/src/main/assets/ $PWD/build/assets +rm $PWD/build/assets/.gitkeep } echo "[INFO] Clean" clean -rm -rfv $PWD/libs +rm -rfv $PWD/build echo "[INFO] Clean done" echo "[INFO] Build [arm64-v8a]" build "arm64-v8a" copy_libs +copy_assets echo "[INFO] Build [arm64-v8a] done" echo "[INFO] Build [armeabi-v7a]" From bdb530af9006ed17e10860fc64b0474de569d926 Mon Sep 17 00:00:00 2001 From: Redwid Date: Mon, 21 May 2018 11:23:12 +0100 Subject: [PATCH 08/90] Remove SDL dependency from native start.c code and from ml files --- .../bootstraps/sdl2/build/jni/src/Android.mk | 11 +--- .../sdl2/build/jni/src/Android_static.mk | 2 - .../bootstraps/sdl2/build/jni/src/start.c | 57 +------------------ 3 files changed, 5 insertions(+), 65 deletions(-) diff --git a/pythonforandroid/bootstraps/sdl2/build/jni/src/Android.mk b/pythonforandroid/bootstraps/sdl2/build/jni/src/Android.mk index 41d689d688..29c2a3bd01 100644 --- a/pythonforandroid/bootstraps/sdl2/build/jni/src/Android.mk +++ b/pythonforandroid/bootstraps/sdl2/build/jni/src/Android.mk @@ -4,19 +4,14 @@ include $(CLEAR_VARS) LOCAL_MODULE := main -SDL_PATH := ../SDL - -LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include - # Add your application source files here... -LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \ - start.c +LOCAL_SRC_FILES := start.c LOCAL_CFLAGS += -I$(LOCAL_PATH)/../../../../other_builds/$(PYTHON2_NAME)/$(ARCH)/python2/python-install/include/python2.7 $(EXTRA_CFLAGS) -LOCAL_SHARED_LIBRARIES := SDL2 python_shared +LOCAL_SHARED_LIBRARIES := python_shared -LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog $(EXTRA_LDLIBS) +LOCAL_LDLIBS := -llog $(EXTRA_LDLIBS) LOCAL_LDFLAGS += -L$(LOCAL_PATH)/../../../../other_builds/$(PYTHON2_NAME)/$(ARCH)/python2/python-install/lib $(APPLICATION_ADDITIONAL_LDFLAGS) diff --git a/pythonforandroid/bootstraps/sdl2/build/jni/src/Android_static.mk b/pythonforandroid/bootstraps/sdl2/build/jni/src/Android_static.mk index faed669c0e..2de278ee00 100644 --- a/pythonforandroid/bootstraps/sdl2/build/jni/src/Android_static.mk +++ b/pythonforandroid/bootstraps/sdl2/build/jni/src/Android_static.mk @@ -6,7 +6,5 @@ LOCAL_MODULE := main LOCAL_SRC_FILES := YourSourceHere.c -LOCAL_STATIC_LIBRARIES := SDL2_static - include $(BUILD_SHARED_LIBRARY) $(call import-module,SDL)LOCAL_PATH := $(call my-dir) diff --git a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c index 9d44496d16..cea322700c 100644 --- a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c +++ b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c @@ -14,9 +14,7 @@ #include #include -#include "SDL.h" #include "android/log.h" -#include "SDL_opengles2.h" #define ENTRYPOINT_MAXLEN 128 #define LOG(n, x) __android_log_write(ANDROID_LOG_INFO, (n), (x)) @@ -300,62 +298,11 @@ int main(int argc, char *argv[]) { return ret; } -JNIEXPORT void JNICALL Java_org_kivy_android_PythonService_nativeStart( - JNIEnv *env, jobject thiz, jstring j_android_private, - jstring j_android_argument, jstring j_service_entrypoint, - jstring j_python_name, jstring j_python_home, jstring j_python_path, - jstring j_arg, jobjectArray j_application_args) { - LOGP("Python for nativeStart begin."); - jboolean iscopy; - const char *android_private = - (*env)->GetStringUTFChars(env, j_android_private, &iscopy); - const char *android_argument = - (*env)->GetStringUTFChars(env, j_android_argument, &iscopy); - const char *service_entrypoint = - (*env)->GetStringUTFChars(env, j_service_entrypoint, &iscopy); - const char *python_name = - (*env)->GetStringUTFChars(env, j_python_name, &iscopy); - const char *python_home = - (*env)->GetStringUTFChars(env, j_python_home, &iscopy); - const char *python_path = - (*env)->GetStringUTFChars(env, j_python_path, &iscopy); - const char *arg = (*env)->GetStringUTFChars(env, j_arg, &iscopy); - - setenv("ANDROID_PRIVATE", android_private, 1); - setenv("ANDROID_ARGUMENT", android_argument, 1); - setenv("ANDROID_APP_PATH", android_argument, 1); - setenv("ANDROID_ENTRYPOINT", service_entrypoint, 1); - setenv("PYTHONOPTIMIZE", "2", 1); - setenv("PYTHON_NAME", python_name, 1); - setenv("PYTHONHOME", python_home, 1); - setenv("PYTHONPATH", python_path, 1); - setenv("PYTHON_SERVICE_ARGUMENT", arg, 1); - - const char *argv[20]; - jsize stringCount = (*env)->GetArrayLength(env, j_application_args); - - char out[256]; - snprintf(out, 256, "stringCount: %d", stringCount); - LOGP(out); - - for (int i = 0; i < stringCount; i++) { - LOGP("processing j_application_args"); - jstring string = (jstring) (*env)->GetObjectArrayElement(env, j_application_args, i); - argv[i] = (*env)->GetStringUTFChars(env, string, &iscopy); - } - - /* ANDROID_ARGUMENT points to service subdir, - * so main() will run main.py from this dir - */ - main(stringCount, argv); - LOGP("Python for nativeStart end."); -} - -JNIEXPORT void JNICALL Java_org_youtube_dl_wrapper_YoutubeDlService_nativeStart( +JNIEXPORT void JNICALL Java_org_redwid_android_youtube_dl_YoutubeDlService_nativeStart( JNIEnv *env, jobject thiz, jstring j_android_private, jstring j_android_argument, jstring j_application_entrypoint, jstring j_python_name, jstring j_python_home, jstring j_python_path, jobjectArray j_application_args) { - LOGP("Java_org_youtube_dl_wrapper_YoutubeDlService_nativeStart begin."); + LOGP("Java_org_redwid_youtube_dl_android_YoutubeDlService_nativeStart begin."); jboolean iscopy; const char *android_private = (*env)->GetStringUTFChars(env, j_android_private, &iscopy); From e823fd5528343c0960534b69bb2706d93b38a84a Mon Sep 17 00:00:00 2001 From: Redwid Date: Mon, 21 May 2018 11:23:42 +0100 Subject: [PATCH 09/90] Refactor build script --- clean-build-copy.sh | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 069c0ff3e1..fe403c3ecf 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -7,7 +7,6 @@ export PYTHONPATH=$PWD #script set up p4a="$PWD/pythonforandroid/toolchain.py" -#pythonApp="~/Projects/git/youtube-dl/youtube_dl" pythonApp="$(dirname "$PWD")/youtube-dl/youtube_dl" pythonAppDistName="youtube_dl_wrapper" pythonAppPackageName="org.youtube.dl" @@ -15,13 +14,25 @@ pythonAppName="youtube_dl" distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" ndkDir=~/Library/Android/sdk/ndk-bundle +#Link for android-youtube-dl project to where script will copy build artifacts +androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" + clean() { +echo "[INFO] Clean" /usr/bin/python $p4a clean_builds rm -rfv $distFolder +rm -rfv $PWD/build +echo "[INFO] Clean done" } build() { +echo "[INFO] Build [$1]" +/usr/bin/python $p4a clean_builds +rm -rfv $distFolder /usr/bin/python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ndkDir --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle +copy_libs +copy_assets +echo "[INFO] Build [$1] done" } copy_libs() { @@ -32,23 +43,29 @@ cp -rfv $distFolder/libs/ $PWD/build/libs/ copy_assets() { cp -rfv $distFolder/src/main/assets/ $PWD/build/assets rm $PWD/build/assets/.gitkeep + +delete_unused_assets "armeabi-v7a" +delete_unused_assets "x86" +delete_unused_assets "arm64-v8a" } -echo "[INFO] Clean" -clean -rm -rfv $PWD/build -echo "[INFO] Clean done" +delete_unused_assets() { +rm $PWD/build/libs/$1/libSDL2.so +rm $PWD/build/libs/$1/libSDL2_image.so +rm $PWD/build/libs/$1/libSDL2_mixer.so +rm $PWD/build/libs/$1/libSDL2_ttf.so +} -echo "[INFO] Build [arm64-v8a]" -build "arm64-v8a" -copy_libs -copy_assets -echo "[INFO] Build [arm64-v8a] done" +copy_assets_to_androidYoutubeDlProject() { +cp -rfv $PWD/build/assets/ $androidYoutubeDlProject/lib/src/main/assets +cp -rfv $PWD/build/libs/ $androidYoutubeDlProject/lib/src/main/jniLibs +} -echo "[INFO] Build [armeabi-v7a]" clean + build "armeabi-v7a" -copy_libs -echo "[INFO] Build [armeabi-v7a] done" +build "x86" +build "arm64-v8a" +copy_assets_to_androidYoutubeDlProject echo "[INFO] Build done" \ No newline at end of file From 5b201461d4a92533a37b5977d5cf66fc5e9059b9 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 19 Sep 2018 13:10:21 +0100 Subject: [PATCH 10/90] Test commit --- clean-build-copy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index fe403c3ecf..cbce818d11 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -68,4 +68,4 @@ build "x86" build "arm64-v8a" copy_assets_to_androidYoutubeDlProject -echo "[INFO] Build done" \ No newline at end of file +echo "[INFO] Build done" From f54b183d8bb22e8bafdc30ba5c5fc7d6b9e89227 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 19 Sep 2018 14:28:45 +0100 Subject: [PATCH 11/90] Added python requirements.txt --- requirements.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000..09927d4273 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +colorama==0.3.3 +appdirs==1.4.3 +sh==1.10 +jinja2==2.10 +cython=0.28.5 \ No newline at end of file From 8c1b86a8ceb37a333c17201efa9667143db032d1 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 20 Nov 2018 09:03:48 +0000 Subject: [PATCH 12/90] Updated per new implementation. Fixed requirements. --- pythonforandroid/bootstraps/sdl2/build/jni/src/start.c | 4 ++-- requirements.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c index cea322700c..ce7a1062a9 100644 --- a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c +++ b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c @@ -298,11 +298,11 @@ int main(int argc, char *argv[]) { return ret; } -JNIEXPORT void JNICALL Java_org_redwid_android_youtube_dl_YoutubeDlService_nativeStart( +JNIEXPORT void JNICALL Java_org_redwid_android_youtube_dl_YoutubeDlWorker_nativeStart( JNIEnv *env, jobject thiz, jstring j_android_private, jstring j_android_argument, jstring j_application_entrypoint, jstring j_python_name, jstring j_python_home, jstring j_python_path, jobjectArray j_application_args) { - LOGP("Java_org_redwid_youtube_dl_android_YoutubeDlService_nativeStart begin."); + LOGP("Python Java_org_redwid_android_youtube_dl_YoutubeDlWorker_nativeStart() begin"); jboolean iscopy; const char *android_private = (*env)->GetStringUTFChars(env, j_android_private, &iscopy); diff --git a/requirements.txt b/requirements.txt index 09927d4273..12dcc5a76c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ colorama==0.3.3 appdirs==1.4.3 sh==1.10 jinja2==2.10 -cython=0.28.5 \ No newline at end of file +pip==0.28.5 \ No newline at end of file From e29602cd89843c98dcfe33fcd2f274871af2a545 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 20 Nov 2018 13:00:06 +0000 Subject: [PATCH 13/90] After merge update --- pythonforandroid/bootstraps/sdl2/build/jni/src/start.c | 1 - 1 file changed, 1 deletion(-) diff --git a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c index e3a436e78d..472ac7555c 100644 --- a/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c +++ b/pythonforandroid/bootstraps/sdl2/build/jni/src/start.c @@ -354,7 +354,6 @@ JNIEXPORT void JNICALL Java_org_redwid_android_youtube_dl_YoutubeDlWorker_native setenv("PYTHON_NAME", python_name, 1); setenv("PYTHONHOME", python_home, 1); setenv("PYTHONPATH", python_path, 1); - setenv("PYTHON_SERVICE_ARGUMENT", arg, 1); setenv("P4A_BOOTSTRAP", "SDL2", 1); const char *argv[20]; From 6bd0e9913c4a624e674080fa11753560d3d44a74 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 20 Nov 2018 14:13:16 +0000 Subject: [PATCH 14/90] Disabled x86 arch as it has a compilation errors --- clean-build-copy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index cbce818d11..ee6d4a4288 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -45,7 +45,7 @@ cp -rfv $distFolder/src/main/assets/ $PWD/build/assets rm $PWD/build/assets/.gitkeep delete_unused_assets "armeabi-v7a" -delete_unused_assets "x86" +#delete_unused_assets "x86" delete_unused_assets "arm64-v8a" } @@ -64,7 +64,7 @@ cp -rfv $PWD/build/libs/ $androidYoutubeDlProject/lib/src/main/jniLibs clean build "armeabi-v7a" -build "x86" +#build "x86" build "arm64-v8a" copy_assets_to_androidYoutubeDlProject From 27612526dd2420e31e27691b08b42ee336ad3dfe Mon Sep 17 00:00:00 2001 From: Redwid Date: Fri, 18 Jan 2019 10:32:36 +0000 Subject: [PATCH 15/90] Added set up instruction --- clean-build-copy.sh | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index ee6d4a4288..7b9cca5e3b 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -1,4 +1,22 @@ #!/usr/bin/env bash +# +# Set up instructions for MacOS (10.14) +# 1. Set up your ANDROID_HOME directory: +# export ANDROID_HOME=/Users/{your_user_name_here}/Library/Android/sdk +# source ~/.bash_profile +# 2. Install gcc: +# brew install gcc +# 3. Install the macOS_SDK_headers_for_macOS_10.14.pkg: https://github.com/frida/frida/issues/338#issuecomment-424595668 +# cd /Library/Developer/CommandLineTools/Packages/ +# open macOS_SDK_headers_for_macOS_10.14.pkg +# 4. Install llvm: +# brew install llvm +# 5. Install XCode +# 6. Download NDK r16b: https://developer.android.com/ndk/downloads/older_releases?hl=zh-tw +# set ndkDir value below pointed to unpacked NDK r16b folder +# + + #enviroment set up export PYTHONIOENCODING=UTF-8 export PYTHONUNBUFFERED=1 @@ -12,7 +30,7 @@ pythonAppDistName="youtube_dl_wrapper" pythonAppPackageName="org.youtube.dl" pythonAppName="youtube_dl" distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" -ndkDir=~/Library/Android/sdk/ndk-bundle +ndkDir=~/Downloads/android-ndk-r16b #Link for android-youtube-dl project to where script will copy build artifacts androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" From d53ac88d582b8ba7ebe05bc8ac96a39070297406 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 11:59:02 +0100 Subject: [PATCH 16/90] Change travis script --- .travis.yml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index e20a8cc75f..8cb8e06fb7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,28 +8,11 @@ services: before_install: - sudo apt update -qq - sudo apt install -qq --no-install-recommends python2.7 python3 - - sudo pip install tox>=2.0 - # https://github.com/travis-ci/travis-ci/issues/6069#issuecomment-266546552 - - git remote set-branches --add origin master - - git fetch env: global: - ANDROID_SDK_HOME=/opt/android/android-sdk - ANDROID_NDK_HOME=/opt/android/android-ndk - matrix: - - COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python3.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements sdl2,pyjnius,kivy,python3' - # overrides requirements to skip `peewee` pure python module, see: - # https://github.com/kivy/python-for-android/issues/1263#issuecomment-390421054 - - COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python2_sqlite_openssl.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --requirements sdl2,pyjnius,kivy,python2,openssl,requests,sqlite3,setuptools' - - COMMAND='. venv/bin/activate && cd testapps/ && python setup_testapp_python2.py apk --sdk-dir $ANDROID_SDK_HOME --ndk-dir $ANDROID_NDK_HOME --bootstrap sdl2 --requirements python2,numpy' - # builds only the recipes that moved - - COMMAND='. venv/bin/activate && ./ci/rebuild_updated_recipes.py' - -before_script: - # we want to fail fast on tox errors without having to `docker build` first - - tox script: - - docker build --tag=p4a . - - docker run p4a /bin/sh -c "$COMMAND" + - sh clean-build-copy.sh From d5a71e5f2064e8b2c46f16da6e21c2d33657412e Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 11:59:44 +0100 Subject: [PATCH 17/90] Change travis script --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8cb8e06fb7..1b1e11584f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,4 +15,4 @@ env: - ANDROID_NDK_HOME=/opt/android/android-ndk script: - - sh clean-build-copy.sh + - docker sh clean-build-copy.sh From e890875564cbeeea823f512ad80e1f7462e1efca Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 12:03:18 +0100 Subject: [PATCH 18/90] Remove docker --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b1e11584f..455a9e1a30 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,17 +2,17 @@ sudo: required language: generic -services: - - docker - before_install: - sudo apt update -qq - sudo apt install -qq --no-install-recommends python2.7 python3 + - wget wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip + - unzip -qq android-ndk-r16b-linux-x86_64.zip + env: global: - ANDROID_SDK_HOME=/opt/android/android-sdk - - ANDROID_NDK_HOME=/opt/android/android-ndk + - ANDROID_NDK_HOME=`pwd`/android-ndk-r16b script: - - docker sh clean-build-copy.sh + - sh clean-build-copy.sh From d4acce611d186f85c571640f3c18e7b9fc661b96 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 13:21:02 +0100 Subject: [PATCH 19/90] Correct typo in wget --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 455a9e1a30..dae9d1f22e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ language: generic before_install: - sudo apt update -qq - sudo apt install -qq --no-install-recommends python2.7 python3 - - wget wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip + - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip From 9dbb20c08da7314674a2ebe66365e03fd7705606 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 13:42:38 +0100 Subject: [PATCH 20/90] Add virtualenv --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index dae9d1f22e..0830b630a8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ before_install: - sudo apt install -qq --no-install-recommends python2.7 python3 - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip + - virtualenv --python=/usr/bin/python2.7 venv/bin/activate + - pip install -r requirements.txt env: From 4f0fcc52fe4a7ebcf627d68bf8a6963e1916a404 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 13:46:22 +0100 Subject: [PATCH 21/90] Add pip upgrade --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0830b630a8..16bb8e407c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ before_install: - sudo apt install -qq --no-install-recommends python2.7 python3 - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip + - pip install --upgrade pip - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - pip install -r requirements.txt From 09bd64484f7a199e65fb24a73f3e8904836a8aeb Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 13:51:16 +0100 Subject: [PATCH 22/90] Disable pip check --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 16bb8e407c..ec2ec68f73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_install: - sudo apt install -qq --no-install-recommends python2.7 python3 - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip - - pip install --upgrade pip + - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - pip install -r requirements.txt From ed7a6857da4c0523e7af6351f27ddfdaf7cc222c Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 13:54:21 +0100 Subject: [PATCH 23/90] Remove pip from requirements --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 12dcc5a76c..b643434906 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ colorama==0.3.3 appdirs==1.4.3 sh==1.10 -jinja2==2.10 -pip==0.28.5 \ No newline at end of file +jinja2==2.10 \ No newline at end of file From f6e344e4a407fab48a0ec7595160511fd6b97740 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:01:00 +0100 Subject: [PATCH 24/90] Add --user for pip command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec2ec68f73..1591c146ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ before_install: - unzip -qq android-ndk-r16b-linux-x86_64.zip - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - - pip install -r requirements.txt + - pip install --user -r requirements.txt env: From fc488b365353b184863bc540a955a6682a5fef04 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:08:24 +0100 Subject: [PATCH 25/90] Include android section --- .travis.yml | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1591c146ca..bd2b1e36fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,35 @@ sudo: required -language: generic + +language: android + + +android: + components: + # Uncomment the lines below if you want to + # use the latest revision of Android SDK Tools + # - tools + # - platform-tools + + # The BuildTools version used by your project + - build-tools-28.0.3 + + # The SDK version used to compile your project + - android-23 + + # Additional components + - extra-google-m2repository + - extra-android-m2repository + + # Specify at least one system image, + # if you need to run emulator(s) during your tests + # - sys-img-x86-android-26 + # - sys-img-armeabi-v7a-android-17 + + licenses: + - 'android-sdk-license-.+' + - 'google-gdk-license-.+' + before_install: - sudo apt update -qq @@ -17,5 +46,6 @@ env: - ANDROID_SDK_HOME=/opt/android/android-sdk - ANDROID_NDK_HOME=`pwd`/android-ndk-r16b + script: - sh clean-build-copy.sh From 3205dcd20f22d873bea7cfb06303f4887ab78dca Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:14:35 +0100 Subject: [PATCH 26/90] Add Cython requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b643434906..cfbf4726f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ colorama==0.3.3 appdirs==1.4.3 sh==1.10 -jinja2==2.10 \ No newline at end of file +jinja2==2.10 +Cython==0.29.7 \ No newline at end of file From f2f86b93935b171c23292c756aa810bcb08c3be4 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:25:06 +0100 Subject: [PATCH 27/90] Change install --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bd2b1e36fb..7625d8b44d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ android: # - platform-tools # The BuildTools version used by your project - - build-tools-28.0.3 + - build-tools-23.0.1 # The SDK version used to compile your project - android-23 @@ -33,7 +33,7 @@ android: before_install: - sudo apt update -qq - - sudo apt install -qq --no-install-recommends python2.7 python3 + - sudo apt-get install -y build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip - export PIP_DISABLE_PIP_VERSION_CHECK=1 From 9ccc1ab02d74677a11356238158cf09899c5a92b Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:26:42 +0100 Subject: [PATCH 28/90] Set android api version --- clean-build-copy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 7b9cca5e3b..7e2b07d1c9 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -22,6 +22,7 @@ export PYTHONIOENCODING=UTF-8 export PYTHONUNBUFFERED=1 export VERSIONER_PYTHON_VERSION=2.7 export PYTHONPATH=$PWD +export ANDROIDAPI="23" #script set up p4a="$PWD/pythonforandroid/toolchain.py" From b0c7d457ecd04848372073ff870661972693e3c2 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:31:09 +0100 Subject: [PATCH 29/90] Correct install --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7625d8b44d..364e89f47c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,7 @@ android: before_install: - sudo apt update -qq - - sudo apt-get install -y build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool + - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip - export PIP_DISABLE_PIP_VERSION_CHECK=1 From 42759185a8e2c93f3eb8ce1fd346735f8feac644 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:42:12 +0100 Subject: [PATCH 30/90] Add NDKAPI --- clean-build-copy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 7e2b07d1c9..f3c354e16a 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -23,6 +23,7 @@ export PYTHONUNBUFFERED=1 export VERSIONER_PYTHON_VERSION=2.7 export PYTHONPATH=$PWD export ANDROIDAPI="23" +export NDKAPI="r16b" #script set up p4a="$PWD/pythonforandroid/toolchain.py" From ca26daddbe4b96dcbb73a8a950df73a67ddaa2bb Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 14:53:38 +0100 Subject: [PATCH 31/90] Change NDKAPI to int --- clean-build-copy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index f3c354e16a..b1220bad7d 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -23,7 +23,7 @@ export PYTHONUNBUFFERED=1 export VERSIONER_PYTHON_VERSION=2.7 export PYTHONPATH=$PWD export ANDROIDAPI="23" -export NDKAPI="r16b" +export NDKAPI="16" #script set up p4a="$PWD/pythonforandroid/toolchain.py" From 8510285a9d606d93a7ba5df68f381536f7106bf3 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 15:01:21 +0100 Subject: [PATCH 32/90] Set tools and platform-tools --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 364e89f47c..67d67e935f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,8 @@ android: components: # Uncomment the lines below if you want to # use the latest revision of Android SDK Tools - # - tools - # - platform-tools + - tools + - platform-tools # The BuildTools version used by your project - build-tools-23.0.1 From 02aa089b389244821aaa804cf21c07790b963d96 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 15:10:44 +0100 Subject: [PATCH 33/90] Empty commit --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 67d67e935f..9d5e094fba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,3 +49,4 @@ env: script: - sh clean-build-copy.sh + From 0a3c67ad0d1d66594a7e3c824f4e354a5aa3c88a Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 15:23:37 +0100 Subject: [PATCH 34/90] Correct config --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9d5e094fba..e25255b24b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,8 @@ android: components: # Uncomment the lines below if you want to # use the latest revision of Android SDK Tools - - tools - - platform-tools + - tools + - platform-tools # The BuildTools version used by your project - build-tools-23.0.1 From 0ad0321932cb53f04139fbe5833c9233d7da8b99 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 15:38:00 +0100 Subject: [PATCH 35/90] Update config --- .travis.yml | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index e25255b24b..d13e5a057e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,26 +6,14 @@ language: android android: components: - # Uncomment the lines below if you want to - # use the latest revision of Android SDK Tools - tools - platform-tools - - # The BuildTools version used by your project - build-tools-23.0.1 - - # The SDK version used to compile your project - android-23 - - # Additional components + - extra-google-google_play_services - extra-google-m2repository - extra-android-m2repository - # Specify at least one system image, - # if you need to run emulator(s) during your tests - # - sys-img-x86-android-26 - # - sys-img-armeabi-v7a-android-17 - licenses: - 'android-sdk-license-.+' - 'google-gdk-license-.+' @@ -35,7 +23,9 @@ before_install: - sudo apt update -qq - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - - unzip -qq android-ndk-r16b-linux-x86_64.zip + - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME + - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b + - export PATH=$PATH:$ANDROID_NDK_HOME - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - pip install --user -r requirements.txt @@ -44,7 +34,6 @@ before_install: env: global: - ANDROID_SDK_HOME=/opt/android/android-sdk - - ANDROID_NDK_HOME=`pwd`/android-ndk-r16b script: From 4ebd6770c0e089e526e09a901d30ee087c51d23a Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 15:49:41 +0100 Subject: [PATCH 36/90] Add debug output --- pythonforandroid/build.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index 9aa7212559..f73589af6b 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -1,19 +1,19 @@ from __future__ import print_function -from os.path import (join, realpath, dirname, expanduser, exists, - split, isdir) -from os import environ -import os import glob -import sys +import os import re import sh +import sys +from os import environ +from os.path import (join, realpath, dirname, expanduser, exists, + split, isdir) -from pythonforandroid.util import (ensure_dir, current_directory) +from pythonforandroid.archs import ArchARM, ArchARMv7_a, ArchAarch_64, Archx86 from pythonforandroid.logger import (info, warning, error, info_notify, Err_Fore, info_main, shprint) -from pythonforandroid.archs import ArchARM, ArchARMv7_a, ArchAarch_64, Archx86 from pythonforandroid.recipe import Recipe +from pythonforandroid.util import (ensure_dir, current_directory) DEFAULT_ANDROID_API = 15 @@ -414,6 +414,8 @@ def prepare_build_environment(self, 'platforms', 'android-{}'.format(self.ndk_api), platform_dir) + warning('self.ndk_dir: {}'.format(self.ndk_dir)) + warning('self.ndk_api: {}'.format(self.ndk_api)) if not exists(self.ndk_platform): warning('ndk_platform doesn\'t exist: {}'.format( self.ndk_platform)) From 24eee4ab176604ffc95cf16fd961b3c5fa3a65e2 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 16:11:23 +0100 Subject: [PATCH 37/90] Add debug output --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index d13e5a057e..0ce888e4cc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,7 @@ before_install: - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b + - echo "ANDROID_NDK_HOME" $ANDROID_NDK_HOME - export PATH=$PATH:$ANDROID_NDK_HOME - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate From 4ba2ec6fd5705e0dd8f2ee9951e4d08006c864cc Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 16:20:29 +0100 Subject: [PATCH 38/90] Changed ndkDir --- clean-build-copy.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index b1220bad7d..c3aa80811d 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -32,7 +32,8 @@ pythonAppDistName="youtube_dl_wrapper" pythonAppPackageName="org.youtube.dl" pythonAppName="youtube_dl" distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" -ndkDir=~/Downloads/android-ndk-r16b +#ndkDir=~/Downloads/android-ndk-r16b +ndkDir=$ANDROID_NDK_HOME #Link for android-youtube-dl project to where script will copy build artifacts androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" From 7c6c743ac33d21e61b90457aea9afe9cebe967f8 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 16:53:37 +0100 Subject: [PATCH 39/90] Add youtube-dl to build config --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0ce888e4cc..a1926fe3e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,6 +31,8 @@ before_install: - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - pip install --user -r requirements.txt +install: + - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl env: global: From e72f62b51f39f3cf6e37ba668106fbd6b5a3626b Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 18:20:37 +0100 Subject: [PATCH 40/90] Add debug output --- clean-build-copy.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index c3aa80811d..1a643372c6 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -13,7 +13,7 @@ # brew install llvm # 5. Install XCode # 6. Download NDK r16b: https://developer.android.com/ndk/downloads/older_releases?hl=zh-tw -# set ndkDir value below pointed to unpacked NDK r16b folder +# set $ANDROID_NDK_HOME value below pointed to unpacked NDK r16b folder # @@ -24,6 +24,8 @@ export VERSIONER_PYTHON_VERSION=2.7 export PYTHONPATH=$PWD export ANDROIDAPI="23" export NDKAPI="16" +#Commented for travis build +#export ANDROID_NDK_HOME=~/Downloads/android-ndk-r16b #script set up p4a="$PWD/pythonforandroid/toolchain.py" @@ -32,8 +34,8 @@ pythonAppDistName="youtube_dl_wrapper" pythonAppPackageName="org.youtube.dl" pythonAppName="youtube_dl" distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" -#ndkDir=~/Downloads/android-ndk-r16b -ndkDir=$ANDROID_NDK_HOME + +echo "pythonApp: ${pythonApp}" #Link for android-youtube-dl project to where script will copy build artifacts androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" @@ -50,7 +52,7 @@ build() { echo "[INFO] Build [$1]" /usr/bin/python $p4a clean_builds rm -rfv $distFolder -/usr/bin/python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ndkDir --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle +/usr/bin/python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ANDROID_NDK_HOME --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle copy_libs copy_assets echo "[INFO] Build [$1] done" From 46d231ff5f7f4452cc95a7d3db915a89e904c44d Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 18:28:36 +0100 Subject: [PATCH 41/90] Revert debug output --- pythonforandroid/build.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index f73589af6b..725c1c5eb7 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -414,8 +414,6 @@ def prepare_build_environment(self, 'platforms', 'android-{}'.format(self.ndk_api), platform_dir) - warning('self.ndk_dir: {}'.format(self.ndk_dir)) - warning('self.ndk_api: {}'.format(self.ndk_api)) if not exists(self.ndk_platform): warning('ndk_platform doesn\'t exist: {}'.format( self.ndk_platform)) From 4448d077acabcf575524263af08ecee2a425313f Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 18:30:01 +0100 Subject: [PATCH 42/90] Tmp comment arm64-v8a build --- clean-build-copy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 1a643372c6..c1018d9407 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -69,7 +69,7 @@ rm $PWD/build/assets/.gitkeep delete_unused_assets "armeabi-v7a" #delete_unused_assets "x86" -delete_unused_assets "arm64-v8a" +#delete_unused_assets "arm64-v8a" } delete_unused_assets() { @@ -88,7 +88,7 @@ clean build "armeabi-v7a" #build "x86" -build "arm64-v8a" +#build "arm64-v8a" copy_assets_to_androidYoutubeDlProject echo "[INFO] Build done" From 61f703a62d80eaf046782af620680bd5d8133ca3 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 18:49:13 +0100 Subject: [PATCH 43/90] Add debug output --- .../bootstraps/sdl2/build/build.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pythonforandroid/bootstraps/sdl2/build/build.py b/pythonforandroid/bootstraps/sdl2/build/build.py index af30c967ef..511e22f71a 100644 --- a/pythonforandroid/bootstraps/sdl2/build/build.py +++ b/pythonforandroid/bootstraps/sdl2/build/build.py @@ -2,22 +2,21 @@ # coding: utf-8 from __future__ import print_function -from os.path import ( - dirname, join, isfile, realpath, relpath, split, exists, basename) -from os import makedirs, remove, listdir -import os -import tarfile -import time + +import jinja2 import json -import subprocess +import os import shutil -from zipfile import ZipFile +import subprocess import sys +import tarfile +import time from distutils.version import LooseVersion - from fnmatch import fnmatch - -import jinja2 +from os import makedirs, remove, listdir +from os.path import ( + dirname, join, isfile, realpath, relpath, split, exists, basename) +from zipfile import ZipFile curdir = dirname(__file__) @@ -221,6 +220,7 @@ def compile_dir(dfn): def make_package(args): # Ignore warning if the launcher is in args if not args.launcher: + print('args.private path: {}'.format(args.private)) if not (exists(join(realpath(args.private), 'main.py')) or exists(join(realpath(args.private), 'main.pyo'))): print('''BUILD FAILURE: No main.py(o) found in your app directory. This From 25c41acdf561edb384be57344a567297cecd8773 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 19:32:56 +0100 Subject: [PATCH 44/90] Add debug output --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a1926fe3e7..41e8a819af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ android: - platform-tools - build-tools-23.0.1 - android-23 - - extra-google-google_play_services + #- extra-google-google_play_services - extra-google-m2repository - extra-android-m2repository @@ -30,9 +30,13 @@ before_install: - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - pip install --user -r requirements.txt + - ls + - echo `pwd` install: - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl + - ls + - echo `pwd` env: global: From 20c0e550faf5b899c749cddf925a743698413f6a Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 19:48:24 +0100 Subject: [PATCH 45/90] Add debug output --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 41e8a819af..a4713ba7c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,13 +30,13 @@ before_install: - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - pip install --user -r requirements.txt - - ls - - echo `pwd` + - ls -a + - pwd install: - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl - - ls - - echo `pwd` + - ls -a + - pwd env: global: From c2f2218138899b2157c1cff6dc801b0bc2fe6267 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 19:49:25 +0100 Subject: [PATCH 46/90] Add debug output --- pythonforandroid/bootstraps/sdl2/build/build.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pythonforandroid/bootstraps/sdl2/build/build.py b/pythonforandroid/bootstraps/sdl2/build/build.py index 511e22f71a..85c8565f04 100644 --- a/pythonforandroid/bootstraps/sdl2/build/build.py +++ b/pythonforandroid/bootstraps/sdl2/build/build.py @@ -221,6 +221,7 @@ def make_package(args): # Ignore warning if the launcher is in args if not args.launcher: print('args.private path: {}'.format(args.private)) + print('realpath: {}'.format(join(realpath(args.private), 'main.py'))) if not (exists(join(realpath(args.private), 'main.py')) or exists(join(realpath(args.private), 'main.pyo'))): print('''BUILD FAILURE: No main.py(o) found in your app directory. This From d6bdaa1a13357bbcce65c508f9906a506f71114b Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:10:05 +0100 Subject: [PATCH 47/90] Commented lines --- .travis.yml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index a4713ba7c1..4546b37ea4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,17 +21,18 @@ android: before_install: - sudo apt update -qq - - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool - - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME - - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b - - echo "ANDROID_NDK_HOME" $ANDROID_NDK_HOME - - export PATH=$PATH:$ANDROID_NDK_HOME - - export PIP_DISABLE_PIP_VERSION_CHECK=1 - - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - - pip install --user -r requirements.txt +# - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool +# - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip +# - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME +# - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b +# - echo "ANDROID_NDK_HOME" $ANDROID_NDK_HOME +# - export PATH=$PATH:$ANDROID_NDK_HOME +# - export PIP_DISABLE_PIP_VERSION_CHECK=1 +# - virtualenv --python=/usr/bin/python2.7 venv/bin/activate +# - pip install --user -r requirements.txt - ls -a - pwd + - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/main.py install: - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl @@ -43,6 +44,6 @@ env: - ANDROID_SDK_HOME=/opt/android/android-sdk -script: - - sh clean-build-copy.sh +#script: +# - sh clean-build-copy.sh From 9558752ab49defa696a02bca552c84ce9da1f713 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:10:23 +0100 Subject: [PATCH 48/90] Commented lines --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4546b37ea4..ac5b624b1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,6 @@ android: - platform-tools - build-tools-23.0.1 - android-23 - #- extra-google-google_play_services - extra-google-m2repository - extra-android-m2repository From b4abeafbdd83bce4b19dc43dbea38d0dbfe798ee Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:14:42 +0100 Subject: [PATCH 49/90] Update config --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index ac5b624b1b..492e7a6b29 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,8 +10,8 @@ android: - platform-tools - build-tools-23.0.1 - android-23 - - extra-google-m2repository - - extra-android-m2repository +# - extra-google-m2repository +# - extra-android-m2repository licenses: - 'android-sdk-license-.+' @@ -29,14 +29,12 @@ before_install: # - export PIP_DISABLE_PIP_VERSION_CHECK=1 # - virtualenv --python=/usr/bin/python2.7 venv/bin/activate # - pip install --user -r requirements.txt - - ls -a - - pwd - - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/main.py install: - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl - ls -a - pwd + - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/main.py env: global: From 4439ec95d727a1e9461e7455d6e3cf080972f05d Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:20:23 +0100 Subject: [PATCH 50/90] Debug lines --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 492e7a6b29..c32b9a80bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ sudo: required - +#jdk: openjdk8 language: android @@ -34,6 +34,9 @@ install: - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl - ls -a - pwd + - ls -l /home/travis/build/Redwid/ + - ls -l /home/travis/build/Redwid/youtube-dl/ + - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/ - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/main.py env: From 112e5abe96214bf8c0225efe686247f144913327 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:24:10 +0100 Subject: [PATCH 51/90] Debug lines --- .travis.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index c32b9a80bd..e75a8dfaa8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,21 @@ sudo: required #jdk: openjdk8 -language: android +#language: android -android: - components: - - tools - - platform-tools - - build-tools-23.0.1 - - android-23 +#android: +# components: +# - tools +# - platform-tools +# - build-tools-23.0.1 +# - android-23 # - extra-google-m2repository # - extra-android-m2repository - licenses: - - 'android-sdk-license-.+' - - 'google-gdk-license-.+' +# licenses: +# - 'android-sdk-license-.+' +# - 'google-gdk-license-.+' before_install: @@ -35,8 +35,8 @@ install: - ls -a - pwd - ls -l /home/travis/build/Redwid/ - - ls -l /home/travis/build/Redwid/youtube-dl/ - - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/ + - ls /home/travis/build/Redwid/youtube-dl/ + - ls /home/travis/build/Redwid/youtube-dl/youtube_dl/ - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/main.py env: From 4fadd583e7bb526e6388cf834ffcf7c9695c95cd Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:26:46 +0100 Subject: [PATCH 52/90] Change dir --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index e75a8dfaa8..260d1552d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ sudo: required # - 'google-gdk-license-.+' -before_install: - - sudo apt update -qq +#before_install: +# - sudo apt update -qq # - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool # - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip # - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME @@ -31,7 +31,7 @@ before_install: # - pip install --user -r requirements.txt install: - - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git Redwid/youtube-dl + - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git ../youtube-dl - ls -a - pwd - ls -l /home/travis/build/Redwid/ From 9e605a4fcc16a03e5f0278f4fd069ff38f1b0645 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 20:29:09 +0100 Subject: [PATCH 53/90] Uncomment config --- .travis.yml | 54 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index 260d1552d1..583a0cbc03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,49 +1,45 @@ sudo: required #jdk: openjdk8 -#language: android +language: android -#android: -# components: -# - tools -# - platform-tools -# - build-tools-23.0.1 -# - android-23 +android: + components: + - tools + - platform-tools + - build-tools-23.0.1 + - android-23 # - extra-google-m2repository # - extra-android-m2repository -# licenses: -# - 'android-sdk-license-.+' -# - 'google-gdk-license-.+' + licenses: + - 'android-sdk-license-.+' + - 'google-gdk-license-.+' -#before_install: -# - sudo apt update -qq -# - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool -# - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip -# - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME -# - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b -# - echo "ANDROID_NDK_HOME" $ANDROID_NDK_HOME -# - export PATH=$PATH:$ANDROID_NDK_HOME -# - export PIP_DISABLE_PIP_VERSION_CHECK=1 -# - virtualenv --python=/usr/bin/python2.7 venv/bin/activate -# - pip install --user -r requirements.txt +before_install: + - sudo apt update -qq + - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool + - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip + - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME + - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b + - echo "ANDROID_NDK_HOME" $ANDROID_NDK_HOME + - export PATH=$PATH:$ANDROID_NDK_HOME + - export PIP_DISABLE_PIP_VERSION_CHECK=1 + - virtualenv --python=/usr/bin/python2.7 venv/bin/activate + - pip install --user -r requirements.txt + install: - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git ../youtube-dl - - ls -a - - pwd - - ls -l /home/travis/build/Redwid/ - - ls /home/travis/build/Redwid/youtube-dl/ - - ls /home/travis/build/Redwid/youtube-dl/youtube_dl/ - - ls -l /home/travis/build/Redwid/youtube-dl/youtube_dl/main.py + env: global: - ANDROID_SDK_HOME=/opt/android/android-sdk -#script: -# - sh clean-build-copy.sh +script: + - sh clean-build-copy.sh From 6e043bb28c51648b5a1a4efde156e8a7085b371a Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 21:03:21 +0100 Subject: [PATCH 54/90] Add conditional for travis --- clean-build-copy.sh | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index c1018d9407..494cc7208c 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -24,8 +24,11 @@ export VERSIONER_PYTHON_VERSION=2.7 export PYTHONPATH=$PWD export ANDROIDAPI="23" export NDKAPI="16" -#Commented for travis build -#export ANDROID_NDK_HOME=~/Downloads/android-ndk-r16b + +if [ -z "$ANDROID_NDK_HOME" ] +then + export ANDROID_NDK_HOME=~/Downloads/android-ndk-r16b +fi #script set up p4a="$PWD/pythonforandroid/toolchain.py" @@ -33,9 +36,17 @@ pythonApp="$(dirname "$PWD")/youtube-dl/youtube_dl" pythonAppDistName="youtube_dl_wrapper" pythonAppPackageName="org.youtube.dl" pythonAppName="youtube_dl" -distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" + +#Check if we are running on travis +if [[$CI == 'true' && $TRAVIS == 'true']]; +then + distFolder="$HOME/.local/share/python-for-android/dists/$pythonAppDistName" +else + distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" +fi echo "pythonApp: ${pythonApp}" +echo "distFolder: ${distFolder}" #Link for android-youtube-dl project to where script will copy build artifacts androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" @@ -69,7 +80,7 @@ rm $PWD/build/assets/.gitkeep delete_unused_assets "armeabi-v7a" #delete_unused_assets "x86" -#delete_unused_assets "arm64-v8a" +delete_unused_assets "arm64-v8a" } delete_unused_assets() { @@ -88,7 +99,7 @@ clean build "armeabi-v7a" #build "x86" -#build "arm64-v8a" +build "arm64-v8a" copy_assets_to_androidYoutubeDlProject echo "[INFO] Build done" From 4e872f360198c531a9f84ad4869a900ce95213b6 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 21:30:22 +0100 Subject: [PATCH 55/90] Change travis condition check --- clean-build-copy.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 494cc7208c..d161170ec3 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -38,11 +38,11 @@ pythonAppPackageName="org.youtube.dl" pythonAppName="youtube_dl" #Check if we are running on travis -if [[$CI == 'true' && $TRAVIS == 'true']]; +if [ -z "$TRAVIS" ] then - distFolder="$HOME/.local/share/python-for-android/dists/$pythonAppDistName" -else distFolder="$HOME/.python-for-android/dists/$pythonAppDistName" +else + distFolder="$HOME/.local/share/python-for-android/dists/$pythonAppDistName" fi echo "pythonApp: ${pythonApp}" From 2d2973bac6de0a83c66e8120b928ee803d654ee4 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 22:54:12 +0100 Subject: [PATCH 56/90] Add method to crete aar files --- clean-build-copy.sh | 94 ++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 27 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index d161170ec3..2baf5a7345 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -23,7 +23,7 @@ export PYTHONUNBUFFERED=1 export VERSIONER_PYTHON_VERSION=2.7 export PYTHONPATH=$PWD export ANDROIDAPI="23" -export NDKAPI="16" +export NDKAPI="23" if [ -z "$ANDROID_NDK_HOME" ] then @@ -51,55 +51,95 @@ echo "distFolder: ${distFolder}" #Link for android-youtube-dl project to where script will copy build artifacts androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" + clean() { -echo "[INFO] Clean" -/usr/bin/python $p4a clean_builds -rm -rfv $distFolder -rm -rfv $PWD/build -echo "[INFO] Clean done" + echo "[INFO] Clean" + /usr/bin/python $p4a clean_builds + rm -rfv $distFolder + rm -rfv $PWD/build + echo "[INFO] Clean done" } + build() { -echo "[INFO] Build [$1]" -/usr/bin/python $p4a clean_builds -rm -rfv $distFolder -/usr/bin/python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ANDROID_NDK_HOME --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle -copy_libs -copy_assets -echo "[INFO] Build [$1] done" + echo "[INFO] Build [$1]" + python $p4a clean_builds + rm -rfv $distFolder + python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ANDROID_NDK_HOME --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle +# if [ -z "$TRAVIS" ] +# then +# copy_libs +# copy_assets +# else + copy_assets_and_make_aar $1 +# fi + echo "[INFO] Build [$1] done" } + copy_libs() { -mkdir $PWD/build -cp -rfv $distFolder/libs/ $PWD/build/libs/ + mkdir $PWD/build + cp -rfv $distFolder/libs/ $PWD/build/libs/ } + copy_assets() { -cp -rfv $distFolder/src/main/assets/ $PWD/build/assets -rm $PWD/build/assets/.gitkeep + cp -rfv $distFolder/src/main/assets/ $PWD/build/assets + rm $PWD/build/assets/.gitkeep -delete_unused_assets "armeabi-v7a" -#delete_unused_assets "x86" -delete_unused_assets "arm64-v8a" + delete_unused_assets "armeabi-v7a" + #delete_unused_assets "x86" + delete_unused_assets "arm64-v8a" } + delete_unused_assets() { -rm $PWD/build/libs/$1/libSDL2.so -rm $PWD/build/libs/$1/libSDL2_image.so -rm $PWD/build/libs/$1/libSDL2_mixer.so -rm $PWD/build/libs/$1/libSDL2_ttf.so + rm $PWD/build/libs/$1/libSDL2.so + rm $PWD/build/libs/$1/libSDL2_image.so + rm $PWD/build/libs/$1/libSDL2_mixer.so + rm $PWD/build/libs/$1/libSDL2_ttf.so } + copy_assets_to_androidYoutubeDlProject() { -cp -rfv $PWD/build/assets/ $androidYoutubeDlProject/lib/src/main/assets -cp -rfv $PWD/build/libs/ $androidYoutubeDlProject/lib/src/main/jniLibs + cp -rfv $PWD/build/assets/ $androidYoutubeDlProject/lib/src/main/assets + cp -rfv $PWD/build/libs/ $androidYoutubeDlProject/lib/src/main/jniLibs } + +copy_assets_and_make_aar() { + echo "[INFO] Copy assets [$1]" + #Copy *.so files + mkdir $PWD/build + mkdir $PWD/build/$1 + mkdir $PWD/build/$1/jni + mkdir $PWD/build/$1/jni/$1 + cp -rfv $distFolder/libs/$1 $PWD/build/$1/jni + rm $PWD/build/$1/jni/$1/libSDL2.so + rm $PWD/build/$1/jni/$1/libSDL2_image.so + rm $PWD/build/$1/jni/$1/libSDL2_mixer.so + rm $PWD/build/$1/jni/$1/libSDL2_ttf.so + + #Copy *.mp3 file + mkdir $PWD/build/$1/assets + cp -rfv $distFolder/src/main/assets/private.mp3 $PWD/build/$1/assets/private-$1.mp3 + echo "[INFO] Copy assets [$1] done" + + echo "[INFO] Make aar [$1]" + #Create aar file + root=$PWD + cd $root/build/$1 + zip $root/build/$1.aar -r ./* + cd $root + echo "[INFO] Make aar [$1] done" +} + + clean build "armeabi-v7a" #build "x86" build "arm64-v8a" -copy_assets_to_androidYoutubeDlProject +#copy_assets_to_androidYoutubeDlProject echo "[INFO] Build done" From 4329f2e7441db34807b2b4ae1e786dc2c6626d62 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 16 Apr 2019 23:33:03 +0100 Subject: [PATCH 57/90] Use venv python, remove verbose output --- clean-build-copy.sh | 8 ++++---- pythonforandroid/bootstraps/sdl2/build/build.py | 5 ++--- requirements.txt | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 2baf5a7345..682c519491 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -54,9 +54,9 @@ androidYoutubeDlProject="$(dirname "$PWD")/android-youtube-dl" clean() { echo "[INFO] Clean" - /usr/bin/python $p4a clean_builds - rm -rfv $distFolder - rm -rfv $PWD/build + python $p4a clean_builds + rm -rf $distFolder + rm -rf $PWD/build echo "[INFO] Clean done" } @@ -64,7 +64,7 @@ clean() { build() { echo "[INFO] Build [$1]" python $p4a clean_builds - rm -rfv $distFolder + rm -rf $distFolder python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ANDROID_NDK_HOME --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle # if [ -z "$TRAVIS" ] # then diff --git a/pythonforandroid/bootstraps/sdl2/build/build.py b/pythonforandroid/bootstraps/sdl2/build/build.py index 85c8565f04..42b7c898f7 100644 --- a/pythonforandroid/bootstraps/sdl2/build/build.py +++ b/pythonforandroid/bootstraps/sdl2/build/build.py @@ -3,7 +3,6 @@ from __future__ import print_function -import jinja2 import json import os import shutil @@ -18,6 +17,8 @@ dirname, join, isfile, realpath, relpath, split, exists, basename) from zipfile import ZipFile +import jinja2 + curdir = dirname(__file__) # Try to find a host version of Python that matches our ARM version. @@ -220,8 +221,6 @@ def compile_dir(dfn): def make_package(args): # Ignore warning if the launcher is in args if not args.launcher: - print('args.private path: {}'.format(args.private)) - print('realpath: {}'.format(join(realpath(args.private), 'main.py'))) if not (exists(join(realpath(args.private), 'main.py')) or exists(join(realpath(args.private), 'main.pyo'))): print('''BUILD FAILURE: No main.py(o) found in your app directory. This diff --git a/requirements.txt b/requirements.txt index cfbf4726f7..0be947becf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ colorama==0.3.3 appdirs==1.4.3 sh==1.10 jinja2==2.10 -Cython==0.29.7 \ No newline at end of file +Cython==0.29.7 +six==1.4.1 From c831e19153bc4c7fe7cdfa7961e79545f804538d Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 09:52:25 +0100 Subject: [PATCH 58/90] Set quite param to compileapp --- clean-build-copy.sh | 2 +- pythonforandroid/bootstraps/sdl2/__init__.py | 8 +++++--- pythonforandroid/bootstraps/sdl2/build/build.py | 2 +- .../bootstraps/service_only/__init__.py | 4 +++- .../bootstraps/service_only/build/build.py | 15 +++++++-------- pythonforandroid/bootstraps/webview/__init__.py | 10 ++++++---- .../bootstraps/webview/build/build.py | 17 ++++++++--------- 7 files changed, 31 insertions(+), 27 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index 682c519491..f723e61611 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -65,7 +65,7 @@ build() { echo "[INFO] Build [$1]" python $p4a clean_builds rm -rf $distFolder - python $p4a apk --private $pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir $ANDROID_NDK_HOME --ndk_version r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool gradle + python $p4a apk --private=$pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir=$ANDROID_NDK_HOME --ndk_version=r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool=gradle # if [ -z "$TRAVIS" ] # then # copy_libs diff --git a/pythonforandroid/bootstraps/sdl2/__init__.py b/pythonforandroid/bootstraps/sdl2/__init__.py index e77d9c932a..f9c9628152 100644 --- a/pythonforandroid/bootstraps/sdl2/__init__.py +++ b/pythonforandroid/bootstraps/sdl2/__init__.py @@ -1,8 +1,10 @@ +from os.path import join, exists + +import sh + from pythonforandroid.toolchain import ( Bootstrap, shprint, current_directory, info, info_main) from pythonforandroid.util import ensure_dir -from os.path import join, exists -import sh class SDL2GradleBootstrap(Bootstrap): @@ -36,7 +38,7 @@ def run_distribute(self): hostpython = sh.Command(self.ctx.hostpython) if self.ctx.python_recipe.name == 'python2': try: - shprint(hostpython, '-OO', '-m', 'compileall', + shprint(hostpython, '-OO', '-m', 'compileall', '-q', python_install_dir, _tail=10, _filterout="^Listing") except sh.ErrorReturnCode: diff --git a/pythonforandroid/bootstraps/sdl2/build/build.py b/pythonforandroid/bootstraps/sdl2/build/build.py index 42b7c898f7..487ff7158b 100644 --- a/pythonforandroid/bootstraps/sdl2/build/build.py +++ b/pythonforandroid/bootstraps/sdl2/build/build.py @@ -215,7 +215,7 @@ def compile_dir(dfn): # -OO = strip docstrings if PYTHON is None: return - subprocess.call([PYTHON, '-OO', '-m', 'compileall', '-f', dfn]) + subprocess.call([PYTHON, '-OO', '-m', 'compileall', '-f', '-q', dfn]) def make_package(args): diff --git a/pythonforandroid/bootstraps/service_only/__init__.py b/pythonforandroid/bootstraps/service_only/__init__.py index 088928c6c4..9990e46faa 100644 --- a/pythonforandroid/bootstraps/service_only/__init__.py +++ b/pythonforandroid/bootstraps/service_only/__init__.py @@ -1,7 +1,9 @@ import glob from os import walk from os.path import join, exists, curdir, abspath + import sh + from pythonforandroid.toolchain import Bootstrap, current_directory, info, info_main, shprint @@ -42,7 +44,7 @@ def run_distribute(self): hostpython = sh.Command(self.ctx.hostpython) if not self.ctx.python_recipe.from_crystax: try: - shprint(hostpython, '-OO', '-m', 'compileall', + shprint(hostpython, '-OO', '-m', 'compileall', '-q', self.ctx.get_python_install_dir(), _tail=10, _filterout="^Listing") except sh.ErrorReturnCode: diff --git a/pythonforandroid/bootstraps/service_only/build/build.py b/pythonforandroid/bootstraps/service_only/build/build.py index 65d5c71d45..4183cab691 100755 --- a/pythonforandroid/bootstraps/service_only/build/build.py +++ b/pythonforandroid/bootstraps/service_only/build/build.py @@ -2,17 +2,16 @@ from __future__ import print_function -from os.path import dirname, join, isfile, realpath, relpath, split, exists -from os import makedirs import os -import tarfile -import subprocess +import shlex import shutil -from zipfile import ZipFile +import subprocess import sys -import shlex - +import tarfile from fnmatch import fnmatch +from os import makedirs +from os.path import dirname, join, isfile, realpath, relpath, split, exists +from zipfile import ZipFile import jinja2 @@ -205,7 +204,7 @@ def compile_dir(dfn): return # Currently leaving out the compile to pyo step because it's somehow broken # -OO = strip docstrings - subprocess.call([PYTHON, '-OO', '-m', 'compileall', '-f', dfn]) + subprocess.call([PYTHON, '-OO', '-m', 'compileall', '-f', '-q', dfn]) def make_package(args): diff --git a/pythonforandroid/bootstraps/webview/__init__.py b/pythonforandroid/bootstraps/webview/__init__.py index 041fe43c3e..b5fe4a8f81 100644 --- a/pythonforandroid/bootstraps/webview/__init__.py +++ b/pythonforandroid/bootstraps/webview/__init__.py @@ -1,9 +1,11 @@ -from pythonforandroid.toolchain import Bootstrap, current_directory, info, info_main, shprint -from os.path import join, exists, curdir, abspath -from os import walk import glob +from os import walk +from os.path import join, exists, curdir, abspath + import sh +from pythonforandroid.toolchain import Bootstrap, current_directory, info, info_main, shprint + class WebViewBootstrap(Bootstrap): name = 'webview' @@ -39,7 +41,7 @@ def run_distribute(self): hostpython = sh.Command(self.ctx.hostpython) if not self.ctx.python_recipe.from_crystax: try: - shprint(hostpython, '-OO', '-m', 'compileall', + shprint(hostpython, '-OO', '-m', 'compileall', '-q', self.ctx.get_python_install_dir(), _tail=10, _filterout="^Listing") except sh.ErrorReturnCode: diff --git a/pythonforandroid/bootstraps/webview/build/build.py b/pythonforandroid/bootstraps/webview/build/build.py index 69cb6d4509..c4f8fabbcf 100755 --- a/pythonforandroid/bootstraps/webview/build/build.py +++ b/pythonforandroid/bootstraps/webview/build/build.py @@ -2,18 +2,17 @@ from __future__ import print_function -from os.path import dirname, join, isfile, realpath, relpath, split, exists -from os import makedirs import os -import tarfile -import time -import subprocess +import re import shutil -from zipfile import ZipFile +import subprocess import sys -import re - +import tarfile +import time from fnmatch import fnmatch +from os import makedirs +from os.path import dirname, join, isfile, realpath, relpath, split, exists +from zipfile import ZipFile import jinja2 @@ -206,7 +205,7 @@ def compile_dir(dfn): return # Currently leaving out the compile to pyo step because it's somehow broken # -OO = strip docstrings - subprocess.call([PYTHON, '-OO', '-m', 'compileall', '-f', dfn]) + subprocess.call([PYTHON, '-OO', '-m', 'compileall', '-f', '-q', dfn]) def make_package(args): From 4708890d56a7c622dba98d05879b498861efa0cc Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 10:11:41 +0100 Subject: [PATCH 59/90] Disable python warnings for build --- clean-build-copy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index f723e61611..e8d8c70c1c 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -65,7 +65,7 @@ build() { echo "[INFO] Build [$1]" python $p4a clean_builds rm -rf $distFolder - python $p4a apk --private=$pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir=$ANDROID_NDK_HOME --ndk_version=r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool=gradle + python -W ignore $p4a apk --private=$pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir=$ANDROID_NDK_HOME --ndk_version=r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool=gradle # if [ -z "$TRAVIS" ] # then # copy_libs From bdfc0e38504f71d209d0b70ddcffa9b3119898fe Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 10:43:06 +0100 Subject: [PATCH 60/90] Set default log level to WARNING --- pythonforandroid/toolchain.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index 3aa187e111..059d828b87 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -7,6 +7,7 @@ """ from __future__ import print_function + from pythonforandroid import __version__ from pythonforandroid.build import DEFAULT_NDK_API, DEFAULT_ANDROID_API @@ -515,8 +516,8 @@ def add_parser(subparsers, *args, **kwargs): setup_color(args.color) - if args.debug: - logger.setLevel(logging.DEBUG) + # if args.debug: + logger.setLevel(logging.WARNING) # strip version from requirements, and put them in environ if hasattr(args, 'requirements'): From 1a94da023af08df9c4f6a6f976c1c9a9be202c64 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 11:37:25 +0100 Subject: [PATCH 61/90] Disable tools and platform-tools --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 583a0cbc03..03b3aa5d9b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,8 @@ language: android android: components: - - tools - - platform-tools +# - tools +# - platform-tools - build-tools-23.0.1 - android-23 # - extra-google-m2repository From 312957918f35d1a62213e5155414b6d1a54b9110 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 11:46:56 +0100 Subject: [PATCH 62/90] Add --quiet to pip install --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 03b3aa5d9b..cad0d489d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ before_install: - export PATH=$PATH:$ANDROID_NDK_HOME - export PIP_DISABLE_PIP_VERSION_CHECK=1 - virtualenv --python=/usr/bin/python2.7 venv/bin/activate - - pip install --user -r requirements.txt + - pip install --quiet --user -r requirements.txt install: From 2bf8d6764c1fdc1481d4510e5928902694a3c608 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 12:23:22 +0100 Subject: [PATCH 63/90] Move -qq params to right position --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index cad0d489d2..73684ce28f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,8 +19,8 @@ android: before_install: - - sudo apt update -qq - - sudo apt install -qq --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool + - sudo apt -qq update + - sudo apt -qq install --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b From 6d55dcb28ed2ec23201f69bae765a158c5cf9636 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 12:27:22 +0100 Subject: [PATCH 64/90] All output of apt-get to > /dev/null --- .travis.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73684ce28f..ebf3ed3381 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,12 +6,8 @@ language: android android: components: -# - tools -# - platform-tools - build-tools-23.0.1 - android-23 -# - extra-google-m2repository -# - extra-android-m2repository licenses: - 'android-sdk-license-.+' @@ -19,8 +15,8 @@ android: before_install: - - sudo apt -qq update - - sudo apt -qq install --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool + - sudo apt -qq update > /dev/null + - sudo apt -qq install --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool > /dev/null - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b From e9a558ff272fc11836b29584d4260335ee4e201d Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 13:16:05 +0100 Subject: [PATCH 65/90] Add git clone --quiet --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ebf3ed3381..0d2ec8fb74 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ before_install: install: - - git clone --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git ../youtube-dl + - git clone --quiet --depth=50 --branch=master https://github.com/Redwid/youtube-dl.git ../youtube-dl env: From d6c6db385ec1149ea41e074db63735ace640d26a Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 13:49:56 +0100 Subject: [PATCH 66/90] Disable logs for travis --- pythonforandroid/logger.py | 37 +++++++++++++++++++---------------- pythonforandroid/toolchain.py | 4 ++-- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/pythonforandroid/logger.py b/pythonforandroid/logger.py index 38afba0e5f..26fe6bc85e 100644 --- a/pythonforandroid/logger.py +++ b/pythonforandroid/logger.py @@ -1,12 +1,13 @@ import logging import os import re -import sh -from sys import stdout, stderr -from math import log10 from collections import defaultdict -from colorama import Style as Colo_Style, Fore as Colo_Fore +from math import log10 +from sys import stdout, stderr + +import sh import six +from colorama import Style as Colo_Style, Fore as Colo_Fore # This codecs change fixes a bug with log output, but crashes under python3 if not six.PY3: @@ -176,19 +177,21 @@ def shprint(command, *args, **kwargs): for line in output: if isinstance(line, bytes): line = line.decode('utf-8', errors='replace') - if logger.level > logging.DEBUG: - msg = line.replace( - '\n', ' ').replace( - '\t', ' ').replace( - '\b', ' ').rstrip() - if msg: - stdout.write(u'{}\r{}{:<{width}}'.format( - Err_Style.RESET_ALL, msg_hdr, - shorten_string(msg, msg_width), width=msg_width)) - stdout.flush() - need_closing_newline = True - else: - logger.debug(''.join(['\t', line.rstrip()])) + # Workaround for travis ci + if 'TRAVIS' not in os.environ: + if logger.level > logging.DEBUG: + msg = line.replace( + '\n', ' ').replace( + '\t', ' ').replace( + '\b', ' ').rstrip() + if msg: + stdout.write(u'{}\r{}{:<{width}}'.format( + Err_Style.RESET_ALL, msg_hdr, + shorten_string(msg, msg_width), width=msg_width)) + stdout.flush() + need_closing_newline = True + else: + logger.debug(''.join(['\t', line.rstrip()])) if need_closing_newline: stdout.write('{}\r{:>{width}}\r'.format( Err_Style.RESET_ALL, ' ', width=(columns - 1))) diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index 059d828b87..2f23b8151b 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -516,8 +516,8 @@ def add_parser(subparsers, *args, **kwargs): setup_color(args.color) - # if args.debug: - logger.setLevel(logging.WARNING) + if args.debug: + logger.setLevel(logging.DEBUG) # strip version from requirements, and put them in environ if hasattr(args, 'requirements'): From ee881974cedb7bc6d99142e123af44efd0ff0ba2 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 16:39:58 +0100 Subject: [PATCH 67/90] Add deploy section --- .travis.yml | 7 ++++++ bintray-descriptor.json | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 bintray-descriptor.json diff --git a/.travis.yml b/.travis.yml index 0d2ec8fb74..3f37b44271 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,3 +39,10 @@ env: script: - sh clean-build-copy.sh +deploy: + dry_run: true + provider: bintray + file: bintray-descriptor.json + user: BINTRAY_USER + key: BINTRAY_API_KEY + skip_cleanup: true # to upload artifacts created during the build \ No newline at end of file diff --git a/bintray-descriptor.json b/bintray-descriptor.json new file mode 100644 index 0000000000..2453d25a7a --- /dev/null +++ b/bintray-descriptor.json @@ -0,0 +1,51 @@ +{ + /* Bintray package information. + In case the package already exists on Bintray, only the name, repo and subject + fields are mandatory. */ + + "package": { + "name": "org.redwid.android.youtube.dl", // Bintray package name + "repo": "maven", // Bintray repository name + "subject": "Redwid", // Bintray subject (user or organization) + "desc": "I was pushed completely automatically", + "website_url": "www.jfrog.com", + "issue_tracker_url": "https://github.com/Redwid/python-for-android", + "vcs_url": "https://github.com/Redwid/python-for-android.git", + "licenses": ["MIT"], + "public_download_numbers": true, + "public_stats": true + }, + + /* Package version information. + In case the version already exists on Bintray, only the name fields is mandatory. */ + + "version": { + "name": "0.0.1", + "desc": "Initial version", + "released": "2019-17-04", + "vcs_tag": "0.0.1", + "gpgSign": false + }, + + /* Configure the files you would like to upload to Bintray and their upload path. + You can define one or more groups of patterns. + Each group contains three patterns: + + includePattern: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. + excludePattern: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. + uploadPattern: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. + + In the example below, the following files are uploaded, + 1. All gem files located under build/bin/ (including sub directories), + except for files under a the do-not-deploy directory. + The files will be uploaded to Bintray under the gems folder. + 2. All files under build/docs. The files will be uploaded to Bintray under the docs folder. + + Note: Regular expressions defined as part of the includePattern property must be wrapped with brackets. */ + + "files": + [ + {"includePattern": "build/(.*.aar)", "excludePattern": "build/.*.mp3", "uploadPattern": "/$1"} + ], + "publish": true +} \ No newline at end of file From 55252e561d769e432d266071705b6340d3896abe Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 17 Apr 2019 17:00:56 +0100 Subject: [PATCH 68/90] Disable wget output --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3f37b44271..caeac79771 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ android: before_install: - sudo apt -qq update > /dev/null - sudo apt -qq install --no-install-recommends build-essential ccache git zlib1g-dev python2.7 python2.7-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool > /dev/null - - wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip + - wget -q https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip - unzip -qq android-ndk-r16b-linux-x86_64.zip -d $HOME - export ANDROID_NDK_HOME=$HOME/android-ndk-r16b - echo "ANDROID_NDK_HOME" $ANDROID_NDK_HOME From 069c1a4b4582569fc7433934b513a99b9b95f8c0 Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 08:40:58 +0100 Subject: [PATCH 69/90] First publish 0.0.1 --- .travis.yml | 2 +- bintray-descriptor.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index caeac79771..83124c7c2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ script: - sh clean-build-copy.sh deploy: - dry_run: true +# dry_run: true provider: bintray file: bintray-descriptor.json user: BINTRAY_USER diff --git a/bintray-descriptor.json b/bintray-descriptor.json index 2453d25a7a..77f991c08a 100644 --- a/bintray-descriptor.json +++ b/bintray-descriptor.json @@ -4,11 +4,11 @@ fields are mandatory. */ "package": { - "name": "org.redwid.android.youtube.dl", // Bintray package name + "name": "org.redwid.android.python", // Bintray package name "repo": "maven", // Bintray repository name "subject": "Redwid", // Bintray subject (user or organization) - "desc": "I was pushed completely automatically", - "website_url": "www.jfrog.com", + "desc": "The travis-ci build", + "website_url": "https://github.com/Redwid/python-for-android", "issue_tracker_url": "https://github.com/Redwid/python-for-android", "vcs_url": "https://github.com/Redwid/python-for-android.git", "licenses": ["MIT"], @@ -45,7 +45,7 @@ "files": [ - {"includePattern": "build/(.*.aar)", "excludePattern": "build/.*.mp3", "uploadPattern": "/$1"} + {"includePattern": "build/(.*.aar)", "excludePattern": "build/.*.mp3", "uploadPattern": "org/redwid/android/python/$1"} ], "publish": true } \ No newline at end of file From e1dae2de52b09df6bd3bc37143eb227a583511ec Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 09:10:29 +0100 Subject: [PATCH 70/90] Add $ to env properties --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 83124c7c2b..375bb9e343 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,6 +43,6 @@ deploy: # dry_run: true provider: bintray file: bintray-descriptor.json - user: BINTRAY_USER - key: BINTRAY_API_KEY + user: $BINTRAY_USER + key: $BINTRAY_API_KEY skip_cleanup: true # to upload artifacts created during the build \ No newline at end of file From 82e14a1b74e954d03e22957e9eab0be1762711bc Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 09:56:44 +0100 Subject: [PATCH 71/90] Update subject per user name --- bintray-descriptor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bintray-descriptor.json b/bintray-descriptor.json index 77f991c08a..0a4bd50e83 100644 --- a/bintray-descriptor.json +++ b/bintray-descriptor.json @@ -6,7 +6,7 @@ "package": { "name": "org.redwid.android.python", // Bintray package name "repo": "maven", // Bintray repository name - "subject": "Redwid", // Bintray subject (user or organization) + "subject": "redwid", // Bintray subject (user or organization) "desc": "The travis-ci build", "website_url": "https://github.com/Redwid/python-for-android", "issue_tracker_url": "https://github.com/Redwid/python-for-android", From c33e6c38614631fbcbd6a15f0f617850f4806a84 Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 10:34:38 +0100 Subject: [PATCH 72/90] Change package name --- bintray-descriptor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bintray-descriptor.json b/bintray-descriptor.json index 0a4bd50e83..ff835d396e 100644 --- a/bintray-descriptor.json +++ b/bintray-descriptor.json @@ -4,7 +4,7 @@ fields are mandatory. */ "package": { - "name": "org.redwid.android.python", // Bintray package name + "name": "org.redwid.android.youtube.dl.python", // Bintray package name "repo": "maven", // Bintray repository name "subject": "redwid", // Bintray subject (user or organization) "desc": "The travis-ci build", From b4769befa4b90511b630c14398f11f91c91500d7 Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 10:48:39 +0100 Subject: [PATCH 73/90] Fix wrong date format --- bintray-descriptor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bintray-descriptor.json b/bintray-descriptor.json index ff835d396e..0849480de4 100644 --- a/bintray-descriptor.json +++ b/bintray-descriptor.json @@ -22,7 +22,7 @@ "version": { "name": "0.0.1", "desc": "Initial version", - "released": "2019-17-04", + "released": "2019-04-18", "vcs_tag": "0.0.1", "gpgSign": false }, From a09d640ab9fafc7907c81ccf542d26cad4805dcd Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 10:58:36 +0100 Subject: [PATCH 74/90] Update version number --- .travis.yml | 1 + bintray-descriptor.json | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 375bb9e343..2d4eb1784b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,4 +45,5 @@ deploy: file: bintray-descriptor.json user: $BINTRAY_USER key: $BINTRAY_API_KEY + wait-until-deployed: true skip_cleanup: true # to upload artifacts created during the build \ No newline at end of file diff --git a/bintray-descriptor.json b/bintray-descriptor.json index 0849480de4..4fd3483eee 100644 --- a/bintray-descriptor.json +++ b/bintray-descriptor.json @@ -20,10 +20,9 @@ In case the version already exists on Bintray, only the name fields is mandatory. */ "version": { - "name": "0.0.1", + "name": "0.6.1", "desc": "Initial version", "released": "2019-04-18", - "vcs_tag": "0.0.1", "gpgSign": false }, From b8561ef35f24d320983daffe830361f73fcec528 Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 15:50:06 +0100 Subject: [PATCH 75/90] Add gradle script for deploy --- .travis.yml | 8 +- bintray-descriptor.json | 50 ----- deploy/build.gradle | 69 +++++++ deploy/gradle/gradle.properties | 0 deploy/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + deploy/gradlew | 172 ++++++++++++++++++ deploy/gradlew.bat | 84 +++++++++ 8 files changed, 332 insertions(+), 56 deletions(-) delete mode 100644 bintray-descriptor.json create mode 100644 deploy/build.gradle create mode 100644 deploy/gradle/gradle.properties create mode 100644 deploy/gradle/wrapper/gradle-wrapper.jar create mode 100644 deploy/gradle/wrapper/gradle-wrapper.properties create mode 100755 deploy/gradlew create mode 100644 deploy/gradlew.bat diff --git a/.travis.yml b/.travis.yml index 2d4eb1784b..761b2e5987 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,9 +41,5 @@ script: deploy: # dry_run: true - provider: bintray - file: bintray-descriptor.json - user: $BINTRAY_USER - key: $BINTRAY_API_KEY - wait-until-deployed: true - skip_cleanup: true # to upload artifacts created during the build \ No newline at end of file + provider: script + script: sh gradlew --no-daemon bintrayUpload --info diff --git a/bintray-descriptor.json b/bintray-descriptor.json deleted file mode 100644 index 4fd3483eee..0000000000 --- a/bintray-descriptor.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - /* Bintray package information. - In case the package already exists on Bintray, only the name, repo and subject - fields are mandatory. */ - - "package": { - "name": "org.redwid.android.youtube.dl.python", // Bintray package name - "repo": "maven", // Bintray repository name - "subject": "redwid", // Bintray subject (user or organization) - "desc": "The travis-ci build", - "website_url": "https://github.com/Redwid/python-for-android", - "issue_tracker_url": "https://github.com/Redwid/python-for-android", - "vcs_url": "https://github.com/Redwid/python-for-android.git", - "licenses": ["MIT"], - "public_download_numbers": true, - "public_stats": true - }, - - /* Package version information. - In case the version already exists on Bintray, only the name fields is mandatory. */ - - "version": { - "name": "0.6.1", - "desc": "Initial version", - "released": "2019-04-18", - "gpgSign": false - }, - - /* Configure the files you would like to upload to Bintray and their upload path. - You can define one or more groups of patterns. - Each group contains three patterns: - - includePattern: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. - excludePattern: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. - uploadPattern: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. - - In the example below, the following files are uploaded, - 1. All gem files located under build/bin/ (including sub directories), - except for files under a the do-not-deploy directory. - The files will be uploaded to Bintray under the gems folder. - 2. All files under build/docs. The files will be uploaded to Bintray under the docs folder. - - Note: Regular expressions defined as part of the includePattern property must be wrapped with brackets. */ - - "files": - [ - {"includePattern": "build/(.*.aar)", "excludePattern": "build/.*.mp3", "uploadPattern": "org/redwid/android/python/$1"} - ], - "publish": true -} \ No newline at end of file diff --git a/deploy/build.gradle b/deploy/build.gradle new file mode 100644 index 0000000000..a1bf54cd88 --- /dev/null +++ b/deploy/build.gradle @@ -0,0 +1,69 @@ +buildscript { + repositories { + jcenter() + } +} + +plugins { + id "com.jfrog.bintray" version "1.8.4" +} + +allprojects { + repositories { + jcenter() + } + apply plugin: 'maven' + apply plugin: 'maven-publish' + apply plugin: 'java' +} + +group = 'org.redwid.android.youtube.dl' +description = 'python' +version = '0.6.2' + +publishing { + publications { + MyPublication(MavenPublication) { + version = project.version + artifactId 'python' + artifacts = createArtifacts() + } + } + repositories { + maven { + url { "file://${System.env.HOME}/.m2/repository/" } + } + } +} + +def createArtifacts() { + def artifacts = [] + artifacts += [source: "/Users/viacheslav.vdovenko/Projects/git-2/python-for-android/build/arm64-v8a.aar", classifier: "arm64-v8a", extension: "aar"] + artifacts += [source: "/Users/viacheslav.vdovenko/Projects/git-2/python-for-android/build/armeabi-v7a.aar", classifier: "armeabi-v7a", extension: "aar"] + println("artifacts: " + artifacts) + return artifacts +} + +bintray { + user = System.getenv('BINTRAY_USER') + key = System.getenv('BINTRAY_API_KEY') + publications = ['MyPublication'] + pkg { + repo = 'maven' + name = "$project.group:$project.description" + userOrg = 'redwid' + licenses = ['MIT'] + vcsUrl = 'https://github.com/Redwid/python-for-android.git' + publish = true + publicDownloadNumbers = true + version { + name = project.version + desc = 'Python for android youtube-dl' + released = new Date() + } + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '4.10.2' +} \ No newline at end of file diff --git a/deploy/gradle/gradle.properties b/deploy/gradle/gradle.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/gradle/wrapper/gradle-wrapper.jar b/deploy/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..29953ea141f55e3b8fc691d31b5ca8816d89fa87 GIT binary patch literal 56177 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 i;x|p)^~-yfPOPa3(|vBayXKz \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/deploy/gradlew.bat b/deploy/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/deploy/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 572a535888f2777c96276cac27e52d85fdbedbc4 Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 16:37:57 +0100 Subject: [PATCH 76/90] Update script --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 761b2e5987..c2c38d018b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,4 +42,5 @@ script: deploy: # dry_run: true provider: script - script: sh gradlew --no-daemon bintrayUpload --info + skip_cleanup: true + script: cd deploy && sh gradlew --no-daemon bintrayUpload --info From 9f5d2e726e6e5e9515c665bafc8adb33d835d870 Mon Sep 17 00:00:00 2001 From: Redwid Date: Thu, 18 Apr 2019 18:27:07 +0100 Subject: [PATCH 77/90] Correct artifact paths --- deploy/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/build.gradle b/deploy/build.gradle index a1bf54cd88..49c1f6e2a3 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -38,8 +38,8 @@ publishing { def createArtifacts() { def artifacts = [] - artifacts += [source: "/Users/viacheslav.vdovenko/Projects/git-2/python-for-android/build/arm64-v8a.aar", classifier: "arm64-v8a", extension: "aar"] - artifacts += [source: "/Users/viacheslav.vdovenko/Projects/git-2/python-for-android/build/armeabi-v7a.aar", classifier: "armeabi-v7a", extension: "aar"] + artifacts += [source: "../build/arm64-v8a.aar", classifier: "arm64-v8a", extension: "aar"] + artifacts += [source: "../build/armeabi-v7a.aar", classifier: "armeabi-v7a", extension: "aar"] println("artifacts: " + artifacts) return artifacts } From 09d02b3ece38065190edd2294cc164338482d595 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 24 Apr 2019 11:21:34 +0100 Subject: [PATCH 78/90] Prepare for release 0.6.3 --- clean-build-copy.sh | 2 +- deploy/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clean-build-copy.sh b/clean-build-copy.sh index e8d8c70c1c..3879cc73a4 100644 --- a/clean-build-copy.sh +++ b/clean-build-copy.sh @@ -65,7 +65,7 @@ build() { echo "[INFO] Build [$1]" python $p4a clean_builds rm -rf $distFolder - python -W ignore $p4a apk --private=$pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir=$ANDROID_NDK_HOME --ndk_version=r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=23 --arch=$1 --java-build-tool=gradle + python -W ignore $p4a apk --private=$pythonApp --dist_name=$pythonAppDistName --package=$pythonAppPackageName --name=$pythonAppName --version=1 --ndk_dir=$ANDROID_NDK_HOME --ndk_version=r16b --requirements=android,pyopenssl,pycrypto,openssl --android_api=$ANDROIDAPI --arch=$1 --java-build-tool=gradle # if [ -z "$TRAVIS" ] # then # copy_libs diff --git a/deploy/build.gradle b/deploy/build.gradle index 49c1f6e2a3..2eef7c215a 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -19,7 +19,7 @@ allprojects { group = 'org.redwid.android.youtube.dl' description = 'python' -version = '0.6.2' +version = '0.6.3' publishing { publications { From 71e98083752c193b1ae2925c5b9e03732c30185c Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 25 Jun 2019 15:26:03 +0100 Subject: [PATCH 79/90] Prepare for release 0.6.4 --- deploy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build.gradle b/deploy/build.gradle index 2eef7c215a..ede572996b 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -19,7 +19,7 @@ allprojects { group = 'org.redwid.android.youtube.dl' description = 'python' -version = '0.6.3' +version = '0.6.4' publishing { publications { From 1d5801c78bbfc1c9572024e8979cef413ce4b099 Mon Sep 17 00:00:00 2001 From: Redwid Date: Tue, 25 Jun 2019 16:01:13 +0100 Subject: [PATCH 80/90] Prepare for release 0.6.5 --- deploy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build.gradle b/deploy/build.gradle index ede572996b..c91d881486 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -19,7 +19,7 @@ allprojects { group = 'org.redwid.android.youtube.dl' description = 'python' -version = '0.6.4' +version = '0.6.5' publishing { publications { From ba575b9f8a7edc08af4a8eea91b406f67d2acc7b Mon Sep 17 00:00:00 2001 From: Redwid Date: Fri, 13 Dec 2019 16:23:09 +0000 Subject: [PATCH 81/90] Prepare for release 0.6.6 --- deploy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build.gradle b/deploy/build.gradle index c91d881486..2230297c45 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -19,7 +19,7 @@ allprojects { group = 'org.redwid.android.youtube.dl' description = 'python' -version = '0.6.5' +version = '0.6.6' publishing { publications { From 124cceb699c263c2ffdb198012a2921dd0d546fc Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 10:51:42 +0100 Subject: [PATCH 82/90] Prepare for release 0.6.7 --- deploy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build.gradle b/deploy/build.gradle index 2230297c45..52386eb6db 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -19,7 +19,7 @@ allprojects { group = 'org.redwid.android.youtube.dl' description = 'python' -version = '0.6.6' +version = '0.6.7' publishing { publications { From 133242727a04fba1cf92eb39b54f975f80afa610 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 12:04:38 +0100 Subject: [PATCH 83/90] Update recipe from upstream --- pythonforandroid/recipe.py | 47 ++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index 8bc68c036b..4591b21b58 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -1,17 +1,17 @@ -from os.path import basename, dirname, exists, isdir, isfile, join, realpath, split -import importlib +import fnmatch import glob -from shutil import rmtree -from six import PY2, with_metaclass - import hashlib -from re import match - -import sh +import importlib import shutil -import fnmatch from os import listdir, unlink, environ, mkdir, curdir, walk +from os.path import basename, dirname, exists, isdir, isfile, join, realpath, split +from re import match +from shutil import rmtree from sys import stdout + +import sh +from six import PY2, with_metaclass + try: from urlparse import urlparse except ImportError: @@ -144,7 +144,19 @@ def report_hook(index, blksize, size): if exists(target): unlink(target) - urlretrieve(url, target, report_hook) + # Download item with multiple attempts (for bad connections): + attempts = 0 + while True: + try: + urlretrieve(url, target, report_hook) + except OSError: + attempts += 1 + if attempts >= 5: + raise + stdout.write('Download failed retrying in a second...') + time.sleep(1) + continue + break return target elif parsed_url.scheme in ('git', 'git+file', 'git+ssh', 'git+http', 'git+https'): if isdir(target): @@ -375,17 +387,12 @@ def unpack(self, arch): root_directory = fileh.filelist[0].filename.split('/')[0] if root_directory != basename(directory_name): shprint(sh.mv, root_directory, directory_name) - elif (extraction_filename.endswith('.tar.gz') or - extraction_filename.endswith('.tgz') or - extraction_filename.endswith('.tar.bz2') or - extraction_filename.endswith('.tbz2') or - extraction_filename.endswith('.tar.xz') or - extraction_filename.endswith('.txz')): + elif extraction_filename.endswith( + ('.tar.gz', '.tgz', '.tar.bz2', '.tbz2', '.tar.xz', '.txz')): sh.tar('xf', extraction_filename) - root_directory = shprint( - sh.tar, 'tf', extraction_filename).stdout.decode( - 'utf-8').split('\n')[0].split('/')[0] - if root_directory != directory_name: + root_directory = sh.tar('tf', extraction_filename).stdout.decode( + 'utf-8').split('\n')[0].split('/')[0] + if root_directory != basename(directory_name): shprint(sh.mv, root_directory, directory_name) else: raise Exception( From 8ec9e6880842c3735409809e4a9723c7183c0f5e Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 12:20:56 +0100 Subject: [PATCH 84/90] Add debug output --- pythonforandroid/recipe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index 4591b21b58..d35dc80500 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -389,7 +389,7 @@ def unpack(self, arch): shprint(sh.mv, root_directory, directory_name) elif extraction_filename.endswith( ('.tar.gz', '.tgz', '.tar.bz2', '.tbz2', '.tar.xz', '.txz')): - sh.tar('xf', extraction_filename) + sh.tar('xvf', extraction_filename) root_directory = sh.tar('tf', extraction_filename).stdout.decode( 'utf-8').split('\n')[0].split('/')[0] if root_directory != basename(directory_name): From 6babf7777429db703ffdc48c2dd707a609e449a1 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 12:21:27 +0100 Subject: [PATCH 85/90] Enable dry run --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c2c38d018b..f321129144 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ script: - sh clean-build-copy.sh deploy: -# dry_run: true + dry_run: true provider: script skip_cleanup: true script: cd deploy && sh gradlew --no-daemon bintrayUpload --info From 5b8070e7ef2c09fa05e70601b760956cefbdf1b7 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 12:42:20 +0100 Subject: [PATCH 86/90] Add debug output --- pythonforandroid/recipe.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index d35dc80500..ca1ddb2712 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -2,6 +2,7 @@ import glob import hashlib import importlib +import os import shutil from os import listdir, unlink, environ, mkdir, curdir, walk from os.path import basename, dirname, exists, isdir, isfile, join, realpath, split @@ -373,6 +374,8 @@ def unpack(self, arch): extraction_filename = join( self.ctx.packages_path, self.name, filename) if isfile(extraction_filename): + info('File type for {}'.format(extraction_filename)) + os.system('file ' + extraction_filename) if extraction_filename.endswith('.zip'): try: sh.unzip(extraction_filename) From d509394fa048bc157c2a5e97d8ddc481cba26fd9 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 13:01:45 +0100 Subject: [PATCH 87/90] Replace url --- pythonforandroid/recipes/openssl/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pythonforandroid/recipes/openssl/__init__.py b/pythonforandroid/recipes/openssl/__init__.py index b8256e8662..39d07ffa4f 100644 --- a/pythonforandroid/recipes/openssl/__init__.py +++ b/pythonforandroid/recipes/openssl/__init__.py @@ -1,12 +1,14 @@ from functools import partial -from pythonforandroid.toolchain import Recipe, shprint, current_directory import sh +from pythonforandroid.toolchain import Recipe, shprint, current_directory + class OpenSSLRecipe(Recipe): version = '1.0.2h' - url = 'https://www.openssl.org/source/openssl-{version}.tar.gz' + #url = 'https://www.openssl.org/source/openssl-{version}.tar.gz' + url = 'https://github.com/openssl/openssl/archive/OpenSSL_1_0_2n.tar.gz' def should_build(self, arch): return not self.has_libs(arch, 'libssl' + self.version + '.so', From 4370737f3aba0666ce930901e55217604ad319ae Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 13:02:59 +0100 Subject: [PATCH 88/90] Correct openssl url, as old one returns 404 for 1.0.2h version --- pythonforandroid/recipes/openssl/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/recipes/openssl/__init__.py b/pythonforandroid/recipes/openssl/__init__.py index 39d07ffa4f..7c70b04d0a 100644 --- a/pythonforandroid/recipes/openssl/__init__.py +++ b/pythonforandroid/recipes/openssl/__init__.py @@ -8,7 +8,7 @@ class OpenSSLRecipe(Recipe): version = '1.0.2h' #url = 'https://www.openssl.org/source/openssl-{version}.tar.gz' - url = 'https://github.com/openssl/openssl/archive/OpenSSL_1_0_2n.tar.gz' + url = 'https://github.com/openssl/openssl/archive/OpenSSL_1_0_2h.tar.gz' def should_build(self, arch): return not self.has_libs(arch, 'libssl' + self.version + '.so', From 7e551b37722a29715a5c73528eefa90c7aeed3a9 Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 13:20:13 +0100 Subject: [PATCH 89/90] Disable dry run --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f321129144..c2c38d018b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ script: - sh clean-build-copy.sh deploy: - dry_run: true +# dry_run: true provider: script skip_cleanup: true script: cd deploy && sh gradlew --no-daemon bintrayUpload --info From ea9e7fb974c75c2f33238ecca11eefd08c1f4dff Mon Sep 17 00:00:00 2001 From: Redwid Date: Wed, 8 Apr 2020 15:20:01 +0100 Subject: [PATCH 90/90] Prepare for release 0.6.8 --- deploy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build.gradle b/deploy/build.gradle index 52386eb6db..1cf1a5ce04 100644 --- a/deploy/build.gradle +++ b/deploy/build.gradle @@ -19,7 +19,7 @@ allprojects { group = 'org.redwid.android.youtube.dl' description = 'python' -version = '0.6.7' +version = '0.6.8' publishing { publications {