KEMBAR78
Targeting Android with Qt | PDF
Targeting Android with Qt
 Espen Riskedal / cutehacks.com
          @snowpong
Introduction



        About me,
    and about the talk.
About me


●
    Trolltech and Nokia
●
    Symbian and Windows CE
●
    Co-founded cutehacks.com         Espen Riskedal
                                      @snowpong
●
    Still believe in Qt Everywhere
We make apps
Purpose of this talk


“Teach you how to publish Qt
 apps in the Android market”
      I have a vested interest.
Agenda


●
    Introduction
●
    Qt on mobile platforms
●
    Necessitas
●
    Publishing to Android Market
●
    Conclusion
2.3.x “Gingerbread”
         ●
           Google Nexus S
         ●
           December 2010
         ●
           Linux kernel 2.6.35




Photo: flickr.com/quinnanya/
 CC / Some rights reserved
Qt on mobile platforms



A brief introduction on which
mobile platforms you can target
with Qt.
Today's mobile platforms
Supported by Qt
Almost supported by Qt
Some Android details


●
    4 major releases
●
    ARM and x86
●
    Linux
●
    Dalvik
Well known models




Galaxy S2    Tab 10.1     Xperia Play
Android API levels

Platform version      API Level VERSION_CODE
...                   ...     ...
Android 2.3 – 2.3.2   9       GINGERBREAD
...                   ...     ...
Android 2.1.x         7       ECLAIR_MR
...                   ...     ...
Android 1.5           3       CUPCAKE
...                   ...     ...
Android platform distribution




 http://developer.android.com/resources/dashboard/platform-versions.html
A possible future for Qt
Photo: flickr.com/quinnanya/
 CC / Some rights reserved




                               1.6 “Donut”
                                ●
                                  Acer Liquid A1
                                ●
                                  September 2009
                                ●
                                  Linux kernel 2.6.29
Necessitas



Necessitas is a community port
of Qt for Android. Its founder
and main developer is BogDan
Vatra.
Installing Necessitas


●
    OpenJDK (and Ant)
●
    Necessitas 0.3 (3rd alpha)

                    http://bit.ly/qtand03
     ●
         Linux
     ●
         not root
Default values are OK
Included components


Android SDK
Android NDK
Qt, QtWebKit, QtMobility
Qt Creator
gdb / gdbserver
Ant
JDK
Adding an emulator
Getting a USB connection
●
    Enable USB debugging
    ●
        Settings->Applications->Development


●
    Check connection
        cd android-sdk/platform-tools
        ./adb devices

        304D1...6203B05E       device
        ????????????????       no permissions


●
    Restart if needed
        sudo ./adb kill-server
        sudo ./adb devices
Install Ministro / Ministro 2
A “Hello Qt Quick” example

●
    Qt Quick Project → Qt Quick Application
     ●
         Name
     ●
         Target (Android / armv5)
     ●
         Next/Next/Next
●
    Add QtDeclarative
●
    Press Ctrl-R
Let's do it for real
Our “funky” main.qml
import QtQuick 1.0

Rectangle {
    anchors.fill: parent
    gradient: Gradient {
       GradientStop { position: 0.0; color: "red" }
       GradientStop { position: 0.33; color: "yellow" }
       GradientStop { position: 1.0; color: "green" }
    }
    Rectangle {
        id:ball;
        width:100;
        height:100;
        radius: 50
        color:"black"
        Behavior on x { PropertyAnimation{ duration:500; easing.type: Easing.OutBounce} }
        Behavior on y { PropertyAnimation{ duration:500; easing.type: Easing.OutBounce} }
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            ball.x=mouse.x
            ball.y=mouse.y
        }
    }
}
Psychedelic bouncy ball
Added files explained


