de Adrian D. Finlay

Cum se creează o aplicație mobilă multiplatăforme în Java

Cum se realizeaza o aplicatie mobila multiplatforma in Java
Sursă: GIPHY

Știați că puteți utiliza Java pentru a crea aplicații mobile pe mai multe platforme? Da, ciupiți-vă, ați citit bine prima dată! Vă voi învăța noțiunile de bază despre cum să utilizați cunoștințele Java existente pentru a crea aplicații performante pe Android și iOS în 12 pași simpli. Vom face acest lucru toate folosind JavaFX ca set de instrumente GUI.

Dar mai întâi, încă ceva prim-plan. Va trebui să îndepliniți cerințele ulterioare pentru a putea crea o aplicație pentru ambii Android și iOS. Cu toate acestea, dacă nu doriți să construiți o aplicație iOS, vă puteți dezvolta pe orice mașină x64 biți care acceptă Java SE 8. Acest proiect va fi un depozit Git construit cu gradle. Dar nu este nevoie să creați un depozit Git.

Următoarele sunt cerințe:

  • Un JVM compatibil JDK 1.8
  • Instrumente pentru linia de comandă Android (SDK v.27)
  • XCode 9.2
  • Gradle 4.2
  • Git Large File Storage (v.2.5.0) (Nu este necesar dacă nu doriți să creați un depozit git)
  • De preferință cel puțin 4G RAM

Nerăbdător? Doriți să vedeți un rezultat final? Consultați proiectul finalizat mai jos.

afinlay5 / OnyxFx
Depozit de cod sursă Gradle pentru OnyxFx, o redare a aplicației JavaFX pe mai multe platforme (Android / iOS / Linux / macOS / Windows) …github.com

Mediul meu de dezvoltare va fi Fedora Linux 28 și macOS High Sierra. Acum, că am scăpat de asta, să săpăm.

1) Creați un folder pentru a găzdui proiectul

Am găzduit proiectul meu, OnyxFx, după cum urmează: „/ home / adriandavid / Projects / OnyxFx ”. Sunteți, desigur, liber să găzduiți proiectul oriunde doriți.

Cum se realizeaza o aplicatie mobila multiplatforma in Java

2) Inițializați gradle, Git, setați JAVA_HOME

Deschideți un terminal în rădăcina directorului proiectului. Dacă gradle este configurat corect, ar trebui să vedeți așa ceva după ce ați executat următoarea comandă:

gradle -v
1611906433 146 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Trebuie să vă asigurați că gradle listează instalarea Java Development Kit (JDK) 8 adiacentă secțiunii etichetate „JVM”.

Deși există multe modalități de a face acest lucru, cea mai simplă cale este să vă asigurați că variabila de mediu JAVA_HOME este setată corect.

În funcție de mediul dvs., există multe modalități de a face acest lucru. O modalitate de a face acest lucru în majoritatea mediilor * nix este setarea variabilei în /home//.bfrasinrc sau / etc / profişier. Consultați manualul sistemului de operare pentru a vă asigura că variabila de mediu JAVA_HOME este setată corect.

Puteți include următoarele linii la sfârșitul fie .bashrc, fie al profilului pentru a vă asigura că JAVA_HOME este setat corect.

JAVA_HOME=/home/adriandavid/java/oracle_jdk1.8.0_181/export JAVA_HOME

Notă: Puteți instala Oracle’s JDK 8 aici.

Apoi, asigurați-vă că shell-ul reflectă modificările de mai sus executând una dintre următoarele comenzi:

source ~/.bashrcsource /etc/profile

Introduceți următoarea comandă pentru a verifica dacă variabila este setată corect:

echo $JAVA_HOME
1611906433 107 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Dacă întâmpinați în continuare dificultăți sau utilizați Microsoft Windows, consultați aici.

Prima alergare git init în directorul rădăcină al proiectului pentru a inițializa depozitul Git. Notă: dacă nu doriți să găzduiți un depozit git, puteți sări peste acest pas.

În al doilea rând, fugi gradle init în directorul rădăcină al proiectului pentru a inițializa depozitul gradle. Acest pas este necesar.

1611906433 339 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Notă: Veți observa că exemplul meu apare ușor diferit. Acest lucru se datorează faptului că am deja gradle și Git inițializate în mediul meu local.

