diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 3cd0f4e8f..373df6e98 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -1,183 +1,183 @@ #android build # copied/inspired from stellarium project (http://www.stellarium.org/wiki/index.php/Building_for_Android) LIST(APPEND JAVA_SRCS "src/com/android/vending/billing/IInAppBillingService.aidl" "src/net/gcompris/GComprisActivity.java") FOREACH(JavaSource ${JAVA_SRCS}) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${JavaSource} COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${JavaSource} ${CMAKE_CURRENT_BINARY_DIR}/${JavaSource} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${JavaSource} ) LIST(APPEND TARGET_JAVA_FILES ${CMAKE_CURRENT_BINARY_DIR}/${JavaSource}) ENDFOREACH() ADD_CUSTOM_TARGET (java_src DEPENDS ${TARGET_JAVA_FILES}) find_program(ANDROID_DEPLOY_QT NAMES androiddeployqt PATHS ${_qt5Core_install_prefix}/bin/ ) # Look for androiddeployqt program if (NOT ANDROID_DEPLOY_QT) message(FATAL_ERROR "Could not find androiddeployqt. Make sure you set all the Qt5_* paths to the Qt for android compiled version.") endif(NOT ANDROID_DEPLOY_QT) # Set version set(ANDROID_VERSION_NAME ${GCOMPRIS_VERSION}) # Set a name representing the build type set(APK_SUFFIX "-") if(ACTIVATION_MODE STREQUAL "inapp") set(APK_SUFFIX "-inapp${APK_SUFFIX}") elseif(ACTIVATION_MODE STREQUAL "internal") set(APK_SUFFIX "-internal${APK_SUFFIX}") endif(ACTIVATION_MODE STREQUAL "inapp") # _HOST have been removed from ECM in https://cgit.kde.org/extra-cmake-modules.git/commit/?id=731ba7036effcc430f98031e7f2a9826f6234cba set(_HOST "${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") string(TOLOWER "${_HOST}" _HOST) if(WITH_DEMO_ONLY) set(APK_SUFFIX "-demo${APK_SUFFIX}") endif(WITH_DEMO_ONLY) if(WITH_DOWNLOAD) set(APK_SUFFIX "-dl${APK_SUFFIX}") endif(WITH_DOWNLOAD) if(WITH_KIOSK_MODE) set(APK_SUFFIX "-kiosk${APK_SUFFIX}") endif(WITH_KIOSK_MODE) # specific clang addition if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(STDCPP_PATH ",\"stdcpp-path\": \"${ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libs/${ANDROID_ABI}/libc++_shared.so\"") set(REMOVE_mandroid_FLAG_FOR_CLANG "sed -i -e 's/-mandroid//' Configure") endif() set(ANDROID_TOOLCHAIN arm-linux-androideabi) # set android package source for androiddeployqt json file set(PACKAGE_SOURCE_ANDROID ${CMAKE_BINARY_DIR}/tmpAndroid) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml @ONLY) # create json file parsed by the androiddeployqt set(ANDROID_SDK_ROOT $ENV{ANDROID_SDK_ROOT}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configAndroid.json.cmake ${PACKAGE_SOURCE_ANDROID}/configAndroid.json @ONLY) # Get all po files in po/ to create the values-{locale} in order to have the locales available in android file(GLOB TRANSLATIONS_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "../po/*.po") foreach(PoSource ${TRANSLATIONS_FILES}) # Remove suffix ".po" string(REPLACE ".po" "" PoSource ${PoSource}) # Remove prefix "../po/gcompris_" string(REPLACE "../po/gcompris_" "" locale ${PoSource}) # replace _ par -r for locales with country string(REPLACE "_" "-r" locale ${locale}) add_custom_command( OUTPUT ${locale} COMMAND cmake -E make_directory ${GCOMPRIS_TRANSLATIONS_DIR} COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/android/res/values-${locale} COMMAND cmake -E copy ${CMAKE_SOURCE_DIR}/android/strings.xml ${CMAKE_BINARY_DIR}/android/res/values-${locale}/strings.xml ) list(APPEND ALL_LOCALES ${locale}) endforeach() add_custom_command ( OUTPUT createApkFromAndroidDeployQtDebug DEPENDS ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${PACKAGE_SOURCE_ANDROID} COMMAND ${ANDROID_DEPLOY_QT} --output ${CMAKE_CURRENT_BINARY_DIR}/ --input ${PACKAGE_SOURCE_ANDROID}/configAndroid.json --debug COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/bin/QtApp-debug.apk ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-debug-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk ) add_custom_command ( OUTPUT createApkFromAndroidDeployQtRelease DEPENDS ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${PACKAGE_SOURCE_ANDROID} COMMAND ${ANDROID_DEPLOY_QT} --output ${CMAKE_CURRENT_BINARY_DIR}/ --input ${PACKAGE_SOURCE_ANDROID}/configAndroid.json --release COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/bin/QtApp-release-unsigned.apk ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk ) add_custom_command ( OUTPUT createApkSignedFromAndroidDeployQtRelease DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk COMMAND jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $ENV{ANDROID_KEYSTORE} -storepass $ENV{ANDROID_KEYSTORE_PASSWD} ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk gcompris ) add_custom_command ( OUTPUT createApkSignedAlignedFromAndroidDeployQtRelease DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk COMMAND ${ANDROID_SDK_ROOT}/build-tools/21.1.2/zipalign -v 4 ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk ) add_custom_command ( OUTPUT apkInstall DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk COMMAND ${ANDROID_SDK_ROOT}/platform-tools/adb install -r ${CMAKE_CURRENT_BINARY_DIR}/bin/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk ) # Command to create apk from Makefile add_custom_target (apk_debug DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkFromAndroidDeployQtDebug java_src ) # Command to create apk from Makefile add_custom_target (apk_release DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkFromAndroidDeployQtRelease java_src ) # Command to create signed apk from Makefile add_custom_target (apk_signed DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkSignedFromAndroidDeployQtRelease java_src ) # Command to create signed aligned apk from Makefile add_custom_target (apk_signed_aligned DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkSignedAlignedFromAndroidDeployQtRelease java_src ) # Command to install the signed aligned apk through adb from Makefile add_custom_target (apk_install DEPENDS apkInstall ) # compile openssl needed to download from https include(ExternalProject) -set(OPENSSL_DIR "${CMAKE_SOURCE_DIR}/external/openssl/") +set(OPENSSL_DIR "${CMAKE_BINARY_DIR}/external/openssl/") configure_file("build_openssl.sh.in" "build_openssl.sh" @ONLY) ExternalProject_Add( ext_openssl DOWNLOAD_DIR ${CMAKE_BINARY_DIR} SOURCE_DIR ${OPENSSL_DIR} URL https://www.openssl.org/source/openssl-1.0.2q.tar.gz URL_HASH SHA256=5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684 CONFIGURE_COMMAND echo "Configuration not needed" BUILD_COMMAND sh "${CMAKE_CURRENT_BINARY_DIR}/build_openssl.sh" INSTALL_COMMAND "" ) add_custom_command( OUTPUT package_openssl COMMAND ${CMAKE_COMMAND} -E copy "${OPENSSL_DIR}/libcrypto.so.1.0.0" "${CMAKE_BINARY_DIR}/android/libs/${ANDROID_ABI}/libcrypto.so" COMMAND ${CMAKE_COMMAND} -E copy "${OPENSSL_DIR}/libssl.so.1.0.0" "${CMAKE_BINARY_DIR}/android/libs/${ANDROID_ABI}/libssl.so" ) # add_custom_command( OUTPUT move_translations_to_assets COMMAND ${CMAKE_COMMAND} -E copy_directory ${GCOMPRIS_TRANSLATIONS_DIR} ${CMAKE_BINARY_DIR}/android/assets/share/GCompris ) if (TARGET create-apk) set(PACKAGE_DIR ${PACKAGE_SOURCE_ANDROID}) set_target_properties(create-apk-GCompris PROPERTIES ANDROID_APK_DIR "${PACKAGE_DIR}") add_custom_target(gcompris-move-metadata ALL COMMAND cmake -E echo "Moving GCompris shared Android resources" COMMAND cmake -E make_directory ${PACKAGE_SOURCE_ANDROID} COMMAND cmake -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}" "${PACKAGE_SOURCE_ANDROID}" ) add_dependencies(create-apk gcompris-move-metadata) endif() diff --git a/android/build_openssl.sh.in b/android/build_openssl.sh.in index 8c585fedb..42d40a515 100644 --- a/android/build_openssl.sh.in +++ b/android/build_openssl.sh.in @@ -1,16 +1,19 @@ #!/usr/bin/sh # The only argument to the script is source directory. source_dir=$1 -export PATH=@ANDROID_NDK@/toolchains/@ANDROID_TOOLCHAIN@-@ANDROID_GCC_VERSION@/prebuilt/@_HOST@/bin/:$PATH -export CROSS_COMPILE="@ANDROID_TOOLCHAIN@-" +export PATH=@ANDROID_NDK@/toolchains/@ANDROID_TOOLCHAIN@-4.9/prebuilt/@_HOST@/bin/:$PATH +echo $PATH +export CROSS_COMPILE="@ANDROID_TOOLCHAIN_PATH@@ANDROID_TOOLCHAIN@-" export NDK_SYSROOT=@ANDROID_NDK@ export ANDROID_NDK_ROOT=@ANDROID_NDK@ export ANDROID_DEV=@ANDROID_NDK@/platforms/android-@CMAKE_ANDROID_API@/arch-arm/usr export SYSROOT=@ANDROID_NDK@/platforms/android-@CMAKE_ANDROID_API@/arch-arm/ cd ${source_dir} @REMOVE_mandroid_FLAG_FOR_CLANG@ -./Configure --prefix=. --openssldir=./ssl android-armv7 no-asm +# ./Configure --prefix=. --openssldir=./ssl android-armv7 no-asm shared +# make ANDROID_DEV=/opt/android-16-arm/sysroot/usr/ CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" build_libs +./Configure --prefix=. --openssldir=./ssl android-armv7 no-asm shared make && make libssl.so.1.0.0 libcrypto.so.1.0.0 cd - diff --git a/android/configAndroid.json.cmake b/android/configAndroid.json.cmake index bbae54941..4c57898c9 100644 --- a/android/configAndroid.json.cmake +++ b/android/configAndroid.json.cmake @@ -1,16 +1,16 @@ { "description": "This file is to be read by androiddeployqt", "qt": "@_qt5Core_install_prefix@", "sdk": "@ANDROID_SDK_ROOT@", "ndk": "@ANDROID_NDK@", "toolchain-prefix": "@ANDROID_TOOLCHAIN@", "tool-prefix": "@ANDROID_TOOLCHAIN@", - "toolchain-version": "@ANDROID_GCC_VERSION@", + "toolchain-version": "4.9", "ndk-host": "@_HOST@", "target-architecture": "@ANDROID_ABI@", "application-binary": "@CMAKE_LIBRARY_OUTPUT_DIRECTORY@/libGCompris.so", "android-package-source-directory": "@PACKAGE_SOURCE_ANDROID@/", "android-package": "net.gcompris", "android-extra-plugins": "@CMAKE_BINARY_DIR@/lib/qml" @STDCPP_PATH@ } diff --git a/tools/android_build_all_apk.sh b/tools/android_build_all_apk.sh index f93055306..e37d6188a 100755 --- a/tools/android_build_all_apk.sh +++ b/tools/android_build_all_apk.sh @@ -1,115 +1,117 @@ #!/bin/sh # Automate the android builds # This script creates the different apk for arm # # Copyright (C) 2016 Bruno Coudoin # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # Uncomment if this is not already done # make getSvnTranslations -Qt5_BaseDIR=~/Qt5.9.3/5.9.3 +Qt5_BaseDIR=~/Qt5.12.1/5.12.1 export ANDROID_NDK_ROOT=$ANDROID_NDK # The current version version=$(sed -n -e 's/set(GCOMPRIS_MINOR_VERSION \([0-9]\+\)).*/\1/p' CMakeLists.txt) # The prefix of the build dir, will be suffixed by the arch target buildprefix=bb-$version # Remove po files android do not support rm -f po/*@* # if [ ! -f org.kde.gcompris.appdata.xml ] then echo "ERROR: Run me from the top level GCompris source dir" exit 1 fi # Param: ANDROID_ARCHITECTURE WITH_ACTIVATION_CODE DEMO_ONLY DOWNLOAD KIOSK_MODE f_cmake() { if [ $# != 5 ] then echo "f_cmake missing parameter" return fi if [ -f CMakeCache.txt ] then make clean rm CMakeCache.txt rm cmake_install.cmake rm Makefile rm -rf CMakeFiles fi cmake -DCMAKE_TOOLCHAIN_FILE=/usr/share/ECM/toolchain/Android.cmake \ -DCMAKE_ANDROID_API=16 \ -DCMAKE_BUILD_TYPE=release \ + -DCMAKE_ANDROID_STL_TYPE=c++_shared \ + -DANDROID_TOOLCHAIN_PATH=/opt/android-16-arm/bin/ \ -DANDROID_ARCHITECTURE=$1 \ -DQt5_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5 \ -DQt5Qml_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Qml \ -DQt5Network_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Network \ -DQt5Core_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Core \ -DQt5Quick_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Quick \ -DQt5Gui_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Gui \ -DQt5Multimedia_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Multimedia \ -DQt5Svg_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Svg \ -DQt5Widgets_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Widgets \ -DQt5Xml_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Xml \ -DQt5XmlPatterns_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5XmlPatterns \ -DQt5LinguistTools_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5LinguistTools \ -DQt5Sensors_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5Sensors \ -DQt5AndroidExtras_DIR=${Qt5_BaseDIR}/${QtTarget}/lib/cmake/Qt5AndroidExtras \ -Wno-dev \ -DQML_BOX2D_MODULE=submodule \ -DACTIVATION_MODE=$2 \ -DWITH_DEMO_ONLY=$3 \ -DWITH_DOWNLOAD=$4 \ -DWITH_KIOSK_MODE=$5 \ .. } # ARM QtTarget=android_armv7 builddir=${buildprefix}-${QtTarget} mkdir -p ${builddir} cd ${builddir} -f_cmake armeabi inapp OFF ON OFF +f_cmake arm inapp OFF ON OFF make make BuildTranslations make apk_release && make apk_signed && make apk_signed_aligned -f_cmake armeabi internal OFF ON OFF +f_cmake arm internal OFF ON OFF make make apk_release && make apk_signed && make apk_signed_aligned -f_cmake armeabi no OFF ON OFF +f_cmake arm no OFF ON OFF make make apk_release && make apk_signed && make apk_signed_aligned -f_cmake armeabi no ON ON OFF +f_cmake arm no ON ON OFF make clean make make BuildTranslations make apk_release && make apk_signed && make apk_signed_aligned # Remove extra apk rm -f android/bin/*release-armeabi* rm -f android/bin/*release-signed-armeabi*