From 3926496d5fb863b8a7740ce04e10f5e659494b2b Mon Sep 17 00:00:00 2001 From: Sergii Pylypenko Date: Wed, 6 Nov 2019 22:32:08 +0200 Subject: [PATCH] XSDL: only binaries named like 'libXXX.so' are getting extracted by Android app manager, so rename all binaries to libXXX.so and make a bunch of symlinks --- .../xserver/AndroidAppSettings.cfg | 8 +-- .../jni/application/xserver/AndroidBuild.sh | 20 ++++-- project/jni/application/xserver/gfx.c | 68 +++++++++++-------- project/jni/application/xserver/main.c | 24 ------- 4 files changed, 59 insertions(+), 61 deletions(-) diff --git a/project/jni/application/xserver/AndroidAppSettings.cfg b/project/jni/application/xserver/AndroidAppSettings.cfg index 237d1eecc..a1b2c98eb 100644 --- a/project/jni/application/xserver/AndroidAppSettings.cfg +++ b/project/jni/application/xserver/AndroidAppSettings.cfg @@ -20,13 +20,13 @@ AppVersionName="1.20.41" # You can specify Google Play expansion files in the form 'obb:main.12345' or 'obb:patch.12345' where 12345 is the app version for obb file # You can use .zip.xz archives for better compression, but you need to add 'lzma' to CompiledLibraries # Generate .zip.xz files like this: zip -0 -r data.zip your-data/* ; xz -8 data.zip -AppDataDownloadUrl="!!Data files|:data.tar.gz:data-2.tgz^!!Data files|:DroidSansMono.ttf:DroidSansMono.ttf^Additional fonts (90Mb)|:xfonts.tar.gz:https://sourceforge.net/projects/libsdl-android/files/apk/XServer-XSDL/xfonts.tgz/download" +AppDataDownloadUrl="!!Library mapping|bin-map.zip^!!Data files|:data.tar.gz:data-2.tgz^!!Data files|:DroidSansMono.ttf:DroidSansMono.ttf^Additional fonts (90Mb)|:xfonts.tar.gz:https://sourceforge.net/projects/libsdl-android/files/apk/XServer-XSDL/xfonts.tgz/download" # Reset SDL config when updating application to the new version (y) / (n) ResetSdlConfigForThisVersion=n # Delete application data files when upgrading (specify file/dir paths separated by spaces) -DeleteFilesOnUpgrade="%" +DeleteFilesOnUpgrade="libsdl-DownloadFinished-0.flag busybox usr tmp pulseaudio.conf" # Here you may type readme text, which will be shown during startup. Format is: # Text in English, use \\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/ @@ -269,8 +269,8 @@ APP_PLATFORM= # Specify architectures to compile, 'all' or 'y' to compile for all architectures. # Available architectures: armeabi-v7a arm64-v8a x86 x86_64 -#MultiABI='armeabi-v7a arm64-v8a x86 x86_64' -MultiABI='arm64-v8a' +MultiABI='armeabi-v7a arm64-v8a x86 x86_64' +#MultiABI='arm64-v8a' # Optional shared libraries to compile - removing some of them will save space # MP3 patents are expired, but libmad license is GPL, not LGPL diff --git a/project/jni/application/xserver/AndroidBuild.sh b/project/jni/application/xserver/AndroidBuild.sh index a1653145e..8d300f987 100755 --- a/project/jni/application/xserver/AndroidBuild.sh +++ b/project/jni/application/xserver/AndroidBuild.sh @@ -13,9 +13,9 @@ if [ -e pulseaudio/android-build.sh ]; then fi ../setEnvironment-$1.sh sh -c '\ -$CC $CFLAGS -Werror=format -c main.c -o main-'"$1.o" || exit 1 +$CC $CFLAGS -Werror=format -c main.c -DXSDL_ARCH=\"'$1'\" -o main-'"$1.o" || exit 1 ../setEnvironment-$1.sh sh -c '\ -$CC $CFLAGS -Werror=format -c gfx.c -o gfx-'"$1.o" || exit 1 +$CC $CFLAGS -Werror=format -c gfx.c -DXSDL_ARCH=\"'$1'\" -o gfx-'"$1.o" || exit 1 [ -e ../../../lib ] || ln -s libs ../../../lib @@ -76,8 +76,6 @@ rm -rf $CURDIR/tmp-$1 mkdir -p $CURDIR/tmp-$1 cd $CURDIR/tmp-$1 cp -f $CURDIR/xserver/data/busybox-$1 ./busybox -cp -f $CURDIR/xserver/data/busybox-$1 ./libbusybox -cp -f $CURDIR/xserver/data/busybox-$1 ./libbusybox.so for f in xhost xkbcomp xloadimage xsel; do cp -f $CURDIR/xserver/android/$1/$f ./$f ; done # Statically-linked prebuilt executables, generated using Debian chroot. @@ -90,6 +88,18 @@ cp -f $CURDIR/pulseaudio/$1/*/install/lib/*.so ./ rm -f ../AndroidData/binaries-$1.zip rm -rf ../AndroidData/lib/$1 mkdir -p ../AndroidData/lib/$1 -cp -a . ../AndroidData/lib/$1 + +#cp -a . ../AndroidData/lib/$1 + +rm -r bin-map-$1.txt +IDX=0 +for BIN in *; do + echo "lib$IDX.so" >> bin-map-$1.txt + echo "$BIN" >> bin-map-$1.txt + cp ./$BIN ../AndroidData/lib/$1/lib$IDX.so + IDX="`expr $IDX \+ 1`" +done + +zip ../AndroidData/bin-map.zip bin-map-$1.txt exit 0 diff --git a/project/jni/application/xserver/gfx.c b/project/jni/application/xserver/gfx.c index 74ea373ae..360ddb305 100644 --- a/project/jni/application/xserver/gfx.c +++ b/project/jni/application/xserver/gfx.c @@ -283,41 +283,55 @@ static void * unpackFilesThread(void * unused) return (void *)1; } -static void symlinkBusybox(void) -{ - char fname[PATH_MAX*2]; - char fname2[PATH_MAX]; - - sprintf(fname, "%s/busybox", getenv("APPDIR")); - sprintf(fname2, "%s/busybox", getenv("LIBDIR")); - remove(fname); - symlink(fname2, fname); - __android_log_print(ANDROID_LOG_INFO, "XSDL", "ln -s %s %s", fname2, fname); -} - static void symlinkUsrBin(void) { - char fname[PATH_MAX*2]; - char fname2[PATH_MAX]; + char libname[PATH_MAX]; + char targetname[PATH_MAX]; + char libpath[PATH_MAX]; + char targetpath[PATH_MAX]; + char mappingpath[PATH_MAX]; + FILE *mapping; - strcpy( fname, getenv("APPDIR") ); - strcat( fname, "/busybox" ); - strcat( fname, " rm -rf " ); - strcat( fname, getenv("APPDIR") ); - strcat( fname, "/usr/bin" ); + sprintf( mappingpath, "%s/bin-map-%s.txt", getenv("DATADIR"), XSDL_ARCH ); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Opening %s", mappingpath); + mapping = fopen(mappingpath, "rb"); + if (!mapping) + { + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Opening %s failed", mappingpath); + return; + } - __android_log_print(ANDROID_LOG_INFO, "XSDL", "%s", fname); + sprintf( targetpath, "%s/usr", getenv("APPDIR") ); + mkdir(targetpath, 0700); - system( fname ); + sprintf( targetpath, "%s/usr/bin", getenv("APPDIR") ); + mkdir(targetpath, 0700); - sprintf(fname, "%s/usr/bin", getenv("APPDIR")); - symlink(getenv("LIBDIR"), fname); - __android_log_print(ANDROID_LOG_INFO, "XSDL", "ln -s %s %s", getenv("LIBDIR"), fname); + while (fgets(libname, sizeof(libname), mapping) && + fgets(targetname, sizeof(targetname), mapping)) + { + if (strchr(libname, '\n')) + strchr(libname, '\n')[0] = 0; + if (strchr(targetname, '\n')) + strchr(targetname, '\n')[0] = 0; + sprintf( libpath, "%s/%s", getenv("LIBDIR"), libname ); + sprintf( targetpath, "%s/usr/bin/%s", getenv("APPDIR"), targetname ); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "ln -s %s %s", libpath, targetpath); + symlink( libpath, targetpath ); + } + fclose(mapping); + + sprintf(targetpath, "%s/busybox", getenv("APPDIR")); + remove(targetpath); + symlink("usr/bin/busybox", targetpath); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "ln -s usr/bin/busybox %s", targetpath); + + remove(mappingpath); } void XSDL_unpackFiles(int _freeSpaceRequiredMb) { - symlinkBusybox(); + symlinkUsrBin(); pthread_t thread_id; void * status; @@ -430,8 +444,6 @@ void XSDL_unpackFiles(int _freeSpaceRequiredMb) exit(1); } SDL_JoystickClose(j0); - - symlinkUsrBin(); } void XSDL_showConfigMenu(int * resolutionW, int * displayW, int * resolutionH, int * displayH, int * builtinKeyboard, int * ctrlAltShiftKeys, char * portStr) @@ -876,7 +888,7 @@ void XSDL_generateBackground(const char * port, int showHelp, int resolutionW, i sprintf (msg, "If you run Linux in chroot on this device, run:"); renderStringScaled(msg, 12 * resolutionH / VID_Y, resolutionW/2, y, 255, 255, 255, surf); y += resolutionH * 15 / VID_Y; - sprintf (msg, "export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4712"); + sprintf (msg, "export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713"); renderStringScaled(msg, 12 * resolutionH / VID_Y, resolutionW/2, y, 255, 255, 255, surf); SDL_SavePNG(surf, "background.png"); diff --git a/project/jni/application/xserver/main.c b/project/jni/application/xserver/main.c index dbca4d110..746db4793 100644 --- a/project/jni/application/xserver/main.c +++ b/project/jni/application/xserver/main.c @@ -173,30 +173,6 @@ int main( int argc, char* argv[] ) __android_log_print(ANDROID_LOG_INFO, "XSDL", "XSDL chdir to: %s", getenv("SECURE_STORAGE_DIR")); chdir( getenv("SECURE_STORAGE_DIR") ); // Megahack: change /proc/self/cwd to the X.org data dir, and use /proc/self/cwd path in libX11 - system("logwrapper echo ====================="); - system("logwrapper ls -l ."); - system("logwrapper echo ===================== usr"); - system("logwrapper ls -l usr"); - system("logwrapper echo ===================== usr/bin"); - system("logwrapper ls -l usr/bin"); - system("logwrapper echo ===================== usr/share/X11/xkb/rules"); - system("logwrapper ls -l usr/share/X11/xkb/rules"); - system("logwrapper echo ===================== ./busybox"); - system("logwrapper ./busybox ls -l"); - system("logwrapper ./busybox"); - system("logwrapper ./busybox tar -h"); - { - char buf[PATH_MAX]; - system("logwrapper echo ===================== LIBDIR = $LIBDIR"); - sprintf(buf, "logwrapper ls -l %s", getenv("LIBDIR")); - system(buf); - sprintf(buf, "logwrapper %s/busybox", getenv("LIBDIR")); - system(buf); - sprintf(buf, "logwrapper %s/busybox tar -h", getenv("LIBDIR")); - system(buf); - } - system("logwrapper echo ===================== END"); - startPulseAudio(); android_main( argnum, args, envp ); // Should never exit on success, if we want to terminate we kill ourselves