CutefishOS app startup speed optimizer.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Pertti Kellomäki 7ae62a496e Changes: Documented applauncherd command line interface in api file.
Changed scope from Platform to Nokia MeeGo.

RevBy: Juha Lintula
15 years ago
data Changes: Rename qdeclarativeboostercache -> mdeclarativecache. 15 years ago
debian Changes: Documented applauncherd command line interface in api file. 15 years ago
doc Changes:Added doxygen-userdoc.conf file 15 years ago
examples/boosted-qml Changes: Add examples of using qdeclarativebooster with qmake and cmake. 15 years ago
meego Changes: Copied the splash screen section from README to README-QDECLARATIVEBOOSTER. 15 years ago
src Changes: --respawn delay accepts 0 15 years ago
tests Changes: Pipe between applauncherd and boosters replaced with socket pair. 15 years ago
.gitignore Changes: First public release 16 years ago
CMakeLists.txt Fixes: NB#234213 - The documentation of QML Booster is not good 15 years ago
COPYING.LESSER Changes: First public release 16 years ago
INSTALL Changes: First public release 16 years ago
README.dox Fixes: NB#234213 - The documentation of QML Booster is not good 15 years ago
TODO Changes: First public release 16 years ago
configure Changes: First public release 16 years ago

README.dox

