libreoffice-online/android
Tomaž Vajngerl 0897397834 android: create mainHandler on demand to prevent NPE
A crash happens when "back" is hit with a NPE exception because
mainHandler is null (not yet initilized). This changes the code
so mainHandler is initialized on demand and if not before, then
at least when initUI is called.

Change-Id: Id20b2093315ba41dac205fc4e94f31d00a4fe1f1
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/89953
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
2020-03-04 13:28:07 +01:00
..
app android: reuse an already open activity when starting a new one 2020-03-02 19:04:55 +01:00
lib android: create mainHandler on demand to prevent NPE 2020-03-04 13:28:07 +01:00
templates Remove hardcoded tab name "Sheet1" from empty spreadsheet file. 2020-02-14 13:56:12 +01:00
.gitignore android: Split the actual editing Activity into an own library. 2019-07-12 11:52:56 +02:00
build.gradle android: Update to a newer gradle. 2019-05-21 11:30:56 +02:00
gradle.properties android: We need more memory for the build. 2019-02-22 14:21:04 +01:00
gradlew
gradlew.bat
Makefile.am Install a Kit config that disables complex text options. 2020-02-18 12:08:19 +01:00
README android: Implement (optional) support for both 32bit and 64bit build. 2019-12-30 14:24:30 +01:00
settings.gradle android: Split the actual editing Activity into an own library. 2019-07-12 11:52:56 +02:00

The development of this Android app has to be done on Linux, it's currently not possible to
build the native parts on Windows.

* Compile LibreOffice master for Android.

  Do this in the folder where you cloned the LibreOffice core (e.g master-android).

  Create an autogen.input file:

      --build=x86_64-unknown-linux-gnu
      --with-android-ndk=/home/$USER/Android/Sdk/ndk-bundle
      --with-android-sdk=/home/$USER/Android/Sdk
      --with-distro=LibreOfficeAndroid
      --enable-sal-log

  Run ./autogen.sh && make

* Build the POCO for Android

  # clone the poco repository in the same folder where LibreOffice core and online folders are placed.
  git clone https://github.com/pocoproject/poco poco-android
  cd poco-android

  # use the 1.9.1 branch
  git checkout -b poco-1.9.1 origin/poco-1.9.1

  # configure
  ./configure --config=Android --no-samples --no-tests --minimal

  # make it
  PATH="$PATH":~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin make -j8 ANDROID_ABI=armeabi-v7a CC=armv7a-linux-androideabi21-clang CXX=armv7a-linux-androideabi21-clang++ SYSLIBS=-static-libstdc++

  # install it to /opt/poco-android
  PATH="$PATH":~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin make -j8 ANDROID_ABI=armeabi-v7a CC=armv7a-linux-androideabi21-clang CXX=armv7a-linux-androideabi21-clang++ SYSLIBS=-static-libstdc++ install INSTALLDIR=/opt/poco-android

* 64bit POCO for Android

  # checkout the 1.9.1 in a different location and apply the following patch:
  --- a/build/config/Android
  +++ b/build/config/Android
  @@ -21,6 +21,11 @@ TOOL      = arm-linux-androideabi
   ARCHFLAGS = -march=armv7-a -mfloat-abi=softfp
   LINKFLAGS = -Wl,--fix-cortex-a8
   else
  +ifeq ($(ANDROID_ABI),arm64-v8a)
  +TOOL      = aarch64-linux-android
  +#ARCHFLAGS = -march=armv7-a -mfloat-abi=softfp
  +#LINKFLAGS = -Wl,--fix-cortex-a8
  +else
   ifeq ($(ANDROID_ABI),x86)
   TOOL      = i686-linux-android
   ARCHFLAGS = -march=i686 -msse3 -mstackrealign -mfpmath=sse
  @@ -29,6 +34,7 @@ $(error Invalid ABI specified in ANDROID_ABI)
   endif
   endif
   endif
  +endif
   
   #
   # Define Tools

  # configure as above and make it:
  PATH="$PATH":~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin make -j8 ANDROID_ABI=arm64-v8a CC=aarch64-linux-android21-clang CXX=aarch64-linux-android21-clang++ SYSLIBS=-static-libstdc++

  # install
  PATH="$PATH":~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin make -j8 ANDROID_ABI=arm64-v8a CC=aarch64-linux-android21-clang CXX=aarch64-linux-android21-clang++ SYSLIBS=-static-libstdc++ install INSTALLDIR=/opt/poco-android-64bit

