android: Implement (optional) support for both 32bit and 64bit build.

This adds possiblity to specify additional build trees for LibreOffice
and POCO that contain the 64bit version, like:

    --with-lo-builddir=/local/libreoffice/master-android-release:/local/libreoffice/master-android-release-64bit \
    --with-poco-includes=/opt/poco-android/include:/opt/poco-android-64bit/include \
    --with-poco-libs=/opt/poco-android/lib:/opt/poco-android-64bit/lib \

which triggers both 32bit and 64bit build.

It should be still possible to build just 32bit when used without the
semicolons - which is useful for the normal development.

Change-Id: I99145e57f0cc15f022c05d09f8c4ab275880d44b
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/84312
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Tested-by: Jan Holesovsky <kendy@collabora.com>
distro/collabora/code-4.2.0-3
Jan Holesovsky 2019-11-25 21:34:21 +01:00
parent de006eab17
commit d556760c2f
7 changed files with 149 additions and 54 deletions

View File

@ -82,6 +82,17 @@ build the native parts on Windows.
+ Open this 'android' subdir as a project
+ Build from Android Studio (Build -> Make Project)
== Building 32bit + 64bit combined .apk ==
+ you need to build both a 32bit (armeabi-v7a) and 64bit (arm64-v8a) core
+ you need to build both a 32bit and 64bit POCO
+ and then provide paths to both to the ./configure, separated by a colon ':',
like:
--with-lo-builddir=/local/libreoffice/master-android-release:/local/libreoffice/master-android-release-64bit \
--with-poco-includes=/opt/poco-android/include:/opt/poco-android-64bit/include \
--with-poco-libs=/opt/poco-android/lib:/opt/poco-android-64bit/lib \
== Debugging ==
To debug the native code in Android Studio, you need the debugging symbols and

View File

