Mini Pinball (2 / 10 steg)
Steg 2: Software Architecture
Innan du slutar upp med den nuvarande utformningen, har ett fåtal studier gjorts:
- Läsa raw tangentbordshändelser från datorn, med hjälp av adb och getevent.
- Generera multitouch händelser (*) från ett litet program skrivet i C.
- Gör ovanstående från Java (kräver endast böka, men ingen daemon). Detta visade sig vara lite för långsam och introducerade en märkbar fördröjning, så jag valde en daemon skrivet i C, och konfigureras av en Java app.
(*) se http://www.mjmwired.net/kernel/Documentation/input/multi-touch-protocol.txt
Arkitektur
Den slutliga arkitekturen är baserad på en daemon, det vill säga en liten fristående program (skriven i C och därför mycket snabb) kommunicerar med en Java-tjänst.
Diagrammet i detta steg är en UML-klassdiagram, visar de viktigaste klasserna och entiteter och deras relationer.
pinball_buttons_mapper (aka daemon) - Detta är den fristående C program, egentligen gör alla "riktiga" jobb: den väntar tangentbordshändelser, och genererar multitouch händelser (simulering finger berör på skärmen). Alla parametrar läses från inställningsfilen kompakt. Demonen är Startat av Java app som root, eftersom det måste sådana behörigheter att läsa/skriva händelser direkt från /dev/input/eventN drivrutiner från underliggande Linux OS. Demon är inte kunna avgöra enheter att använda, skärmstorlek och orientering, etc, så den läser dessa parametrar från filen settings.cnf , som har utarbetats av den Java delen. Demonen har möjlighet att upptäcka att inställningsfilen har förändrats och att på nytt läsa det automatiskt.
SettingsActivity - detta är den viktigaste skärm som visas när du startar programmet. Det låter dig ställa in alla parametrar, och lagrar dem som inställningar. Det också (åter) startar tjänsten, och kräver CompactSettings på inställningar förändringar.
CompactSettings (aka settings.cnf) - skriver en kopia av inställningarna i ett mycket kompakt format som daemon kan lätt läsa. Inställningarna är i XML, men kompakt kopian är mycket mycket enklare.
TheService - detta är Javakod körs i bakgrunden, även när ingen skärm av app är synlig. Det blir en ikon alltid synlig i Android meddelandefältet och bryr sig för (åter) starta daemon (dess roll är bara att övervaka demonen, och kalla inställningsskärmen).
Mapper - detta är en Java-klass för att installera demonen, och starta det (om).
BroadcastReceiver - detta behövs för att göra app startas automatiskt när tabletten stövlar.
Loggar - ger en skärm som visar debug loggar, användbart vid utveckling av programvaran.
UncaughtExceptionHandler - normalt när en Java apps påträffar ett fel som leder till en creash, den stannar. Denna handler visar istället lite teknisk information (stackspårningen) för att hjälpa till att lokalisera problemet utan en felsökare kopplad via en PC.
Sammanställa och bygga
Den Java del utvecklades under Eclipse. Demonen är cross-kompilerad, och lagras in i Java app som en rå resurs.
För att bygga alla, kör skriptet build_all.sh . Dess slutliga produkten är APK filen i bin /. Bygga skriptet fungerar under Linux och Mac OSX, och kräver Android SDK installeras, samt C cross-kompilatorn (arm-linux-gnueabi-gcc). För att utveckla Java-del, och om build_all.sh kördes en gång tidigare i för att kompilera C daemon, kan allt göras från inom Eclipse som vanligt.
Arkiv för källkoden kan hittas i steg 10.