* Configure the online.git (eg. in online-android folder)

  Don't forget to change --with-lo-builddir in the following:

  ./autogen.sh && ./configure CC=~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang CXX=~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang++ --host=arm-linux-androideabi --enable-androidapp --with-lo-builddir=/local/libreoffice/master-android --with-poco-includes=/opt/poco-android/include --with-poco-libs=/opt/poco-android/lib --disable-setcap --enable-silent-rules --enable-debug

* Build the JavaScript, HTML and CSS files also in the online-android folder

  # just run 'make'
  make

* Build the actual app

  + Start Android Studio
  + 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
to setup lldb to actually read & use them.

* Add debugging symbols for the modules you are interested in

  To autogen.input, add something like:

    --enable-symbols="vcl/ desktop/ sal/ svx/ framework/ sfx2/ tools/ cppu/ cppuhelper/ filter/ comphelper/ Library_sw Library_swd Library_swui"

  clean the appropriate modules, like

    make vcl.clean desktop.clean sal.clean svx.clean framework.clean sfx2.clean tools.clean cppu.clean cppuhelper.clean filter.clean comphelper.clean sw.clean

  and rebuild using 'make'.

* Add android/source/obj/local/armeabi-v7a from core.git as a Symbol Directory

  In Android Studio, choose Run -> Debug... -> Edit Configurations...

  There go to the Android App -> app, choose the Debugger tab, and:

  Debug type: Auto (or Dual)

  Symbol Directories: here add the full path, like

    /local/libreoffice/master-android/android/source/obj/local/armeabi-v7a

  This path contains the non-stripped version of the liblo-native-code.so, and
  the debugger will read the symbols from that one (even if the APK contains
  the stripped version). *NB* ensure that this is before any internal source
  directories - since the internal source contains stripped native code.

  [Alternatively you can add the following to your ~/.lldbinit instead:

    settings set target.inline-breakpoint-strategy always
    settings append target.exec-search-paths /local/libreoffice/master-android/android/source/obj/local/armeabi-v7a
  ]

* To use pretty printers for types like OUString, add the following to your
  ~/.lldbinit:

  command script import '/local/libreoffice/master-android/solenv/lldb/libreoffice/LO.py'

From now on, you will be able to debug directly in the Android Studio
debugger.  Happy debugging!

Note: to re-buld your app with a newly compiled libnative-lo code - it is 

== Tip: How to speed up your core.git build ==

If you use icecream for parallel building, you can use it for
cross-compilation too.

  # first generate a tarball with the toolchain (once)
  icecc-create-env ~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang ~/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang++

And add it and the paths to the compiler as the first things to the
autogen.input:

  CC=icecc [here copy what the output of ./autogen.sh without icecream said for C compiler]
  CXX=icecc [here copy what the output of ./autogen.sh without icecream said for C++ compiler]
  ICECC_VERSION=/path/to/the/tarball/generated/above/955ceb546ceb7a5715bf0223ddd788fe.tar.gz
  --with-parallelism=[amount of cpu threads in your icecream farm]
  --enable-icecream
  [...the original autogen.input...]

So the result will look something like this:

  CC=icecc /home/$USER/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon -Wl,--fix-cortex-a8 -gcc-toolchain /home/$USER/Android/Sdk/ndk-bundle/to>
  CXX=icecc /home/$USER/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon -Wl,--fix-cortex-a8 -gcc-toolchain /home/$USER/Android/Sdk/ndk-bundle>
  ICECC_VERSION=/local/libreoffice/android/955ceb546ceb7a5715bf0223ddd788fe.tar.gz
  --with-parallelism=25
  --enable-icecream
  --build=x86_64-unknown-linux-gnu
  --with-android-ndk=/home/$USER/Android/Sdk/ndk-bundle
  --with-android-sdk=/home/$USER/Android/Sdk
  --with-distro=LibreOfficeAndroid
  --enable-sal-log