3) Fii groovy! Editați gradle.build și

In speranta Pamant, vant si foc te poate ajuta să devii grozav! Porniți editorul de text preferat și editați build.gradle aflat în directorul rădăcină al proiectului dvs. și înlocuiți conținutul cu conținutul următoarei fișiere GitHub.

Aceste setări build.gradle configurează proiectul nostru gradle pentru a utiliza fișierul javafxmobile plugin, care este calul de lucru al proiectului nostru. Puteți afla mai multe despre plugin aici și aici. Printre multe lucruri, pluginul javafxmobile automatizează procesul de descărcare (de la Maven Central sau jcenter) și adăugarea SDK-urilor iOS și Android în calea de curs a aplicației.

Dacă sunteți familiarizat cu gradle, maven sau furnică, grozav – probabil că aveți o idee despre ce se întâmplă. Dacă nu sunteți familiarizați cu gradle, nu-ți face griji. Tot ce trebuie să înțelegeți este că gradle este un instrument de construcție utilizat pentru automatizarea multor sarcini implicate în construirea de aplicații, cum ar fi: captarea dependențelor, organizarea proiectelor etc.

Observați că vizăm Android 7.1 Nougat (API versiunea 25) și iOS 11 (vom vedea unde se va face acest lucru în scurt timp). Puteți ajusta aceste valori după cum doriți. Rețineți, totuși, că, în cazul Android, trebuie să vă asigurați că versiunea API se potrivește cu versiunea SDK pe care ați descărcat-o (mai multe despre aceasta mai târziu).

În cele din urmă, nu voi demonstra producția de executabile semnate în acest tutorial. Din acest motiv, iOSSkipSigning este setat la adevărat și nu facem uz de releaseAndroid sarcină gradle. Cu toate acestea, puteți oferi spațiile de cazare adecvate pentru a produce aplicații semnate.

4) Creați un fișier nou numit gradle.properties și configurați-l

Creați un fișier nou numit în directorul rădăcină al proiectului gradle.properties și adăugați următorul conținut în fișier.

robovm.device.name=iPhone-7robovm.sdk.version=11.0org.gradle.jvmargs=-Xms4g -Xmx8g

Aceste setări îi spun pluginului javafxports să folosească un iPhone-7 ca emulator de bord, să vizeze iOS 11 și să transmită stegulețele Xms și Xmx către JVM, care specifică atât piscina inițială de memorie la 4 GB, cât și memoria maximă a heap-ului piscina la 8 GB. Acest lucru va fi necesar pentru compilarea openJDK și dezvoltarea versiunii iOS.

5) Instalați Homebrew (numai pentru iOS)

Dacă nu aveți un Mac și nu intenționați să produceți o versiune iOS, nu ezitați să ignorați acest pas.

Deschideți terminalul în macOS și lipiți următoarea comandă.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

6) Instalați soclul de multiplexare USB (numai pentru iOS)

Treceți la acest pas numai dacă Homebrew a instalat cu succes. Dacă nu aveți un Mac și nu intenționați să produceți o versiune iOS, nu ezitați să ignorați acest pas.

Deschideți terminalul în macOS și lipiți următoarea comandă.

brew install usbmuxd

7) Prindeți instrumentele pentru linia de comandă Android

Prindeți Instrumente pentru linia de comandă Android pentru platforma dvs. aici. După terminarea descărcării, dezarhivați folderul și lipiți conținutul în directorul dorit. Pentru mine, asta a fost /home/<user>/Android.

1611906434 92 Cum se realizeaza o aplicatie mobila multiplatforma in Java

8) Setați Android_HOME, Prindeți pachetele Android necesare

La fel ca în Java, gradle trebuie să știe unde să caute pentru a găsi instrumentele pentru linia de comandă Android. Există câteva modalități de a face acest lucru. Cu toate acestea, în spiritul simplității și consecvenței, vom seta variabila de mediu ANDROID_HOME în acest tutorial. Adăugați următoarea variabilă în același mod în care am făcut-o pentru JAVA_HOME. De exemplu:

ANDROID_HOME=/home/adriandavid/Android/ export ANDROID_HOME

Nu uitați să reîncărcați shell-ul adăugând source <file> așa cum am făcut pentru JAVA_HOME.

