Android

Page last edited 1 417 giorni 12 ore fa
Da wiki.betaingegneria.it.

Introduzione[modifica]

Il popolare sistema operativo per dispositivi piccoli (tablet, netbook, smartphone).

Per sviluppare applicazioni per Android si usa (si può usare) Eclipse. Ho già installato il plugin per Eclipse. In ogni caso le istruzioni e i link alle risorse necessarie (JDK, Plugin etc) sono qui oppure qui

Seguo questo corso.

Armamentario necessario[modifica]

In questo sito di sviluppo Android trovo un po di cose. Nei system requirements trovo:

Operating Systems

  • Windows XP (32-bit), Vista (32- or 64-bit), or Windows 7 (32- or 64-bit)
  • Mac OS X 10.5.8 or later (x86 only)
  • Linux (tested on Ubuntu Linux, Lucid Lynx)
    • GNU C Library (glibc) 2.7 or later is required.
    • On Ubuntu Linux, version 8.04 or later is required. (ci siamo)
    • 64-bit distributions must be capable of running 32-bit applications.

Running 32-bit application on 64-bit environment.[modifica]

Prendo spunto da questo forum. Dice di usare questo programma:

  ia32-libs

Per sapere se ce l'ho installato uso apt_cache.

ho glibc a bordo?[modifica]

  root@jsbach:~# apt-cache show glibc
  N: Impossibile trovare il pacchetto glibc
  E: Nessun pacchetto trovato
  root@jsbach:~# 