In addition to the .pro and .h/.cpp files:
android/AndroidManifest.xml
android/build.xml
android/res/*
android/src/.../ministro/*
android/src/.../origo/Qt*
How does it really work?
Necessitas status

●
    SDK (almost) complete for
     ●
         Windows, Linux and Mac
●
    Qt Creator
     ●
         Deploy libraries and app
     ●
         Run app
     ●
         Debug app
     ●
         Signs the app
Popularity of Necessitas


●
    ~10000 downloads of 0.2.1 (2nd alpha)

●
    ~3200 downloads of 0.3 so far (3rd alpha)

●
    ~5000 views of my Münich slides
Necessitas roadmap
●
  Alpha3 (just released!)
    ●
      Lots of fixes
    ●
      Signing for Android Market
    ●
      OpenGL etc.
    ●
      ...
●
  Alpha4
    ●
      Android Style
    ●
      Menu integration
    ●
      ...
●
  Beta
    ●
      Refactor Java wrapper code
    ●
      Promise BIC
    ●
      …?
Porting an actual app




Nokia N9 / Nokia 700
                       Samsung Galaxy S2
Changes needed


●
    Use the right QML file and showFullScreen()
●
    Hack around font issue
●
    Add app icons
●
    Set package name
●
    Set minSdkVersion
QML and showFullScr...

--- a/main.cpp
+++ b/main.cpp
@@ -50,14 +56,16 @@ int main(int argc, char *argv[])


-#elif defined (Q_OS_SYMBIAN)
+#elif defined (Q_OS_ANDROID) || defined(Q_OS_SYMBIAN)
  view.setSource(QUrl("qrc:/qml/Main.qml"));
  view.showFullScreen();
#else
Font hack
--- a/main.cpp
+++ b/main.cpp
@@ -29,6 +29,12 @@ int main(int argc, char *argv[])
    application.setOrganizationDomain("cutehacks.com");
    application.setOrganizationName("Cutehacks");


+#if defined(Q_OS_ANDROID)
+   QFont boldFont = application.font();
+   boldFont.setBold(true);
+   application.setFont(boldFont);
+#endif
Setting app icons

commit a91fa2461ced0e75270b71c41ee80309e0697777
Author: Espen Riskedal <espen@cutehacks.com>
Date:   Sun Oct 9 22:17:31 2011 +0200


   added proper icons where it counts


android/res/drawable-hdpi/icon.png
android/res/drawable-ldpi/icon.png
android/res/drawable-mdpi/icon.png
Setting package name


--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
-<manifest package="eu.licentia.necessitas...
+<manifest package="com.cutehacks.fly" ...
Setting minSdkVersion

--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -14,4 +14,5 @@
    <supports-screens android:largeScreens="t...
    <uses-permission android:name="android.pe...
    <uses-permission android:name="android.pe...
+   <uses-sdk android:minSdkVersion="7"/>
</manifest>
3.x “Honeycomb”
 ●
   Motorola Xoom
 ●
   February 2011
 ●
   Linux kernel 2.6.36



                         Photo: flickr.com/quinnanya/
                          CC / Some rights reserved
Publishing to Android Market



Sometimes the easy part is
writing the app. The hard part is
getting it published.
.APK format explained

●
  .JAR and .ZIP
●
  Typically includes:
      META-INF/
      res/
      AndroidManifest.xml
      classes.dex
      resources.arsc
●
  Native apps also include:
      libs/armeabi/
Two publishing options

Ministro              Bundling Qt
+ dev friendly        + UX
+ updates             + BIC
+ multiple archs      + custom fixes
+ space / bandwidth   - space / bandwidth
- UX                  - less archs
- updates             - no updates
- BIC
Bundling Qt with your app

Target one arch (ARMv5)
Set relatively high API level
Only include the actually needed libs
Disable Ministro dependencies
Beware of SSL certs
Here be dragons :-)
Publishing with Ministro


            cd android/
            ant release


This produces Fly-unsigned.apk in the
        shadowbuild directory.
Getting an A.M. account


  http://market.android.com/publish

              You'll need:


      A credit card with 25USD

          A phone number
Name, email and phone
Paying
Credit-card needed
One time fee of 25USD
Order sent
Distribution agreement
We can publish free apps!
Sign up for merchant
We can make money!
Signing the .APK

Create key
keytool -genkey -v -keystore cutehacks-
release-key.keystore -alias cutehackskeystore
-keyalg RSA -keysize 2048 -validity 10000


Sign package
jarsigner -verbose -keystore cutehacks-
release-key.keystore android/bin/Fly-
unsigned.apk cutehackskeystore
Verifying the signature

Verify signature
jarsigner -verify -verbose Fly-unsigned.apk
           585 Tue ... META-INF/MANIFEST.MF
           706 Tue ... META-INF/CUTEHACK.SF
          1327 Tue ... META-INF/CUTEHACK.RSA
sm        2932 Tue ... AndroidManifest.xml
sm        1500 Tue ... resources.arsc
sm        3064 Tue ... res/drawable-hdpi/icon.png
sm        1543 Tue ... res/drawable-ldpi/icon.png
sm        2347 Tue ... res/drawable-mdpi/icon.png
sm       86680 Tue ... classes.dex
sm      164020 Tue ... lib/armeabi/libfly.so
 s   = signature was verified m = entry is listed in manifest


Rename Fly-unsigned.apk to Fly-release.apk
Actually publishing
  http://market.android.com/publish

              You'll need:


      Signed APK (max 50MB)

    High-res app icon (512x512)

  Two screenshots (min 320x480)

         Title & Description
Upload .APK
Set name and screenshots
In the store
Installation UX with Ministro




Press app




            Press “FREE”



                           Press “OK”
Installation UX with Ministro



Press app


            Press “Yes”




                          Press “Ministro”
Installation UX with Ministro




Press “Install”

                  Press “Accept”


                                   Press “Yes”
Installation UX with Ministro
2.0/2.1 “Eclair”
                                ●
                                  Motorola Droid
                                ●
                                  October 2009
                                ●
                                  Linux kernel 2.6.29


Photo: flickr.com/quinnanya/
 CC / Some rights reserved
Conclusion



Let's summarize and look at the
           future.
Summary



Qt on mobile: Potential bright future
Necessitas: Out-of-the-box with rough edges
Android Market: Quick and easy
Qt's future



Qt 5 – Qt Quick and scenegraph
“The next billion”
iOS and BBX
Open Governance
Information on Necessitas
Mailinglist for users:
http://groups.google.com/group/android-qt

Mailinglist for devs/contributors:
https://mail.kde.org/mailman/listinfo/necessitas-devel

Repositories:
http://community.kde.org/Necessitas/Repositories

Wiki:
http://sourceforge.net/p/necessitas/home/necessitas/
It's already possible




        Fly in                                               Fly installed
    Android Market                                            on phone


               http://bit.ly/cutefly
             https://market.android.com/details?id=com.cutehacks.fly
Questions?



       Thank you!
     @snowpong (Twitter)

Targeting Android with Qt

  • 1.
    Targeting Android withQt Espen Riskedal / cutehacks.com @snowpong
  • 2.
    Introduction About me, and about the talk.
  • 3.
    About me ● Trolltech and Nokia ● Symbian and Windows CE ● Co-founded cutehacks.com Espen Riskedal @snowpong ● Still believe in Qt Everywhere
  • 4.
  • 5.
    Purpose of thistalk “Teach you how to publish Qt apps in the Android market” I have a vested interest.
  • 6.
    Agenda ● Introduction ● Qt on mobile platforms ● Necessitas ● Publishing to Android Market ● Conclusion
  • 7.
    2.3.x “Gingerbread” ● Google Nexus S ● December 2010 ● Linux kernel 2.6.35 Photo: flickr.com/quinnanya/ CC / Some rights reserved
  • 8.
    Qt on mobileplatforms A brief introduction on which mobile platforms you can target with Qt.
  • 9.
  • 10.
  • 11.
  • 12.
    Some Android details ● 4 major releases ● ARM and x86 ● Linux ● Dalvik
  • 13.
    Well known models GalaxyS2 Tab 10.1 Xperia Play
  • 14.
    Android API levels Platformversion API Level VERSION_CODE ... ... ... Android 2.3 – 2.3.2 9 GINGERBREAD ... ... ... Android 2.1.x 7 ECLAIR_MR ... ... ... Android 1.5 3 CUPCAKE ... ... ...
  • 15.
    Android platform distribution http://developer.android.com/resources/dashboard/platform-versions.html
  • 16.
  • 17.
    Photo: flickr.com/quinnanya/ CC/ Some rights reserved 1.6 “Donut” ● Acer Liquid A1 ● September 2009 ● Linux kernel 2.6.29
  • 18.
    Necessitas Necessitas is acommunity port of Qt for Android. Its founder and main developer is BogDan Vatra.
  • 19.
    Installing Necessitas ● OpenJDK (and Ant) ● Necessitas 0.3 (3rd alpha) http://bit.ly/qtand03 ● Linux ● not root
  • 20.
  • 21.
    Included components Android SDK AndroidNDK Qt, QtWebKit, QtMobility Qt Creator gdb / gdbserver Ant JDK
  • 22.
  • 23.
    Getting a USBconnection ● Enable USB debugging ● Settings->Applications->Development ● Check connection cd android-sdk/platform-tools ./adb devices 304D1...6203B05E device ???????????????? no permissions ● Restart if needed sudo ./adb kill-server sudo ./adb devices
  • 24.
  • 25.
    A “Hello QtQuick” example ● Qt Quick Project → Qt Quick Application ● Name ● Target (Android / armv5) ● Next/Next/Next ● Add QtDeclarative ● Press Ctrl-R
  • 26.
    Let's do itfor real
  • 27.
    Our “funky” main.qml importQtQuick 1.0 Rectangle { anchors.fill: parent gradient: Gradient { GradientStop { position: 0.0; color: "red" } GradientStop { position: 0.33; color: "yellow" } GradientStop { position: 1.0; color: "green" } } Rectangle { id:ball; width:100; height:100; radius: 50 color:"black" Behavior on x { PropertyAnimation{ duration:500; easing.type: Easing.OutBounce} } Behavior on y { PropertyAnimation{ duration:500; easing.type: Easing.OutBounce} } } MouseArea { anchors.fill: parent onClicked: { ball.x=mouse.x ball.y=mouse.y } } }
  • 28.
  • 29.
    Added files explained Inaddition to the .pro and .h/.cpp files: android/AndroidManifest.xml android/build.xml android/res/* android/src/.../ministro/* android/src/.../origo/Qt*
  • 30.
    How does itreally work?
  • 31.
    Necessitas status ● SDK (almost) complete for ● Windows, Linux and Mac ● Qt Creator ● Deploy libraries and app ● Run app ● Debug app ● Signs the app
  • 32.
    Popularity of Necessitas ● ~10000 downloads of 0.2.1 (2nd alpha) ● ~3200 downloads of 0.3 so far (3rd alpha) ● ~5000 views of my Münich slides
  • 33.
    Necessitas roadmap ● Alpha3 (just released!) ● Lots of fixes ● Signing for Android Market ● OpenGL etc. ● ... ● Alpha4 ● Android Style ● Menu integration ● ... ● Beta ● Refactor Java wrapper code ● Promise BIC ● …?
  • 34.
    Porting an actualapp Nokia N9 / Nokia 700 Samsung Galaxy S2
  • 35.
    Changes needed ● Use the right QML file and showFullScreen() ● Hack around font issue ● Add app icons ● Set package name ● Set minSdkVersion
  • 36.
    QML and showFullScr... ---a/main.cpp +++ b/main.cpp @@ -50,14 +56,16 @@ int main(int argc, char *argv[]) -#elif defined (Q_OS_SYMBIAN) +#elif defined (Q_OS_ANDROID) || defined(Q_OS_SYMBIAN) view.setSource(QUrl("qrc:/qml/Main.qml")); view.showFullScreen(); #else
  • 37.
    Font hack --- a/main.cpp +++b/main.cpp @@ -29,6 +29,12 @@ int main(int argc, char *argv[]) application.setOrganizationDomain("cutehacks.com"); application.setOrganizationName("Cutehacks"); +#if defined(Q_OS_ANDROID) + QFont boldFont = application.font(); + boldFont.setBold(true); + application.setFont(boldFont); +#endif
  • 38.
    Setting app icons commita91fa2461ced0e75270b71c41ee80309e0697777 Author: Espen Riskedal <espen@cutehacks.com> Date: Sun Oct 9 22:17:31 2011 +0200 added proper icons where it counts android/res/drawable-hdpi/icon.png android/res/drawable-ldpi/icon.png android/res/drawable-mdpi/icon.png
  • 39.
    Setting package name ---a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,5 +1,5 @@ <?xml version='1.0' encoding='utf-8'?> -<manifest package="eu.licentia.necessitas... +<manifest package="com.cutehacks.fly" ...
  • 40.
    Setting minSdkVersion --- a/android/AndroidManifest.xml +++b/android/AndroidManifest.xml @@ -14,4 +14,5 @@ <supports-screens android:largeScreens="t... <uses-permission android:name="android.pe... <uses-permission android:name="android.pe... + <uses-sdk android:minSdkVersion="7"/> </manifest>
  • 41.
    3.x “Honeycomb” ● Motorola Xoom ● February 2011 ● Linux kernel 2.6.36 Photo: flickr.com/quinnanya/ CC / Some rights reserved
  • 42.
    Publishing to AndroidMarket Sometimes the easy part is writing the app. The hard part is getting it published.
  • 43.
    .APK format explained ● .JAR and .ZIP ● Typically includes: META-INF/ res/ AndroidManifest.xml classes.dex resources.arsc ● Native apps also include: libs/armeabi/
  • 44.
    Two publishing options Ministro Bundling Qt + dev friendly + UX + updates + BIC + multiple archs + custom fixes + space / bandwidth - space / bandwidth - UX - less archs - updates - no updates - BIC
  • 45.
    Bundling Qt withyour app Target one arch (ARMv5) Set relatively high API level Only include the actually needed libs Disable Ministro dependencies Beware of SSL certs Here be dragons :-)
  • 46.
    Publishing with Ministro cd android/ ant release This produces Fly-unsigned.apk in the shadowbuild directory.
  • 47.
    Getting an A.M.account http://market.android.com/publish You'll need: A credit card with 25USD A phone number
  • 48.
  • 49.
  • 50.
  • 51.
    One time feeof 25USD
  • 52.
  • 53.
  • 54.
    We can publishfree apps!
  • 55.
    Sign up formerchant
  • 56.
  • 57.
    Signing the .APK Createkey keytool -genkey -v -keystore cutehacks- release-key.keystore -alias cutehackskeystore -keyalg RSA -keysize 2048 -validity 10000 Sign package jarsigner -verbose -keystore cutehacks- release-key.keystore android/bin/Fly- unsigned.apk cutehackskeystore
  • 58.
    Verifying the signature Verifysignature jarsigner -verify -verbose Fly-unsigned.apk 585 Tue ... META-INF/MANIFEST.MF 706 Tue ... META-INF/CUTEHACK.SF 1327 Tue ... META-INF/CUTEHACK.RSA sm 2932 Tue ... AndroidManifest.xml sm 1500 Tue ... resources.arsc sm 3064 Tue ... res/drawable-hdpi/icon.png sm 1543 Tue ... res/drawable-ldpi/icon.png sm 2347 Tue ... res/drawable-mdpi/icon.png sm 86680 Tue ... classes.dex sm 164020 Tue ... lib/armeabi/libfly.so s = signature was verified m = entry is listed in manifest Rename Fly-unsigned.apk to Fly-release.apk
  • 59.
    Actually publishing http://market.android.com/publish You'll need: Signed APK (max 50MB) High-res app icon (512x512) Two screenshots (min 320x480) Title & Description
  • 60.
  • 61.
    Set name andscreenshots
  • 62.
  • 63.
    Installation UX withMinistro Press app Press “FREE” Press “OK”
  • 64.
    Installation UX withMinistro Press app Press “Yes” Press “Ministro”
  • 65.
    Installation UX withMinistro Press “Install” Press “Accept” Press “Yes”
  • 66.
  • 67.
    2.0/2.1 “Eclair” ● Motorola Droid ● October 2009 ● Linux kernel 2.6.29 Photo: flickr.com/quinnanya/ CC / Some rights reserved
  • 68.
    Conclusion Let's summarize andlook at the future.
  • 69.
    Summary Qt on mobile:Potential bright future Necessitas: Out-of-the-box with rough edges Android Market: Quick and easy
  • 70.
    Qt's future Qt 5– Qt Quick and scenegraph “The next billion” iOS and BBX Open Governance
  • 71.
    Information on Necessitas Mailinglistfor users: http://groups.google.com/group/android-qt Mailinglist for devs/contributors: https://mail.kde.org/mailman/listinfo/necessitas-devel Repositories: http://community.kde.org/Necessitas/Repositories Wiki: http://sourceforge.net/p/necessitas/home/necessitas/
  • 72.
    It's already possible Fly in Fly installed Android Market on phone http://bit.ly/cutefly https://market.android.com/details?id=com.cutehacks.fly
  • 73.
    Questions? Thank you! @snowpong (Twitter)

Editor's Notes

  • #13 First released in Septemper 2008 together with HTC Dream phone
  • #15 First released in Septemper 2008 together with HTC Dream phone
  • #16 First released in Septemper 2008 together with HTC Dream phone