/*! \mainpage Applauncherd usage

\section intro Introduction

Applauncherd is a daemon that helps to launch applications faster by
preloading dynamically linked libraries and caching stuff
(MComponentCache, MDeclarativeCache). It also saves memory, because
all launched applications share certain resources. 

This documentation describes the idea behind the launcher and the
basic usage. It also explains some of the \subpage technical
"Technical details" of the implementation.

\subsection howto How to...

\li \subpage compilinglinking "Compile and link your application to be usable with the launcher"

\li \subpage invoker "Launch your application using the invoker"

\li \subpage usingboosters "Reduce startup time with cached object instances"

\li \subpage splash "Show a splash screen during application launch"

\li \subpage singleinstance "Ensure that only one instance of the application is running"

\li \subpage starting "Starting applauncherd"

\li \subpage security "Platform security"

\li \subpage dependencies "Package Dependencies"

\li \subpage knownissues "Current known issues"

\li \subpage otherboosters "Other boosters"

\li \subpage commandlineparams "Command line parameters"

\li \subpage moreinformation "More information"

For details of how to use MComponentCache and how to enable it in your
application, please refer to the MeeGo Touch documentation.

\page technical Technical overview

In Harmattan, the applauncherd daemon is started by UpStart as part of
XSession, that is, at the same level as the desktop (MeeGo Touch
homescreen). In MeeGo, applaucherd is started by uxlaunch which is the
program that brings up X and the ui.

Applauncherd forks will-be-application processes, "boosters", before knowing
which application is going to be launched next. Different boosters are
optimized for different kinds of applications, e.g. Qt, Meego Touch, Qt
Declarative.  Boosters are loaded as plugins. Applauncherd searches for plugin
libraries in /usr/lib/applaucherd/lib*booster.so and forks a new process for
each booster to wait for launch commands from the user.

The user uses the launcher always through a special invoker program. The
invoker (/usr/bin/invoker) uses a socket connection to tell a booster process
to load an application binary.

In addition to possible source code changes, an application which is to be used
with applauncherd must be compiled as a shared library or a position
independent executable (-pie) and it must always export main().


\section techdetails Technical details

Before loading an application binary, a booster process changes its security
credentials so that the code in the application binary will be executed with
the correct credentials. The process also sets environment variables to the
values sent by the invoker. Loading the binary is done with dlopen(), and
therefore the application needs to be compiled and linked as a shared library
or a position independent executable. Finally, the booster process finds the
main function in the application binary with dlsym() and calls the main() with
the command line arguments given by the invoker.

The launcher itself is a library that is loaded by a small C-program (/usr/bin/applauncherd.bin).
The idea behind this is to avoid linking the launcher binary to any
libraries. This gives full control over the flags with which the preloaded
libraries are opened with dlopen(). 

In Harmattan, Aegis platform security is used to protect the socket connection
between the invoker and boosters. This works only for ARM target. It is
automatically disabled by the build scripts when compiling on x86.

Each application type (currently Qt, Qt Declarative and MeeGo Touch) has its own booster process.
When booster launches the application by calling the "main()" function,
applauncherd will create new booster process of that type.

Booster processes do some initializations that cannot be shared among other
processes and therefore have to be done after forking. This allows, for instance,
instantiating an MApplication (QApplication) before knowing the name of the
application. Then the booster process waits for a connection from the invoker with
the information about which application should be launched. 

With MeeGo Touch booster and Qt Declarative booster, applications can fetch certain objects from a cache. 
This will significantly reduce the startup time of an application. 

\page compilinglinking Compiling and linking you application

Binaries intended to be run with applauncherd should be compiled with -fPIC option
to produce position independent code. In order to produce a position independent
executable, -pie option and -rdynamic options can be used in linking. This allows
the result to be executed both traditionally and with the launcher.

To improve linking and loading times of shared object libraries the size of dynamic
export table it is encouraged to hide the unnecessary symbols from the resulting
binary by using -fvisibility=hidden and -fvisibility-inlines-hidden flags as well.

\section changestocode Changes to the code

With -fvisibility=hidden you must make sure that the symbol for main() is
exported, because otherwise the launcher is not able to find the entry point
for your application. This can be done like this (MeeGo Touch):

\code
  #include <MExport>

  M_EXPORT int main(int argc, char **argv)
  {
  ...
  }
\endcode

or like this (Qt):

\code
  #include <QtCore/QtGlobal>
  
  Q_DECL_EXPORT int main(int argc, char **argv)
  {
  ...
  }
\endcode

or like this (generic way with gcc):

\code
  extern "C" __attribute__ ((__visibility__("default"))) int main(int argc, char **argv)
  {
  ...
  }
\endcode

\section buildconfiguration Build configuration

These instructions describe how to build your application so that it
can be launched using applauncherd. Only Debian packaging is considered,
you have to creatively apply the instructions if you are doing RPM packaging.

\li \subpage usingqmake "Using QMake"
\li \subpage usingcmake "Using cmake"
\li \subpage usingpkgconfig "Using pkg-config"

\page usingqmake  Using QMake

  If you are using QMake, making your application boostable is just a
  matter of adding a suitable configuration option.

  For MeeGo Touch applications, install the libmeegotouch-dev package. If you
  are creating Debian packages, your application must build-depend on
  libmeegotouch-dev to build correctly. Add the following line in your .pro
  file (the meegotouch-boostable configuration option includes the meegotouch
  option so you should not specify it explicitly):

\verbatim
    CONFIG += meegotouch-boostable
\endverbatim

  For Qt Declarative (QML) applications, and plain Qt applications, the configuration 
  option is provided by the applauncherd-dev package. Again, a build dependency is 
  required for correct building of Debian packages. The configuration options are:

\verbatim
    CONFIG += qdeclarative-boostable
\endverbatim
\verbatim
    CONFIG += qt-boostable
\endverbatim

  If you want to use pkg-config directly for some reason (like getting
  error messages), you can add explicit pkg-config calls in the appropriate
  flags. 

  For MeeGo Touch, the flags are:

\verbatim
    QMAKE_CXXFLAGS += `pkg-config --cflags meegotouch-boostable`
    QMAKE_LFLAGS += `pkg-config --libs meegotouch-boostable`
\endverbatim

  For Qt Declarative, the flags are:

\verbatim
    QMAKE_CXXFLAGS += `pkg-config --cflags qdeclarative-boostable`
    QMAKE_LFLAGS += `pkg-config --libs qdeclarative-boostable`
\endverbatim

  For plain Qt, the flags are:

\verbatim
    QMAKE_CXXFLAGS += `pkg-config --cflags qt-boostable`
    QMAKE_LFLAGS += `pkg-config --libs qt-boostable`
\endverbatim

  You can also manually set the options in your .pro file like this:

\verbatim
    QMAKE_CXXFLAGS += -fPIC -fvisibility=hidden -fvisibility-inlines-hidden
    QMAKE_LFLAGS += -pie -rdynamic
\endverbatim

  Note that in this case you have to update the flags manually if there are any
  changes in the required flags.

\page usingcmake Using CMake

  You can utilize pkg-config in CMake by including FindPkgConfig in CMakeLists.txt:

\verbatim
  include(FindPkgConfig) 
\endverbatim

  To get Debian packages built correctly, make the package build-depend on libmeegotouch-dev 
  for MeeGo Touch applications, and on applauncherd-dev for other cases. To obtain the 
  compiler and linker flags, add the following lines in CMakeLists.txt.

  For MeeGo Touch applications:

\verbatim
  pkg_check_modules(MEEGOTOUCH_BOOSTABLE REQUIRED meegotouch-boostable)
  add_definitions(${MEEGOTOUCH_BOOSTABLE_CFLAGS})
  link_libraries(${MEEGOTOUCH_BOOSTABLE_LDFLAGS})
\endverbatim

  For Qt Declarative applications:

\verbatim
  pkg_check_modules(QDECLARATIVE_BOOSTABLE REQUIRED qdeclarative-boostable)
  add_definitions(${QDECLARATIVE_BOOSTABLE_CFLAGS})
  link_libraries(${QDECLARATIVE_BOOSTABLE_LDFLAGS})
\endverbatim

  For plain Qt applications:

\verbatim
  pkg_check_modules(QT_BOOSTABLE REQUIRED qt-boostable)
  add_definitions(${QT_BOOSTABLE_CFLAGS})
  link_libraries(${QT_BOOSTABLE_LDFLAGS})
\endverbatim
  
  If you do not want to use pkg-config for some reason, you can manually add the
  compiler and linker flags like this:

\verbatim
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -fvisibility=hidden -fvisibility-inlines-hidden")
  set(CMAKE_EXE_LINKER_FLAGS "-pie -rdynamic")
\endverbatim
  
  Again, this requires you to update the flags if something changes.

\page usingpkgconfig Automatic settings with pkg-config (any build system)

  To get Debian packages built correctly, make the package build-depend on libmeegotouch-dev 
  for MeeGo Touch applications, and on applauncherd-dev for other cases. The correct 
  flags can be automatically obtained with one of:

\verbatim
    pkg-config --cflags meegotouch-boostable
    pkg-config --libs meegotouch-boostable
\endverbatim

\verbatim
    pkg-config --cflags qdeclarative-boostable
    pkg-config --libs qdeclarative-boostable
\endverbatim

\verbatim
    pkg-config --cflags qt-boostable
    pkg-config --libs qt-boostable
\endverbatim

\page invoker Launching your application using invoker

The application to be launched must be "invoked" using the invoker executable.
Invoker then sends the application data, essentially arguments and environment, 
to the launcher daemon via a socket connection. The launched application will
see its real binary name in its argv[0].

The invoker can also provide

\li \subpage splash "A splash screen"

\li \subpage singleinstance "Single instance behavior"

\section commandline Launch from the command-line

Use one of the following invoker options to identify what kind of application
you are launching. In these examples --type=m is used.

   \li \c --type=m           MeeGo Touch applications
   \li \c --type=d           Qt Declarative applications
   \li \c --type=qt          Qt applications and everything else (see section 7). 

Here is a launch example for a MeeGo Touch application:

\verbatim
  /usr/bin/invoker --type=m <application_name>
\endverbatim

\section dbus D-Bus launch

If you are using D-Bus to launch your application, it can be done
straightly in the .service-file and without any wrapper scripts slowing
things down:

\verbatim
  [D-BUS Service]
  Name=com.nokia.<application_name>
  Exec=/usr/bin/invoker --type=m /usr/bin/<application_name>
\endverbatim

By default, invoker waits for the application to terminate and exits with
the same exit code. Unix signals are also forwarded.
  
Note 1: If --no-wait and --delay is used, it is important to add enough delay to
invoker so that it won't exit before the launched application gets its
(possible) D-Bus service registered. Otherwise D-Bus daemon may think that the
application just died. 

Note 2: There is a slight difference in the application start-up time if you use a
wrapper script instead of the actual binary in Exec-field of .desktop and .service files. 
Therefore, it is recommended that you always use the actual invoker call with the 
binary name as presented above. 

Note 3: When .desktop file contains the X-Maemo-Service field, the application
is started by default through D-Bus. This might cause some delay for
application start-up time. Therefore for simple applications that do not
provide D-Bus services, it is not recommended to have the X-Maemo-Service field
inside .desktop. Singe instance launch should be used instead (see below).

See invoker --help for all possible command-line parameters.

\page singleinstance Single instance launch

Usually user wants his application to be run as a single instance. This means,
that if the launched application is already running, the existing application
window is activated and no new application processes are started.

This can be achieved by adding --single-instance to the invoker command:

\verbatim
  [D-BUS Service]
  Name=com.nokia.<application_name>
  Exec=/usr/bin/invoker --single-instance --type=m /usr/bin/<application_name>
\endverbatim

As a result, a lock file 
\c /tmp/single-instance-locks/\<application_name\>/instance.lock is created. 
If applauncherd cannot acquire the lock, it tries to find the corresponding
window and activates it.

This functionality is implemented in a position-independent executable called
single-instance. Applauncherd uses this executable as a library, but it can be
used as an ordinary program to start anything as a single instance:

\verbatim
  /usr/bin/single-instance <application_name>
\endverbatim

Note, that in this case the launcher is not used.

Consider using --single-instance instead of the single instance functionality
provided by D-Bus, because it very likely is much faster.

\page splash Splash screen

Applauncherd supports showing a splash screen if there is mcompositor
(the MeeGo window manager) running.

The splash screen is not shown by default. If an application wants it
to be shown, it must pass --splash, and optionally --splash-landscape
arguments to the invoker.

For instance,

\verbatim
/usr/bin/invoker --splash=/usr/share/application_name/splash.jpg --splash-landscape=/usr/share/application_name/splash-l.jpg --type=m /usr/bin/application_name
\endverbatim

shows the splash screen with splash.jpg as its content when the device
is in the portrait orientation. Otherwise splash-l.jpg is shown. If
only --splash is given, that image is shown in both orientations.

Invoker passes the splash request to the booster. The booster sends
the splash request to the window manager by setting a window property
to window manager's window.

If the filenames do not include absolute paths, the window manager
looks for the files from a default location.
 
\page usingboosters Using boosters

The booster processes can speed up application startup by doing some
application independent initialization beforehand. This section
documents the use of the qdeclarativebooster (QML booster), see the MeeGo Touch
documentation for boosting MeeGo Touch applications similarly.

\section changesqml Changes to code with QML booster

The application cannot directly instantiate QApplication and
QDeclarativeView. Instead of writing e.g.

\verbatim
      QApplication app;
      QDeclarativeView view;
\endverbatim

you need to pick up instances of QApplication and QDeclarativeView from a cache:

\verbatim
     QApplication *app = MDeclarativeCache::qApplication(argc, argv);
     QDeclarativeView *window = MDeclarativeCache::qDeclarativeView();
\endverbatim

See the MDeclarativeCache documentation for details.

\page starting Starting applauncherd

Applauncherd is usually started by UpStart (Harmattan) or uxlaunch (MeeGo) at boot,
but it can be also started manually in scratchbox or in the device by the /usr/bin/applauncherd
script. Applauncherd does not daemonize itself by default. If daemonizing is
wanted, use --daemon command-line parameter.

\section bootmode Boot mode

There is a special boot mode that can be used to speed up device boots when
applauncherd is used. 

In boot mode, no booster caches are initialized and the booster respawn delay is 
set to zero to ensure quick booster restarts after launches.

The boot mode is activated by starting applauncherd with --boot-mode. Normal mode
can be entered again by sending SIGUSR1 Unix signal to the launcher.

Boot mode can be activated also by sending SIGUSR2 Unix signal to the launcher.

\section debuginfo Debug info

Applauncherd logs to syslog.
Additional debug messages and logging also to stdout can be enabled with --debug.


\page security Platform security (Aegis)

If your application does not have an Aegis manifest file, no actions are required.

All security tokens requested for the application must be requested also for 
applauncherd.bin in the application's Aegis manifest file.


\page dependencies Package Dependencies

Applications using the launcher must depend on the applauncherd package.

\page knownissues Current known issues

\section forking Forking

It's not possible to use MComponentCache or MDeclarativeCache in the child
process if you fork() in your application. This is just due to the fact that
X11 connections get messed up after fork().

\section crashes Crashes after application's main()

If an application is launched with invoker, there may be some
destructors of MeeGo Touch classes executed after application's
main(). This can cause crashes, if the application has installed a
custom debug message handler and didn't uninstall it before exit.


\page otherboosters Other boosters

Warning: behavior of these boosters is subject to change.

Qt booster is a no-operation booster. It can be used by calling 
invoker --type=qt. Qt booster requires only that main() is exported
with M_EXPORT (or Q_DECL_EXPORT).
Any MeeGo Touch boostable application can be launched with this booster 
type as well, but it results in a slower start-up because of empty cache.


\page commandlineparams Command line parameters

All parameters are listed by:

\verbatim
invoker --help
\endverbatim

\verbatim
applauncherd --help
\endverbatim

\page moreinformation More information

See MeeGo Touch documentation for fast application startup.
*/