No :-( Minchia! pensavo di averlo. Lo installo

  root@jsbach:~# apt-get install glibc

Questo pacchetto non esiste :-( Ma come???

  # apt-cache search glibc
  
  glibc-doc - Embedded GNU C Library: Documentation
  kmtrace - memory leak tracer
  libbsd-dev - utility functions from BSD systems - development files
  libmono-posix4.0-cil - Mono.Posix library (for CLI 4.0)
  libnss-ldap - NSS module for using LDAP as a naming service
  libnss-mdns - NSS module for Multicast DNS name resolution
  linux-libc-dev - Linux Kernel Headers for development
  libc6 - libreria C GNU embedded: librerie condivise
  libc6-pic - libreria GNU C embedded: libreria archivio PIC
  libggz-dev - GGZ Gaming Zone: common utilities library - development files
  libggz2 - GGZ Gaming Zone: common utilities library
  libmono-posix2.0-cil - Mono.Posix library (for CLI 2.0)
  manpages-dev - pagine man su come usare GNU/Linux per lo sviluppo
  clisp-module-bindings-glibc - clisp module that adds the glibc bindings
  eglibc-source - Embedded GNU C Library: sources
  fakeroot-ng - Gives a fake root environment
  latrace - traces library calls in dynamically linked programs
  lib32nss-mdns - NSS module for Multicast DNS name resolution (32-bits version)
  libc6-armel-cross - Embedded GNU C Library: Shared libraries (for cross-compiling)
  libc6-armhf-cross - Embedded GNU C Library: Shared libraries (for cross-compiling)
  libgetopt-java-doc - GNU getopt - Java port (doc)
  libnss-pgsql2 - NSS module for using PostgreSQL as a naming service
  libowfat-dev - Reimplementation of libdjb, development files
  libowfat0 - Reimplementation of libdjb, shared library
  libpurelibc-dev - Development files for the purelibc library
  libpurelibc1 - libc+syscalls to libc-only wrapper for libc functions
  linux-libc-dev-armel-cross - Linux Kernel Headers for development (for cross-compiling)
  linux-libc-dev-armhf-cross - Linux Kernel Headers for development (for cross-compiling)
  perdition-ldap - Library to allow perdition to access LDAP based popmaps
  perdition-postgresql - Library to allow perdition to access PostgreSQL based popmaps
  unscd - Micro Name Service Caching Daemon
  winbind4 - service to resolve user and group information from Windows NT servers
  abicheck - strumento di controllo compatibilità binaria
  libdb1-compat - routine per database Berkley [compatibili con glibc 2.0/2.1]
  libgetopt-java - GNU getopt - port Java
  libnss-rainbow2 - nss library for rainbow
  linuxinfo - visualizza informazioni estese sul sistema
  manpages-fr-dev - versione francese delle pagine di manuale di sviluppo
  manpages-pl-dev - Polish man pages for developers
  perdition-mysql - libreria per permettere a perdition di accedere a popmap basate su MySQL
  perdition-odbc - libreria per permettere a perdition di accedere a popmap basati su ODBC
  python-utmp - modulo Python per lavorare con utmp

no qui di roba ce n'è parecchia invece. Posso concludere che tutti i requisiti richiseti dda Google per l'installazione di Eclipse e SDK Android ci sono tutti.

Android SDK manager per Eclipse[modifica]

Le applicazioni per Android si sviluppano con gli Android Development Tools (ADT) che sono disponibili come plugin per Eclipse qui.

Di solito è Eclipse stesso che ti aiuta a scaricare e ad installare il plugin:

1. Lancia Eclipse, Poi clicca su Help > Install New Software.

2. Clicca Add, in alto a destra.

3. Nell'Add Repository dialog che appare, scrivi "ADT Plugin" for the Name and the following URL for the Location:

  https://dl-ssl.google.com/android/eclipse/

4. Click OK.

Seguendo la guida ho trovato e installato però provando a fare questo

  Window > Android AVD Manager

mi apre un dialog, in cui posso creare un dispositivo virtuale. Faccio New... ma il nuovo dialog che si apre mi presenta OK in grigio e non riesco a salvare. Trovo qui il perché.

Qui invece trovo la soluzione.

Da Eclipse apro:

  • Window > Android SDK Manager

Faccio partire il download, perché effettivamente nel primo sito avevano ragione, mi mancavano pezzi:

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

Un nuovo progetto: manco a dirlo, Ciao Mondo![modifica]

File > New > Project

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

Qui dal web leggo che la differenza tra Sample Project e Application Project è nella scelta dei parametri iniziali, libera per Application. Seleziono Sample ed Eclipse mi chiede il build (per quale "macchina virtuale android" voglio sviluppare):

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

Per ultimo mi chiede quale Sample, scelgo il Support4Demos:

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

Chiamiamolo come da figura. Selezionando il nome dell'applicazione (il primo campo, CiaoMondo) il resto si compila da sé. Seleziono la versione più avanzata della SDK (4.2, anche se nel mio tablet e nel Galaxy di Monica ho la versione 4.1.1 di Android)

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

Scegliamo alcune opzioni di configurazione per il progetto:

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

l'icona per il launcher

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

e il tipo di applicazione che vogliamo fare

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

L'attività avrà come nome CiaoMondoAndroideActivity:

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

Altolà: dove ha salvato tutta questa robe Eclipse?[modifica]

Qui:

   marcob@jsbach:~/workspace/CiaoMondoAndroide$ ll
   totale 108
   drwxrwxr-x  8 marcob marcob  4096 feb 11 16:20 ./
   drwxrwxr-x 10 marcob marcob  4096 feb 11 16:20 ../
   -rw-rw-r--  1 marcob marcob   683 feb 11 16:20 AndroidManifest.xml
   drwxrwxr-x  2 marcob marcob  4096 feb 11 16:20 assets/
   drwxrwxr-x  3 marcob marcob  4096 feb 11 16:20 bin/
   -rw-rw-r--  1 marcob marcob   348 feb 11 16:20 .classpath
   drwxrwxr-x  2 marcob marcob  4096 feb 11 16:20 gen/
   -rw-rw-r--  1 marcob marcob 55743 feb 11 16:20 ic_launcher-web.png
   drwxrwxr-x  2 marcob marcob  4096 feb 11 16:20 libs/
   -rw-rw-r--  1 marcob marcob   781 feb 11 16:20 proguard-project.txt
   -rw-rw-r--  1 marcob marcob   820 feb 11 16:20 .project
   -rw-rw-r--  1 marcob marcob   563 feb 11 16:20 project.properties
   drwxrwxr-x 11 marcob marcob  4096 feb 11 16:20 res/
   drwxrwxr-x  3 marcob marcob  4096 feb 11 16:20 src/

Orsù, versioniamo il software che di qui a poco si stravolgerà; riduco a questo frammento il codice Java:

   package com.example.ciaomondoandroide;
   
   import android.app.Activity;
   import android.os.Bundle;
   import android.widget.TextView;
   
   /*
    * Dal Manuale Android Programming di PuntoInformatico, pg. 8
    * */
   
   public class CiaoMondoAndroideActivity extends Activity {
   	@Override public void onCreate(Bundle savedIntanceState) {
   		super.onCreate(savedIntanceState);
   		TextView tv = new TextView(this);
   		tv.setText("Ciao, Mondo Androide!");
   		setContentView(tv);
   	}
   
   }

Il primo tentativo fallisce miseramente. In runtime ho questo messaggio:

Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione

e il log mi segnala queste cose:

   [2013-02-11 16:43:31 - CiaoMondoAndroide] No Launcher activity found!
   [2013-02-11 16:43:31 - CiaoMondoAndroide] The launch will only sync the application package on the device!
   [2013-02-11 16:43:31 - CiaoMondoAndroide] Performing sync
   [2013-02-11 16:43:31 - CiaoMondoAndroide] Failed to find an AVD compatible with target 'Android 4.2'.
   [2013-02-11 16:46:28 - CiaoMondoAndroide] Still no compatible AVDs with target 'Android 4.2': Aborting launch.
   [2013-02-11 16:46:28 - CiaoMondoAndroide] Performing sync
   [2013-02-11 16:47:15 - CiaoMondoAndroide] Launch canceled!

Scelgo con un po' più di criterio le SDK: CompileWith >= TargetSDK >= Minimum Required SDK

In realtà CompileWith dipende dalla SDK installata nel PC, quindi di solito non si può scegliere ma solo accettare.

In questo tentativo sono obbligato a cambiare nome al progetto e chiamarlo CiaoMondoAndroide1. Scelgo come

  • Minimum la API 12 Android 2.2 - Froyo ( = Target) e
  • CompileWith Android 4.2 (Jelly Bean)

Android SDK da Google[modifica]

Ho rimosso Ecplise (IDE che normalmente non uso) e ho seguito questo tutorial di Google. Questo mi ha permesso di arrivare a scrivere una applicazione in due secondi. Eclipse è già equipaggiato di Android SDK e tutte le librerie che servono, quando creo una nuova applicazione mi da' già il compilatore giusto e l'ultima versione di Android. Per gli imbranati come me è una manna.

Nella mia installazione

  $ ~/Development/adt-bundle-linux-x86_64-20130522/eclipse/eclipse
Errore nella creazione della miniatura: Impossibile salvare la miniatura nella destinazione
Splash di avvio di ADT

Errori vari[modifica]

'adb version' failed![modifica]

Il software adb (adb - Android Debug Bridge - è un utile strumento a linea di comando che ci aiuta a comunicare con una istanza di un emulatore o con un dispositivo Android vero); ma uno degli errori che mi compare è questo:

  [2012-04-04 02:06:35 - adb] 'adb version' failed!
  /opt/android-sdk-linux/platform-tools/adb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
  [2012-04-04 02:06:35 - adb] Failed to parse the output of 'adb version':

Soluzione[modifica]

  sudo apt-get install lib32ncurses5 lib32stdc++

Fonte

Collegarsi ad un dispositivo Android da Ubuntu[modifica]

ADT da' la possibilità di testare il software in due modi

  • direttamente in un dispositivo esterno con Android (uno smartphone o un tablet, io ho il tablet, un TrekStor SurfTab 10.1)
  • oppure sul PC di sviluppo tramite un emulatore Android

Provo ad eseguire la mia prima applicazione sul tablet Android. Un fallimento, come al solito. L'IDE (ADT) non riesce a rilevare il dispositivo quando lo collego col cavetto USB

  $ sudo apt-get install libmtp
  $ sudo apt-get install mtp-tools
  $ mtp-detect
  Unable to open ~/.mtpz-data for reading, MTPZ disabled.libmtp version: 1.1.5
  Listing raw device(s)
     No raw devices found.
  $ sudo mkdir /mnt/Android_Device

Riprovo secondo [1]

  $ sudo apt-get install golang fuse git-core libmtp-dev libfuse-dev
  ......
  $ GOPATH=/tmp/go go get github.com/hanwen/go-mtpfs
  $ go-mtpfs ~/MyAndroid &
  [1] 29654
  $ 2013/06/21 14:16:03 detect failed: no MTP devices found

Consultando i log di sistema (/var/log/syslog) il problema sembra questo

  Jun 21 14:25:41 js kernel: [21864.645157] usb 2-1.4: new full-speed USB device number 25 using ehci_hcd
  Jun 21 14:25:42 js kernel: [21865.052656] usb 2-1.4: device not accepting address 25, error -32
  Jun 21 14:25:42 js kernel: [21865.052794] hub 2-1:1.0: unable to enumerate USB device on port 4

Cavetto nuovo[modifica]

Forse è un problema hardware, uso un cavetto nuovo; la spina nella presa usb del tablet mi sembra più stabile; questo è quello che vedo nei log quando connetto il cavetto:

   $ tail -f /var/log/syslog
   ...
   Jun 26 12:24:28 js kernel: [13252.396373] usb 2-1.2: new high-speed USB device number 94 using ehci_hcd
   Jun 26 12:24:28 js kernel: [13252.489158] usb 2-1.2: New USB device found, idVendor=1e68, idProduct=0062
   Jun 26 12:24:28 js kernel: [13252.489166] usb 2-1.2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
   Jun 26 12:24:28 js kernel: [13252.489171] usb 2-1.2: Product: ST10216-1
   Jun 26 12:24:28 js kernel: [13252.489175] usb 2-1.2: Manufacturer: SurfTab
   Jun 26 12:24:28 js kernel: [13252.489179] usb 2-1.2: SerialNumber: 0123456789ABCDEF
   Jun 26 12:24:28 js kernel: [13252.490311] scsi20 : usb-storage 2-1.2:1.0
   Jun 26 12:24:28 js mtp-probe: checking bus 2, device 94: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"

Da Android cliccare sull'icona USB in basso a destra e premere sul pulsante Abilita archivio USB

Schermata contenuto Android da Ubuntu Nautilus

Avviare il debug[modifica]

Ho notevoli problemi. Come sempre. Premendo semplicemente F11 non viene niente. Nel dispositivo Android vado in Impostazioni > Opzioni Sviluppatore e abilito debug USB.

DI nuovo F11 ma continuo a non vedere alcun dispositivo:

Android Device Chooser

Aggiungere un dispostivo di debug Android a Ubuntu[modifica]

Riporto da questo sito With an Android-powered device, you can develop and debug your Android applications just as you would on the emulator. Before you can start, there are just a few things to do:

1 Declare your application as "debuggable" in your Android Manifest. android:debuggable="true" to the element

2 Set up your device to allow installation of non-Market applications.

On the device, go to Settings > Applications and enable Unknown sources (on an Android 4.0 device, the setting is located in Settings > Security).

3 Turn on "USB Debugging" on your device.

On the device, go to Settings > Applications > Development and enable USB debugging (on an Android 4.0 device, the setting is located in Settings > Developer options).

4 Set up your system to detect your device. ... If you're developing on Ubuntu Linux, you need to add a udev rules file that contains a USB configuration for each type of device you want to use for development. In the rules file, each device manufacturer is identified by a unique vendor ID, as specified by the ATTR{idVendor} property. For a list of vendor IDs, see USB Vendor IDs, below. To set up device detection on Ubuntu Linux: Log in as root and create this file: /etc/udev/rules.d/51-android.rules.

Use this format to add each vendor to the file:

  SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"

In this example, the vendor ID is for HTC. The MODE assignment specifies read/write permissions, and GROUP defines which Unix group owns the device node.

Note: The rule syntax may vary slightly depending on your environment. Consult the udev documentation for your system as needed. For an overview of rule syntax, see this guide to writing udev rules.

Now execute:

  chmod a+r /etc/udev/rules.d/51-android.rules

Come trovare l'ID per Trekstor Surftab ST10216-1?[modifica]

Cerco il software adb (adb - Android Debug Bridge - è un utile strumento a linea di comando che ci aiuta a comunicare con una istanza di un emulatore o con un dispositivo Android vero). Di solito è già parte del corredo del plugin ADT, infatti lo trovo qui:

  marcob@js:~/Development/adt-bundle-linux-x86_64-20130522/sdk/platform-tools
  $ sudo cp adb /bin/adb
  $ cd

Qual è il mio Device ID?

  $ lsusb
    Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
    Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 003: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
    Bus 001 Device 004: ID 138a:0008 Validity Sensors, Inc. VFS300 Fingerprint Reader
    Bus 002 Device 095: ID 1e68:0062 TrekStor GmbH & Co. KG 
    Bus 002 Device 003: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse
    Bus 002 Device 004: ID 0c45:6481 Microdia 
    Bus 001 Device 005: ID 413c:8161 Dell Computer Corp. Integrated Keyboard
    Bus 001 Device 006: ID 413c:8162 Dell Computer Corp. Integrated Touchpad [Synaptics]
    Bus 001 Device 007: ID 413c:8160 Dell Computer Corp. Wireless 365 Bluetooth

Ma, attenzione, lo potevo vedere anche dalla riga di del syslog di prima!

  $ tail -f /var/log/syslog
  ...
  Jun 26 12:24:28 js kernel: [13252.396373] usb 2-1.2: new high-speed USB device number 94 using ehci_hcd
  Jun 26 12:24:28 js kernel: [13252.489158] usb 2-1.2: New USB device found, idVendor=1e68, idProduct=0062

Va be', in ogni caso metto gli id vendor:product nel file di inizializzazione di adb:

  $ echo 0x0062 > .android/adb_usb.ini
  $ echo 0x1E68 >> .android/adb_usb.ini
  $ sudo adb kill-server
  $ sudo adb start-server
  * daemon not running. starting it now on port 5037 *
  * daemon started successfully *
  $ sudo adb devices
    List of devices attached 
    0123456789ABCDEF	device

Non funziona, nel senso che da ADT non vedo ancora il dispositivo per poter fare i test; in sostanza devo esplicitamente installare adb, quello che mi è arrivato giù con il plugin ADT non è gradito:

   marcob@js:~/Development/adt-bundle-linux-x86_64-20130522/sdk/platform-tools$ adb help
   Il programma "adb" non è attualmente installato. È possibile installarlo digitando:
   sudo apt-get install android-tools-adb

Va be', procediamo:

   $ sudo apt-get install android-tools-adb
   Lettura elenco dei pacchetti... Fatto
   Generazione albero delle dipendenze       
   Lettura informazioni sullo stato... Fatto
   I seguenti pacchetti sono stati installati automaticamente e non sono più richiesti:
     calligra-l10n-engb calligra-l10n-it cdparanoia k3b .... language-pack-kde-it libflac++6
     libk3b6 libkcddb4
   Usare "apt-get autoremove" per rimuoverli.
   I seguenti pacchetti NUOVI saranno installati:
     android-tools-adb
   0 aggiornati, 1 installati, 0 da rimuovere e 2 non aggiornati.
   È necessario scaricare 66,8 kB di archivi.
   Dopo quest'operazione, verranno occupati 181 kB di spazio su disco.
   Scaricamento di:1 http://it.archive.ubuntu.com/ubuntu/ quantal/universe android-tools-adb amd64 4.1.1+git20120801-1 [66,8 kB]
   Recuperati 66,8 kB in 0s (200 kB/s)    
   Selezionato il pacchetto android-tools-adb non precedentemente selezionato.
   (Lettura del database... 229622 file e directory attualmente installati.)
   Estrazione di android-tools-adb (da .../android-tools-adb_4.1.1+git20120801-1_amd64.deb)...
   Elaborazione dei trigger per man-db...
   Configurazione di android-tools-adb (4.1.1+git20120801-1)...
   $ adb kill-server
   $ adb start-server
   * daemon not running. starting it now on port 5037 *
   * daemon started successfully *

Stavolta ADT vede il dispositivo[modifica]

Vedo il dispositivo ???? nell'elenco

Ma sfortunamtamente non ho avviato abd server da root. Rifaccio tutto da root:

   $ cd ~/Development/adt-bundle-linux-x86_64-20130522/sdk/platform-tools
   $ sudo adb start-server
   [sudo] password for marcob: 
   * daemon not running. starting it now on port 5037 *
   * daemon started successfully *
   $ sudo adb devices
   List of devices attached 
   0123456789ABCDEF	device
   

Stavolta non compaiono i ??? e....

Vedo il dispositivo ???? nell'elenco

Nota i campi che sono ora compilati correttamnete

Pronti? via![modifica]

Ora che ho gli strumenti di sviluppo (attenti al cavetto) provo a capire qualcosa.

  • View (Rettangolo)
  • Activity (Processo)
  • Intent (Azione)
  • Content Provider (SQLite)
  • Service (demone, "antagonista" di una Activity)
  • AndroidManifest.xml è il file che definisce i contenuti e il comportamento dell'applicazione. Esempio:
  <?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="it.betaingegneria.myfirstapp"
      android:versionCode="1"
      android:versionName="1.0" >
  
      <uses-sdk
          android:minSdkVersion="8"
          android:targetSdkVersion="17" />
  
      <application
          android:allowBackup="true"
          android:icon="@drawable/ic_launcher"
          android:label="@string/app_name"
          android:theme="@style/AppTheme" >
          <activity
              android:name="it.betaingegneria.myfirstapp.MainActivity"
              android:label="@string/app_name" >
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
  
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      </application>
  
  </manifest>
  • Resource (bitmap o stringa di testo)

Ho generato una nuova app con Eclipse + ADT e questo è il contenuto della directory

  marcob@js:~/workspace/PrintDate$ ll
  totale 76
  drwxrwxr-x  9 marcob marcob  4096 lug  2 17:11 ./
  drwxrwxr-x  5 marcob marcob  4096 lug  2 17:11 ../
  -rw-rw-r--  1 marcob marcob   870 lug  2 17:11 AndroidManifest.xml
  drwxrwxr-x  2 marcob marcob  4096 lug  2 17:11 assets/
  drwxrwxr-x  4 marcob marcob  4096 lug  2 17:11 bin/
  -rw-rw-r--  1 marcob marcob   466 lug  2 17:11 .classpath
  drwxrwxr-x  3 marcob marcob  4096 lug  2 17:11 gen/
  -rw-rw-r--  1 marcob marcob 19144 lug  2 17:11 ic_launcher-web.png
  drwxrwxr-x  2 marcob marcob  4096 lug  2 17:11 libs/
  -rw-rw-r--  1 marcob marcob   781 lug  2 17:11 proguard-project.txt
  -rw-rw-r--  1 marcob marcob   812 lug  2 17:11 .project
  -rw-rw-r--  1 marcob marcob   563 lug  2 17:11 project.properties
  drwxrwxr-x 14 marcob marcob  4096 lug  2 17:11 res/
  drwxrwxr-x  2 marcob marcob  4096 lug  2 17:11 .settings/
  drwxrwxr-x  3 marcob marcob  4096 lug  2 17:11 src/

Android PacKage files with an extension .apk

Appunti[modifica]

Prendo maggior parte delle cose dal sito per i sviluppatori Android, ma lo digerisco a modo mio.

Esempi[modifica]

Android SDK mette a disposizione una serie di esempi per fare pratica. Per installarli si devono scaricare lo si può fare

A mano[modifica]

  $ cd ~/Development/adt-bundle-linux-x86_64-20130522/sdk/tools
  $ android sdk 

Si apre una finestrella,

ADT SDK Manager

si seleziona Samples for SDK, selezionare l'accettazione dei termini di licenza

In lavatrice[modifica]

si avvia la IDE Android Developer Tool, si seleziona Window > Android SDK Manager e si procede come sopra.

Quale che sia la modalità adottata, si trovano qui gli esempi:

  marcob@js:~/Development/adt-bundle-linux-x86_64-20130522/sdk/samples/android-17$

modulo il percorso di installazione iniziale.

I componenti di una applicazione Android[modifica]

Una applicazione è quella che sia avvia (o si riattiva) dal tap su una icona e può essere composta da una più attività che sono i task elementari di cui è composta.

Ad esempio, per una applicazione per gestire le email potrò avere due attività:

  • lista delle ultime email (magari questa è l'attività di ingresso o principale)
  • editor per scrivere una nuova email

Occorre stabilire qual è l'attività di ingresso, cioè la prima che viene invocata quando si avvia l'applicazione. Poi deve essere chiaro come si passa dall'una all'altra e, infine, cosa deve succedere quando si esce dall'applicazione (in genere devono essere terminate tutte le attività collegate all'applicazione.

Ogni applicazione è avviata dal SO come appartenente ad un solo userID, a parte il caso in cui le applicazioni debbano condividere risorse. Infatti così ogni applicazione vede e scrive le sue risorse e nient'altro, garantendo robustezza. È ovviamente previsto il caso di applicazione con userID condiviso con altre. Dipende da cosa si deve fare.

Ogni applicazione è costituita dalle componenti fondamentali che consentono uno sviluppo compartimentato a seconda delle funzionalità e la robustezza del programma.

Le componenti sono

  • Activities
  • Services
  • Brodacast Receivers
  • Intents
  • Manifest

Activity[modifica]

Una attività è una finestra in cui si realizza un compito preciso:

  • scrivere una email
  • scattare una foto
  • cercare nella rubrica indirizzi

Ad ogni attività viene associato un layout. Quando si invoca la classe che realizza il nostro programmino, all'inizializzazione viene sempre eseguito un codice simile:

 public class MyActivity extends Activity {
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      TextView unavariabile = (TextView) findViewById(R.id.nome_variabile_nell_indice);
      ...

in questo frammento si vede che al momento di istanziare la classe, viene salvato lo stato precedente (savedInstanceState).

Poi viene chiamato il layout che realizza la grafica dell'applicazione (setContentView(R.layout.main)).

onCreate può essere eseguita nella classe e nelle sottoclassi, ma non da un programma esterno. In generale, possiamo pensare alle classi come ad una cipolla. La cipolla è fatta di vari strati, uno dentro l'altro.

Lo strato esterno è il più generale, mano a mano poi ci si può muovere verso l'interno. Ma la buccia non ha superclassi.

Uno strato intermedio avrà classi parenti (genitrici o superclassi) e figlie (o sottoclassi);

Forti di questa metafora:

  • se il metodo è protected il permesso all'esecuzione è verso l'interno, tutte le sottoclassi lo possono invocare.
  • Se fosse public il permesso sarebbe anche verso l'esterno, lo ereditano anche le superclassi.
  • Se fosse private sarebbe accessibile solo in quello strato lì.

Esempio http[modifica]

Qui [2] ho trovato il suggerimento per aggirare un fastidioso errore

  android.os.NetworkOnMainThreadException.

la versione minima 8 di andoid con cui fo i test crea questo problema e non invoco il web server. L'ho messa a 9.

Problema access denied[modifica]

Aggiungere ad AndroidManifest.xml

  <uses-permission android:name="android.permission.INTERNET"/>

Services[modifica]

Questa è la componente che permette all'applicazione di gestire il calcolo in background, ad esempio la logica del gioco in un videogame

Broadcast receiver[modifica]

Questa è la componente che permette alle applicazioni di parlarsi tra di loro (gestire l'evento di batteria scarica durante la riproduzione di un video per esempio)

Intents[modifica]

Questa è la componente che permette alle attività di una applicazione di parlarsi tra di loro: ad esempio in un'attività ho la maschera di ricerca e in una seconda l'interrogazione di un servizio web e l'esposizione dei risultati:

  public class SearchActivity extends Activity {
  ...
  
     private void startSubActivity(String param) {
       Intent intent = new Intent(this, ShowTableActivity.class);
       intent.putExtra("param", param);
       startActivity(intent);
     }
  ...
  }

dall'interno di una attività SearchActivity, chiamo la sotto attività ShowTableActivity e la comunicazione tra le due è realizzata dalla classe Intent.

Manifest[modifica]

Nel manifest ad esempio definisco il permesso di una app di collegarsi a Internet:

  <uses-permission android:name="android.permission.INTERNET"/>