@ -6,6 +6,7 @@ ext {
liboInfoURL = '@INFO_URL@'
liboLauncherIcon = '@mipmap/@APP_IC_LAUNCHER@'
liboHasBranding = '@APP_HAS_BRANDING@'
liboAndroidAbi = '@ANDROID_ABI@'
}
android.defaultConfig {
applicationId '@ANDROID_PACKAGE_NAME@'

View File

@ -20,8 +20,8 @@ android {
manifestPlaceholders = [ appIcon: "${liboLauncherIcon}" ]
buildConfigField "boolean", "APP_HAS_BRANDING", "${liboHasBranding}"
ndk {
//abiFilters "x86", "armeabi-v7a", "armeabi"
abiFilters "armeabi-v7a"
abiFilters = []
abiFilters.addAll("${liboAndroidAbi}".split(' ').collect{it as String})
}
applicationIdSuffix '.debug'
versionNameSuffix '-debug'
@ -34,7 +34,8 @@ android {
manifestPlaceholders = [ appIcon: "${liboLauncherIcon}" ]
buildConfigField "boolean", "APP_HAS_BRANDING", "${liboHasBranding}"
ndk {
abiFilters "armeabi-v7a"
abiFilters = []
abiFilters.addAll("${liboAndroidAbi}".split(' ').collect{it as String})
}
minifyEnabled false // FIXME disabled before we get a good proguardRules for callFakeWebsocketOnMessage calling from C++
shrinkResources false // FIXME cannot be enabled when minifyEnabled is turned off

View File

@ -22,15 +22,16 @@ android {
debug {
buildConfigField "String", "GIT_COMMIT", "\"${liboGitFullCommit}\""
ndk {
//abiFilters "x86", "armeabi-v7a", "armeabi"
abiFilters "armeabi-v7a"
abiFilters = []
abiFilters.addAll("${liboAndroidAbi}".split(' ').collect{it as String})
}
debuggable true
}
release {
buildConfigField "String", "GIT_COMMIT", "\"${liboGitFullCommit}\""
ndk {
abiFilters "armeabi-v7a"
abiFilters = []
abiFilters.addAll("${liboAndroidAbi}".split(' ').collect{it as String})
}
minifyEnabled false // FIXME disabled before we get a good proguardRules for callFakeWebsocketOnMessage calling from C++
shrinkResources false // FIXME cannot be enabled when minifyEnabled is turned off

View File

@ -9,4 +9,5 @@ ext {
liboVersionMinor = '@LOOLWSD_VERSION_MAJOR@'
liboGitFullCommit = '@LOOLWSD_VERSION_HASH@'
liboApplicationId = '@ANDROID_PACKAGE_NAME@'
liboAndroidAbi = '@ANDROID_ABI@'
}

View File

@ -23,6 +23,19 @@ add_library(androidapp SHARED
target_compile_definitions(androidapp PRIVATE LOOLWSD_CONFIGDIR="/etc/loolwsd") # TODO somewhere in assets maybe?
# According to the ABI, we need to use different source trees
if(${ANDROID_ABI} STREQUAL "armeabi-v7a")
set(LOBUILDDIR_ABI @LOBUILDDIR@)
set(POCOINCLUDE_ABI ${POCOINCLUDE_ABI})
set(POCOLIB_ABI @POCOLIB@)
elseif(${ANDROID_ABI} STREQUAL "arm64-v8a")
set(LOBUILDDIR_ABI @LOBUILDDIR_ARM64_V8A@)
set(POCOINCLUDE_ABI @POCOINCLUDE_ARM64_V8A@)
set(POCOLIB_ABI @POCOLIB_ARM64_V8A@)
else()
MESSAGE(FATAL_ERROR "Cannot build for ABI ${ANDROID_ABI}, please add support for that.")
endif()
target_include_directories(androidapp PRIVATE
. # path to androidapp.h
../../../../.. # path to config.h
@ -30,51 +43,51 @@ target_include_directories(androidapp PRIVATE
../../../../../kit
../../../../../net
../../../../../wsd
@POCOINCLUDE@ # POCO
@LIBPNG_INCLUDES@ # libpng
@LOKIT_PATH@ # LibreOfficeKit
${POCOINCLUDE_ABI} # POCO
${LOBUILDDIR_ABI}/workdir/UnpackedTarball/libpng # libpng
${LOBUILDDIR_ABI}/include # LibreOfficeKit
)
add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}/liblo-native-code.so"
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libfreebl3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libfreebl3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libfreebl3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libfreebl3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libnspr4.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libnspr4.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libnspr4.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libnspr4.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libnss3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libnss3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libnss3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libnss3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libnssckbi.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libnssckbi.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libnssckbi.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libnssckbi.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libnssdbm3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libnssdbm3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libnssdbm3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libnssdbm3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libnssutil3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libnssutil3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libnssutil3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libnssutil3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libplc4.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libplc4.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libplc4.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libplc4.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libplds4.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libplds4.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libplds4.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libplds4.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libsmime3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libsmime3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libsmime3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libsmime3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libsoftokn3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libsoftokn3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libsoftokn3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libsoftokn3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libsqlite3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libsqlite3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libsqlite3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libsqlite3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/instdir/program/libssl3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/instdir/program/libssl3.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/instdir/program/libssl3.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/instdir/program/libssl3.so
COMMAND ${CMAKE_COMMAND} -E copy @LOBUILDDIR@/android/source/jniLibs/${ANDROID_ABI}/liblo-native-code.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS @LOBUILDDIR@/android/source/jniLibs/${ANDROID_ABI}/liblo-native-code.so
COMMAND ${CMAKE_COMMAND} -E copy ${LOBUILDDIR_ABI}/android/source/jniLibs/${ANDROID_ABI}/liblo-native-code.so "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}"
DEPENDS ${LOBUILDDIR_ABI}/android/source/jniLibs/${ANDROID_ABI}/liblo-native-code.so
COMMENT "Copied liblo-native-code.so and its dependencies to the tree."
)
@ -85,13 +98,13 @@ add_custom_target(copy_native_code DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/lib/${AN
target_link_libraries(androidapp
android
log
@LIBPNG_LIBS@/liblibpng.a
@POCOLIB@/libPocoEncodings@POCODEBUG@.a
@POCOLIB@/libPocoNet@POCODEBUG@.a
@POCOLIB@/libPocoRedis@POCODEBUG@.a
@POCOLIB@/libPocoUtil@POCODEBUG@.a
@POCOLIB@/libPocoXML@POCODEBUG@.a
@POCOLIB@/libPocoJSON@POCODEBUG@.a
@POCOLIB@/libPocoFoundation@POCODEBUG@.a
${LOBUILDDIR_ABI}/workdir/LinkTarget/StaticLibrary/liblibpng.a
${POCOLIB_ABI}/libPocoEncodings@POCODEBUG@.a
${POCOLIB_ABI}/libPocoNet@POCODEBUG@.a
${POCOLIB_ABI}/libPocoRedis@POCODEBUG@.a
${POCOLIB_ABI}/libPocoUtil@POCODEBUG@.a
${POCOLIB_ABI}/libPocoXML@POCODEBUG@.a
${POCOLIB_ABI}/libPocoJSON@POCODEBUG@.a
${POCOLIB_ABI}/libPocoFoundation@POCODEBUG@.a
"${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}/liblo-native-code.so"
)

View File

@ -175,7 +175,10 @@ AC_ARG_WITH([lo-builddir],
In case of macOS, you MUST manually edit the ios/Mobile.xcodeproj/project.pbxproj
file and change the references to "../ios-device" to refer to the corresponding
LibreOffice core source directory (which typically would be the same as the build
directory you specify with this option).]))
directory you specify with this option).
In case of Android, you can provide 2 builddirs
separated by a colon ':' - the first is for
armeabi-v7a, the second is for arm64-v8a]))
AC_ARG_WITH([logfile],
AS_HELP_STRING([--with-logfile=<path>],
@ -183,19 +186,25 @@ AC_ARG_WITH([logfile],
AC_ARG_WITH([poco-includes],
AS_HELP_STRING([--with-poco-includes=<path>],
[Path to the "include" directory with the Poco headers]))
[Path to the "include" directory with the Poco
headers. If you are building for Android 64bit,
you need two, separated by a colon ':'.]))
AC_ARG_WITH([poco-libs],
AS_HELP_STRING([--with-poco-libs=<path>],
[Path to the "lib" directory with the Poco libraries]))
[Path to the "lib" directory with the Poco
libraries. If you are building for Android 64bit,
you need two, separated by a colon ':'.]))
AC_ARG_WITH([libpng-includes],
AS_HELP_STRING([--with-libpng-includes=<path>],
[Path to the "include" directory with the libpng headers]))
[Path to the "include" directory with the libpng
headers. Not used on Android.]))
AC_ARG_WITH([libpng-libs],
AS_HELP_STRING([--with-libpng-libs=<path>],
[Path to the "lib" directory with the libpng libraries]))
[Path to the "lib" directory with the libpng
libraries. Not used on Android.]))
AC_ARG_WITH([cppunit-includes],
AS_HELP_STRING([--with-cppunit-includes=<path>],
@ -303,8 +312,12 @@ fi
# to the Mac.
# Android: We need these to setup the CMakeLists.txt properly.
LOBUILDDIR=
ANDROID_ABI="armeabi-v7a"
LOBUILDDIR_ARM64_V8A=
POCOINCLUDE=
POCOINCLUDE_ARM64_V8A=
POCOLIB=
POCOLIB_ARM64_V8A=
POCODEBUG=
if test \( "$enable_iosapp" = "yes" -a `uname -s` = "Darwin" \) -o \( "$enable_androidapp" = "yes" \); then
AC_MSG_CHECKING([for LibreOffice build tree to build against])
@ -313,6 +326,23 @@ if test \( "$enable_iosapp" = "yes" -a `uname -s` = "Darwin" \) -o \( "$enable_a
fi
LOBUILDDIR="$with_lo_builddir"
if test "$enable_androidapp" = "yes" ; then
if echo "$LOBUILDDIR" | grep -qs ':' ; then
ANDROID_ABI="armeabi-v7a arm64-v8a"
LOBUILDDIR=`echo $with_lo_builddir | sed 's/:.*//'`
LOBUILDDIR_ARM64_V8A=`echo $with_lo_builddir | sed 's/^.*://'`
fi
# Sanity check, just a random object file in the LibreOffice build tree - 64bit
if test "$ANDROID_ABI" != "armeabi-v7a" ; then
if test -f "$LOBUILDDIR_ARM64_V8A/workdir/LinkTarget/StaticLibrary/liblibpng.a" ; then
AC_MSG_RESULT([$LOBUILDDIR_ARM64_V8A])
else
AC_MSG_ERROR([This is not a LibreOffice 64bit core build directory: $LOBUILDDIR_ARM64_V8A])
fi
fi
fi
# Sanity check, just a random object file in the LibreOffice build tree
if test \( "$enable_iosapp" = "yes" -a -f "$LOBUILDDIR/workdir/CxxObject/vcl/ios/iosinst.o" \) -o \( "$enable_androidapp" = "yes" -a -f "$LOBUILDDIR/workdir/LinkTarget/StaticLibrary/liblibpng.a" \); then
AC_MSG_RESULT([$LOBUILDDIR])
@ -326,6 +356,22 @@ if test \( "$enable_iosapp" = "yes" -a `uname -s` = "Darwin" \) -o \( "$enable_a
fi
POCOINCLUDE="$with_poco_includes"
if test "$enable_androidapp" = "yes" ; then
if echo "$POCOINCLUDE" | grep -qs ':' ; then
POCOINCLUDE=`echo $with_poco_includes | sed 's/:.*//'`
POCOINCLUDE_ARM64_V8A=`echo $with_poco_includes | sed 's/^.*://'`
fi
# Sanity check - 64bit
if test "$ANDROID_ABI" != "armeabi-v7a" ; then
if test -f "$POCOINCLUDE_ARM64_V8A/Poco/Poco.h"; then
AC_MSG_RESULT([$POCOINCLUDE_ARM64_V8A])
else
AC_MSG_ERROR([This is not a Poco 64bit include directory: $POCOINCLUDE_ARM64_V8A])
fi
fi
fi
# Sanity check
if test -f "$POCOINCLUDE/Poco/Poco.h"; then
AC_MSG_RESULT([$POCOINCLUDE])
@ -339,6 +385,22 @@ if test \( "$enable_iosapp" = "yes" -a `uname -s` = "Darwin" \) -o \( "$enable_a
fi
POCOLIB="$with_poco_libs"
if test "$enable_androidapp" = "yes" ; then
if echo "$POCOLIB" | grep -qs ':' ; then
POCOLIB=`echo $with_poco_libs | sed 's/:.*//'`
POCOLIB_ARM64_V8A=`echo $with_poco_libs | sed 's/^.*://'`
fi
# Sanity check - 64bit
if test "$ANDROID_ABI" != "armeabi-v7a" ; then
if test -f "$POCOLIB_ARM64_V8A/libPocoFoundation.a"; then
AC_MSG_RESULT([$POCOLIB_ARM64_V8A])
else
AC_MSG_ERROR([This is not a Poco 64bit lib directory: $POCOLIB_ARM64_V8A])
fi
fi
fi
# Sanity check
if test -f "$POCOLIB/libPocoFoundation.a"; then
AC_MSG_RESULT([$POCOLIB])
@ -351,21 +413,26 @@ if test \( "$enable_iosapp" = "yes" -a `uname -s` = "Darwin" \) -o \( "$enable_a
fi
fi
AC_SUBST(LOBUILDDIR)
AC_SUBST(ANDROID_ABI)
AC_SUBST(LOBUILDDIR_ARM64_V8A)
AC_SUBST(POCOINCLUDE)
AC_SUBST(POCOINCLUDE_ARM64_V8A)
AC_SUBST(POCOLIB)
AC_SUBST(POCOLIB_ARM64_V8A)
AC_SUBST(POCODEBUG)
LIBPNG_INCLUDES="$with_libpng_includes"
LIBPNG_LIBS="$with_libpng_libs"
LOKIT_PATH=`readlink -f $with_lokit_path`
if test "$enable_androidapp" = "yes"; then
if test -z "$LIBPNG_INCLUDES" ; then
LIBPNG_INCLUDES="$LOBUILDDIR/workdir/UnpackedTarball/libpng"
if test -n "$LIBPNG_INCLUDES" ; then
AC_MSG_ERROR([--with-libpng-includes is ignored on Android, please remove the parameter.])
fi
if test -z "$LIBPNG_LIBS" ; then
LIBPNG_LIBS="$LOBUILDDIR/workdir/LinkTarget/StaticLibrary"
if test -n "$LIBPNG_LIBS" ; then
AC_MSG_ERROR([--with-libpng-libs is ignored on Android, please remove the parameter.])
fi
if test -z "$LOKIT_PATH" ; then
if test -n "$LOKIT_PATH" ; then
AC_MSG_ERROR([--with-lokit-path is ignored on Android, please remove the parameter.])
LOKIT_PATH=`readlink -f $LOBUILDDIR/include`
fi
fi
@ -733,7 +800,7 @@ LIBS="$LIBS -lPocoNet${POCO_DEBUG_SUFFIX} -lPocoNetSSL${POCO_DEBUG_SUFFIX} -lPoc
AS_IF([test "$ENABLE_SSL" = "true"],
[LIBS="$LIBS -lssl -lcrypto"])
AS_IF([test "$ENABLE_IOSAPP" != "true"],
AS_IF([test "$ENABLE_IOSAPP" != "true" -a "$ENABLE_ANDROIDAPP" != "true"],
[AC_CHECK_HEADERS([LibreOfficeKit/LibreOfficeKit.h],
[],
[AC_MSG_ERROR([header LibreOfficeKit/LibreOfficeKit.h not found, perhaps you want to use --with-lokit-path])])