Acum, apucați instrumentele necesare pentru a construi versiunea Android. Executați următoarea comandă:

# *.nix./sdkmanager "platform-tools" "build-tools;25.0.3" "platforms;android-25" "extras;android;m2repository" "extras;google;m2repository"
or
#Windowssdkmanager "platform-tools" "build-tools;25.0.3" "platforms;android-25" "extras;android;m2repository" "extras;google;m2repository"

Rețineți cu atenție că versiunea SDK și API pe care le-am specificat în gradle.build corespund versiunii pe care am specificat-o în această comandă. Și anume „25”. În cazul în care acest lucru va fi aliniat greșit, versiunea nu va reuși.

9) Creați structura directorului aplicației

Pentru a automatiza procesul de creare a acestor directoare, executați următorul script shell.

Bourne-Again Shell / Korn Shell:

Windows Shell (cmd):

Salvați fișierul ca mkpdir.bat sau mkpdir.sh și executați fișierul din directorul rădăcină al proiectului ca rădăcină (sau Administrator).

# *.nixchmod +x mkdir.sh-sh ./mkpdir.sh
# Windowsmkpdir

Observați că am creat directoare pentru încorporat și desktop. Vom produce o versiune desktop, deoarece nu este nevoie de muncă suplimentară pentru a face acest lucru. Cu toate acestea, nu vom produce nicio versiune pentru dispozitive încorporate.

10) Creați aplicația JavaFX!

Navigați la / src / / java și începeți să vă dezvoltați aplicația JavaFx! Resursele aplicației sunt stocate în / src / / resources.

Puteți începe cu un simplu Salut Lume aplicație sau priviți codul sursă pe care l-am pus împreună aici. OnyxFx este o aplicație pe care am făcut-o, urmând aceste instrucțiuni, care efectuează apeluri REST prin HTTP către OnyxFxAPI. API-ul, la rândul său, este un răzuitor web care va returna datele statistice (puncte pe joc, recuperări pe joc, asistențe pe joc) pentru jucătorul NBA® și sezonul specificat de client. Returnează datele ca JSON, care sunt apoi analizate și afișate pe ecranul aplicației mobile. Simțiți-vă liber să îl editați!

Rețineți că, deși puteți partaja codul sursă, ar trebui să includeți modificări personalizate în fiecare copie a sursei, dacă doriți să faceți modificări specifice dispozitivului.

De asemenea, rețineți că compilatorul subiacent (furca MobiDevelop a RoboVM) nu acceptă pe deplin toate API-urile Java 8. Dacă vă uitați foarte atent la codul meu sursă, veți observa că în versiunea iOS a codului sursă am eliminat API-ul neacceptat, cum ar fi java.util.function.BiConsumer și java.util.Map.replace ().

11) Creați un disc RAM pentru versiunile iOS (numai iOS)

Procesul de compilare pentru iOS este foarte greu de utilizat, deoarece plugin-ul va compila întreg openJDK și alte biblioteci de două ori pentru a crea un JAR gras pe care îl va folosi pentru a vă crea aplicația. Prin urmare, ar trebui să creați preventiv un disc RAM pentru a se potrivi cerințelor de memorie.

Cu toate acestea, acest pas este supus evaluării capacităților mașinii dvs. Pentru context, mașina MacOS pe care am folosit-o pentru a compila aplicația mea iOS are 4 GB RAM DDR2. Am decis să fac un disc RAM de 8 GB. Pentru aceasta, executați următoarea comandă în terminal.

SIZE=8192 ; diskutil erasevolume HFS+ ‘RoboVM RAM Disk’ `hdiutil attach -nomount ram://$((SIZE * 8192))`

12) Construiți și rulați aplicația!

Pentru a vă crea aplicația, executați învelișul gradle în directorul rădăcină de la terminal, după cum urmează.

./gradlew clean build

Aceasta va produce o aplicație desktop ambalată ca JAR cu scripturi pentru a rula aplicația furnizată în /build/distributions/<AppName.tar>; and /build/distributions/<AppNume.zip>. Dacă dezarhivați directoarele, veți observa următoarea structură:

1611906434 93 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Observați că în / bin există scripturi pentru a executa aplicația. Aceste scripturi se bazează pe păstrarea structurii curente a folderelor. De asemenea, observați că nu este necesar să aveți copac instalat. Este folosit aici pur și simplu în scop ilustrativ.

Există, în plus, un JAR independent pe care îl puteți utiliza pentru a executa aplicația pe orice mediu desktop care acceptă JavaFX 8. Pentru a rula aplicația, executați una dintre următoarele:

# Navigate to /build/distributions/<ProjectName>/
#On *.nixcd bin./<ProjectName>
#On Windowscd bin<ProjectName>
#Platform agnosticjava -jar OnyxFxMobile.jar (or double click, if jvm is configured to run .jar files)
Note: If the executable providing "java" is not the same vendor and/or version of the Java 8 JDK with which you built this application, the jar may not run. JavaFX 8 builds between the openJDK & Oracle JDK are incompatible.
Otherwise: /location/to/java8/bin/java -jar <ProjectName>

Vizualizați sarcinile gradle ale acestui proiect

Puteți vizualiza sarcinile de gradle ale acestui proiect executând următoarele în directorul rădăcină al proiectului.

./gradlew tasks

Pentru a compila, rulați pe desktop

Următoarea comandă va rula proiectul în mediul gazdă.

./gradlew jar./gradlew run

Veți găsi un borcan independent build/libs/<AppName&gt; .jar.

Pentru a compila, rulați pe Android

./android #Generates a debug Android apk containing the JavaFX application.
./androidInstall #Launch the application on a connected android device.
./androidRelease #Generates a release Android apk containing the JavaFX application.
Note: You will need to configure a valid signingConfig when releasing an APK (javafxports).

Veți găsi două APK-uri în build/javafxports/android.
Primul va fi numit <AppName&gt; .apk.
Al doilea va fi named <AppName>-unaligned.apk.

Pentru a compila, rulați pe iOS

./createIpa - Generates an iOS ipa containing the JavaFX app.
./launchIOSDevice - Launches app on a connected ios device.
./launchIPadSimulator - Launches app on an iPad simulator.
./launchIPhoneSimulator - Launches app on an iPhone simulator.

Veți găsi trei executabile în build/javafxports/ios.
Primul va fi numit <AppName&gt; .ipa.
Al doilea va fi named <AppName> .dSYM.
Al treilea will be named &lt; AppName> .app.

Câteva capturi de ecran ale aplicației mele de probă

Pe desktop

1611906434 385 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Pe Android

1611906434 997 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Pe iPhone

1611906435 792 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Pe iPad

1611906435 584 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Ecran splash

1611906435 669 Cum se realizeaza o aplicatie mobila multiplatforma in Java

Gândurile mele de închidere

javafxports este un proiect promițător care își propune să aducă JavaFX și platforma Java SE pe dispozitive mobile și alte dispozitive. Într-un fel, instrumentul este paralel cu eforturile sale de Xamarin. Cu toate acestea, proiectului îi rămâne mult de lucru.

Pentru început, pluginul nu acceptă în totalitate Java 8. Pe Android, folosește retrolambda pentru a gestiona Java 8 Lambda Expressions & Method References. Din punct de vedere tehnic, depinde de Java 6. Dependențele suplimentare fac astfel încât să puteți utiliza Java 8. Cu toate acestea, procesul este simplu, compilările funcționează așa cum era de așteptat, iar timpul de compilare nu este prea lung.

Cu toate acestea, pe iOS, versiunile sunt extrem de intensive în memorie, iar procesul de compilare durează foarte mult. Următorul este un fragment al jurnalului pentru ./gradlew createIpa task.

:createIpa (Thread[Task worker for ‘:’,5,main]) completed. Took 1 hrs 46 mins 40.198 secs.

În total, procesul a consumat aproximativ peste 6 GB de memorie RAM pe mașina mea. Acest lucru nu este ideal. Cu toate acestea, viitorul este promițător. O companie numită Gluon a dezvoltat o JVM personalizată de înaltă performanță, complet modulară, care suportă complet Java 9, despre care puteți citi mai multe despre aici.

Acest articol este publicat inițial pe secțiunea blog a paginii mele de pornire, aici.

Resurse de explorat:

Cum se realizeaza o aplicatie mobila multiplatforma in Java
Sursă: Looney Tunes Ending