Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator01 [2016/02/26 01:07] Andrei Roșu-Cojocaru |
laboratoare:laborator01 [2017/02/20 20:54] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Laborator 01. Introducere în Programarea Android ====== | ====== Laborator 01. Introducere în Programarea Android ====== | ||
| - | |||
| - | ===== Materiale Ajutătoare ===== | ||
| - | |||
| - | * [[http://pdsd2015.andreirosucojocaru.ro/_media/laboratoare/laborator01/pdsd2015-lab01-slides.pdf|pdsd2015-lab01-slides.pdf]] | ||
| - | * [[http://pdsd2015.andreirosucojocaru.ro/_media/laboratoare/laborator01/pdsd2015-lab01-slides-3pp.pdf|pdsd2015-lab01-slides-3pp.pdf]] | ||
| ===== Sistemul de Operare Android ===== | ===== Sistemul de Operare Android ===== | ||
| Line 40: | Line 35: | ||
| | 1.1 | 2 | 09.02.2009 | | | | | 1.1 | 2 | 09.02.2009 | | | | ||
| | 1.0 | 1 | 23.09.2008 | | | | | 1.0 | 1 | 23.09.2008 | | | | ||
| + | |||
| + | Pentru identificarea versiunilor se folosesc, de regulă, trei sisteme: | ||
| + | * un număr, ce respectă formatul major.minor[.build], desemnând dacă modificările aduse sunt substanțiale sau reprezintă ajustări ale unor probleme identificate anterior; versiunea curentă este 6.0.1, lansată la sfârșitul anului 2015; | ||
| + | * un nivel de API (același putând grupa un număr de mai multe versiuni), prin care se indică funcționalitățile expuse către programatori; versiunea curentă are nivelul de API 23; | ||
| + | * o denumire, având un nume de cod inspirat din lumea dulciurilor; termenii respectivi încep cu inițiale care respectă ordinea alfabetică; versiunea curentă este Marshmellow. | ||
| + | |||
| + | În momentul în care se ia decizia cu privire la versiunea pentru care se dezvoltă o aplicație Android, trebuie avute în vedere și cotele de piață ale dispozitivelor mobile. Dezvoltarea unei aplicații Android pentru cea mai nouă versiune are avantajul de a se putea utiliza cele mai noi funcționalități expuse prin API. Dezvoltarea unei aplicații Android pentru cea mai veche versiune are avantajul unei adresabilități pe scară largă. Un compromis în acest sens poate fi obținut prin intermediul **bibliotecilor de suport**, dezvoltate pentru fiecare versiune, prin intermediul cărora pot fi utilizate la niveluri de API mai mici funcționalități din niveluri de API mai mari (în limita capabilităților dispozitivului mobil respectiv). Utilizarea acestora reprezintă o practică recomandată în dezvoltarea aplicațiilor Android. | ||
| ==== Arhitectura Android ==== | ==== Arhitectura Android ==== | ||
| Line 45: | Line 47: | ||
| Arhitectura sistemului de operare Android cuprinde cinci secțiuni grupate pe patru niveluri: | Arhitectura sistemului de operare Android cuprinde cinci secțiuni grupate pe patru niveluri: | ||
| - | {{ :laboratoare:laborator01:arhitecturaandroid.png?nolink&600 }} | + | {{ :laboratoare:laborator01:android_architecture.png?nolink&600 }} |
| - | - **Kernelul Linux** (cu unele modificări) conține driver-ele pentru diferitele componente hardware (ecran, cameră foto, tastatură, antenă WiFi, memorie flash, dispozitive audio), fiind responsabil cu gestiunea proceselor, memoriei, perifericelor (audio/video, GPS, WiFi), dispozitivelor de intrare/ieșire, rețelei și a consumului de energie. | + | - **Kernelul Linux** (cu unele modificări) conține driver-ele pentru diferitele componente hardware (ecran, cameră foto, tastatură, antenă WiFi, memorie flash, dispozitive audio), fiind responsabil cu gestiunea proceselor, memoriei, perifericelor (audio/video, GPS, WiFi), dispozitivelor de intrare/ieșire, rețelei și a consumului de energie; de asemenea, au fost implementate și unele îmbunătățiri: |
| + | - **Binder**, sistemul de comunicație inter-proces, a fost adaptat, întrucât reprezintă mediul de comunicație principal dintre aplicații și sistemul de operare, inclusiv funcțiile (serviciile) dispozitivului mobil; expunerea sa este realizată prin intermediul AIDL (Android Interface Definition Language) prin care pot fi manipulate obiecte transformate în primitive utilizate la comunicația propriu-zisă dintre aplicații și sistemul de operare; | ||
| + | - **Logger**, sistemul de jurnalizare, este esențial în cazul în care trebuie realizată depanarea aplicațiilor, în special pentru a detecta anumite situații particulare (informații cu privire la rețea, senzori); acesta este capabil să agrege datele provenite atât de la aplicația propriu-zisă cât și de la sistemul de operare, datele fiind disponibile prin intermediul unor utilitare specializate; | ||
| + | - sistemul prin intermediul căruia se previne transferul sistemului de operare într-o stare de latență (**wake locks**), în care consumul de energie este redus, întrucât se blochează execuția oricărei aplicații; utilizarea unui astfel de mecanism trebuie realizată cu precauție, întrucât poate determina epuizarea bateriei; | ||
| + | - sistemul de **alarme** oferă posibilitatea ca anumite sarcini să fie planificate la anumite momente de timp, putând fi executate, chiar dacă sistemul de operare se găsește într-o stare de latență; | ||
| + | - **Viking Killer** este un mecanism prin care sistemul de operare revendică memoria utilizată, atunci când nivelul acesteia atinge un anumit prag (aplicațiile Android care au fost rulate anterior sunt de regulă stocate în memorie pentru a se putea comuta rapid între ele, de vreme ce încărcarea în memorie este o operație costisitoare); | ||
| + | - **YAFFS2** (Yet Another Flash File System) este un sistem de fișiere adecvat pentru cipuri flash bazate pe porți NAND; platforma Android este stocată pe mai multe partiții, ceea ce îi conferă flexibilitate la actualizări, împiedicând modificarea sa în timpul rulării (''/boot'' - conține secvența de pornire, ''/system'' - stochează fișierele de sistem și aplicațiile încorporate, ''/recovery'' - deține o imagine din care se poate restaura sistemul de operare, ''/data'' - include aplicațiile instalate și datele aferente acestora, ''/cache'' - utilizată pentru fișiere temporare, folosind memoria RAM, pentru acces rapid). | ||
| - **Bibliotecile** (user-space) conțin codul care oferă principalele funcționalități a sistemului de operare Android, făcând legătura între kernel și aplicații. Sunt incluse aici motorul open-source pentru navigare WebKit, biblioteca FreeType pentru suportul seturilor de caractere, baza de date SQLite utilizată atât ca spațiu de stocare cât și pentru partajarea datelor specifice aplicațiilor, biblioteca libc (Bionic), biblioteca de sistem C bazată pe BSD și optimizată pentru dispozitive mobile bazate pe Linux, biblioteci pentru redarea și înregistrarea de conținut audio/video (bazate pe OpenCORE de la PacketVideo), biblioteci SSL pentru asigurarea securității pe Internet și Surface Manager, bibliotecă pentru controlul accesului la sistemul de afișare care suportă 2D și 3D. Aceste biblioteci nu sunt expuse prin API, reprezentând detalii de implementare Android. | - **Bibliotecile** (user-space) conțin codul care oferă principalele funcționalități a sistemului de operare Android, făcând legătura între kernel și aplicații. Sunt incluse aici motorul open-source pentru navigare WebKit, biblioteca FreeType pentru suportul seturilor de caractere, baza de date SQLite utilizată atât ca spațiu de stocare cât și pentru partajarea datelor specifice aplicațiilor, biblioteca libc (Bionic), biblioteca de sistem C bazată pe BSD și optimizată pentru dispozitive mobile bazate pe Linux, biblioteci pentru redarea și înregistrarea de conținut audio/video (bazate pe OpenCORE de la PacketVideo), biblioteci SSL pentru asigurarea securității pe Internet și Surface Manager, bibliotecă pentru controlul accesului la sistemul de afișare care suportă 2D și 3D. Aceste biblioteci nu sunt expuse prin API, reprezentând detalii de implementare Android. | ||
| - | - **Motorul Android** este reprezentat de: | + | - **Motorul Android** rulează serviciile de platformă precum și aplicațiile care le utilizează, fiind reprezentat de: |
| - | - un set de **biblioteci de bază** care permit utilizatorilor să dezvolte aplicații Android folosind limbajul de programare Java; acestea includ acces la funcțiile telefonului (telefonie, mesaje, resurse, locații), interfața cu utilizatorul, furnizori de conținut și gestiunea pachetelor (instalare, securitate) | + | - **ART (Android Runtime)** este mașina virtuală Java care a fost implementată începând cu versiunea 5.0, folosind un tip de compilare AOH (Ahead of Time), în care bytecode-ul este transpus în cod mașină la momentul instalării, astfel încât acesta este executat direct de mediul dispozitivului mobil; compatibilitatea cu versiuni anterioare (care folosesc mașina virtuală Dalvik, ce se bazează pe un compilator JIT - Just in Time) este asigurată prin transformarea pachetelor în format .dex (Dalvik Executable) la momentul compilării, urmând ca translatarea în format .oat să se realizeze la momentul instalării; fiecare aplicație Android rulează în procesul propriu, într-o instanță a mașinii virtuale ART, izolând astfel codul și datele sale prin intermediul unor permisiuni, care se aplică inclusiv la comunicația prin intermediul interfețelor de comunicare oferite de sistemul de operare Android; |
| - | - **mașina virtuală (Java) Dalvik** este optimizată special pentru Android (dispozitive mobile alimentate de o baterie, resurse de procesare și de memorie limitate, sistem de operare fără swap). Arhitectura sa se bazează pe regiștri, fiind echipată cu un compilator JIT (just-in-time), executabilul obținut putând fi modificat când este instalat pe dispozitivul mobil. Întrucât este utilizată o bibliotecă proprie ce pornește de la un subset al implementării Java realizată de Apache Harmony, nu sunt conținute pachetele pentru AWT / Swing, imprimare sau alte componente speciale. Prin urmare, deși de poate utiliza versiunea curentă de Java (7) pentru dezvoltarea aplicației, facilitățile ce pot fi folosite sunt limitate aproximativ la versiunea 6. Bytecode-ul este compilat în fișiere .dex - Dalvik Executable (în loc de .class), datele duplicate provenind din clase diferite (șiruri de caractere, alte constante) fiind incluse o singură dată, motiv pentru care un astfel de fișier necomprimat va avea o dimensiune mai mică decât o arhivă .jar (comprimată). De asemenea, se permite ca fiecare aplicație Android să ruleze în procesul propriu, într-o instanță a mașinii virtuale Dalvik. | + | - **Zygote** este procesul care gestionează toate aplicațiile, fiind lansat în execuție odată cu sistemul de operare: |
| + | - inițial, creează o instanță a mașinii virtuale Java pentru sistemul de operare Android, în contextul căreia plasează serviciile de bază: gestiunea energiei, telefonie, furnizori de conținut, gestiunea pachetelor, serviciul de localizare, serviciul de notificări; | ||
| + | - atunci când este necesar să lanseze în execuție o anumită aplicație, se clonează, partajând astfel componentele sistemului de operare Android, astfel încât să se asigure performanța (timp de execuție) și eficiența (memorie folosită), de vreme ce fiecare aplicație trebuie rulată în propria sa instanță a mașinii virtuale Java; | ||
| - **Cadrul pentru Aplicații** expune diferitele funcționalități ale sistemului de operare Android către programatori, astfel încât aceștia să le poată utiliza în aplicațiile lor. | - **Cadrul pentru Aplicații** expune diferitele funcționalități ale sistemului de operare Android către programatori, astfel încât aceștia să le poată utiliza în aplicațiile lor. | ||
| - | - La nivelul de **aplicații** se regăsesc atât produsele împreună cu care este livrat dispozitivul mobil (Calculator, Camera, Contacts, Clock, FM Radio, Music Player, S Note, S Planner, Video Player, Voice Recorder), cât și produsele instalate de pe Play Store sau cele dezvoltate de programatori. | + | - La nivelul de **aplicații** se regăsesc atât produsele împreună cu care este livrat dispozitivul mobil (Browser, Calculator, Camera, Contacts, Clock, FM Radio, Launcher, Music Player, Phone, S Note, S Planner, Video Player, Voice Recorder), cât și produsele instalate de pe Play Store sau cele dezvoltate de programatori. |
| ==== Funcționalități Android ==== | ==== Funcționalități Android ==== | ||
| Line 76: | Line 86: | ||
| ==== Android vs. iPhone ==== | ==== Android vs. iPhone ==== | ||
| - | Piața de telefoane inteligente este dominată de Android (care - potrivit estimărilor - își va menține supremația până îm 2018), cu 81.2% (peste un miliard de dispozitive vândute) pe întreg anul 2014, în ciuda revenirii spectaculoase a Apple odată cu lansarea Iphone 6 în luna septembrie, reușind să ajungă astfel la 15%, la nivel mondial. În privința tabletelor, Apple devansează de departe orice producător Android (având o cotă de piață de 33.8%), înregistrând însă o scădere cu 14.6% față de anul precedent, fapt ce reflectă de fapt întregul segment reprezentat de astfel de produse (Lenovo fiind singura excepție, cu o creștere a vânzărilor de 43.5% față de 2013). | + | Piața de telefoane inteligente este dominată de Android (care - potrivit estimărilor - își va menține supremația până în 2018), cu 82.8% (peste un miliard de dispozitive vândute) pe întreg anul 2015, în timp ce Apple deține doar 13.9%, la nivel mondial. |
| - | În 2014, numărul de aplicații disponibile pentru platforma Android le-a depășit pe cele destinată dispozitivelor Apple (1.5 milioane, comparativ cu 1.25 milioane). Și în privința numărului de descărcări Android se află în fața Apple cu aproximativ 25%. Totuși, politica de distribuție a aplicațiilor(faptul că aplicațiile iPhone pot fi instalate numai prin intermediul App Store, în timp ce Android pune la dispoziție mai multe posibilități - Play Store, Amazon App Store, prin conexiune USB de la calculator, prin email sau prin pagina Internet a organizației), la care se adaugă numărul mare de programe gratuite și posibilitatea de piratare mai ușoară se traduce prin încasările obținute, Apple generând un profit mult mai mare din aplicații decât Google (cifrele oficiale nu sunt disponibile încă). O altă explicație a acestei situații este dată și de potența financiară a posesorilor de produse Apple (valoarea unui iPhone fiind de aproximativ 600$) față de puterea de cumpărare a persoanelor ce dețin un telefon Android (al cărui preț mediu este de 200-300$), existând o corespondență directă cu disponibilitatea de a achiziționa aplicații. De asemenea, statisticile arată că utilizatorii Apple își folosesc mult mai intens dispozitivele pentru accesarea de conținut Internet decât cei cumpărătorii de produse echipate cu Android. | + | În 2015, numărul de aplicații disponibile pentru platforma Android le-a depășit pe cele destinată dispozitivelor Apple (1.6 milioane, comparativ cu 1.5 milioane). Și în privința numărului de descărcări Android se află în fața Apple cu aproximativ 25%. Totuși, politica de distribuție a aplicațiilor (faptul că aplicațiile iPhone pot fi instalate numai prin intermediul App Store, în timp ce Android pune la dispoziție mai multe posibilități - Play Store, Amazon App Store, prin conexiune USB de la calculator, prin email sau prin pagina Internet a organizației), la care se adaugă numărul mare de programe gratuite și posibilitatea de piratare mai ușoară se traduce prin încasările obținute, Apple generând un profit mult mai mare din aplicații decât Google (cifrele oficiale nu sunt disponibile încă). O altă explicație a acestei situații este dată și de potența financiară a posesorilor de produse Apple (valoarea unui iPhone fiind de aproximativ 600$) față de puterea de cumpărare a persoanelor ce dețin un telefon Android (al cărui preț mediu este de 200-300$), existând o corespondență directă cu disponibilitatea de a achiziționa aplicații. De asemenea, statisticile arată că utilizatorii Apple își folosesc mult mai intens dispozitivele pentru accesarea de conținut Internet decât cei cumpărătorii de produse echipate cu Android. |
| Aplicațiile destinate dispozitivelor mobile reprezintă un segment extrem de productiv al economiei, doar vânzările din AppStore depășind încasările obținute din producția de filme de la Holywood. Ca tematică, cele mai multe aplicații aparțin domeniului social (jocuri, fotografie, muzică, aplicații culinare, stil de viață), urmate de cele destinate gestionării unor segmente ale unor afaceri. | Aplicațiile destinate dispozitivelor mobile reprezintă un segment extrem de productiv al economiei, doar vânzările din AppStore depășind încasările obținute din producția de filme de la Holywood. Ca tematică, cele mai multe aplicații aparțin domeniului social (jocuri, fotografie, muzică, aplicații culinare, stil de viață), urmate de cele destinate gestionării unor segmente ale unor afaceri. | ||
| - | În privința limbajului de programare utilizat pentru dezvoltarea de aplicații mobile, iPhone folosește **Objective-C**, similar cu C++, care nu se bucură însă de o răspândire prea largă (cu excepția aplicațiilor pentru iPhone), în timp ce Android utilizează **Java** (limbajul de programare cel mai adoptat pe scară largă în cadrul corporațiilor) dar și **C/C++**, prin care se pot apela (cu o oarecare dificultate) aplicații native, prin suport JNI (numărul bibliotecilor disponibile în cazul C/C++ este mai redus decât în Java, însă viteza aplicațiilor este mai mare). Dezvoltarea aplicațiilor pentru iPhone se poate realiza numai folosind mașini Mac (echipate cu MacOS), în timp ce aplicațiile Android pot fi scrise în orice sistem de operare cu Java și Eclipse (atât PC-uri cât și Mac-uri echipate cu Windows, Linux sau MacOS). În această situație, se pune problema cotelor de piață ale sistemelor de operare în cadrul companiilor dezvoltatoare de software, care creează sau nu oportunități pentru dezvoltarea unui anumit tip de aplicații (la începutul lui 2014, sistemele de operare Windows dețineau 92,51% din piață, OS X 7,11%, sistemele de operare cu kernel Linux 1,34%, iar alte sisteme de operare 0,51%). | + | În privința limbajului de programare utilizat pentru dezvoltarea de aplicații mobile, iPhone folosește **Objective-C**, similar cu C++, care nu se bucură însă de o răspândire prea largă (cu excepția aplicațiilor pentru iPhone), în timp ce Android utilizează **Java** (limbajul de programare cel mai adoptat pe scară largă în cadrul corporațiilor) dar și **C/C++**, prin care se pot apela (cu o oarecare dificultate) aplicații native, prin suport JNI (numărul bibliotecilor disponibile în cazul C/C++ este mai redus decât în Java, însă viteza aplicațiilor este mai mare). Dezvoltarea aplicațiilor pentru iPhone se poate realiza numai folosind mașini Mac (echipate cu MacOS), în timp ce aplicațiile Android pot fi scrise în orice sistem de operare cu Java și Eclipse (atât PC-uri cât și Mac-uri echipate cu Windows, Linux sau MacOS). În această situație, se pune problema cotelor de piață ale sistemelor de operare în cadrul companiilor dezvoltatoare de software, care creează sau nu oportunități pentru dezvoltarea unui anumit tip de aplicații (la începutul lui 2016, sistemele de operare Windows dețineau 90,60% din piață, OS X 7,68%, sistemele de operare cu kernel Linux 1,71%, iar alte sisteme de operare 0,01%). |
| Așadar, dacă pentru utilizare personală nu se poate stabili un câștigător clar între Android și iPhone (deși produsul celor de la Apple pare să aibă un ușor avantaj printr-un număr mai mare de aplicații și prin loialitatea clienților), în cazul aplicațiilor dezvoltate de corporații situația este inversă, date fiind posibilitățile de instalare și limbajul de programare folosit. | Așadar, dacă pentru utilizare personală nu se poate stabili un câștigător clar între Android și iPhone (deși produsul celor de la Apple pare să aibă un ușor avantaj printr-un număr mai mare de aplicații și prin loialitatea clienților), în cazul aplicațiilor dezvoltate de corporații situația este inversă, date fiind posibilitățile de instalare și limbajul de programare folosit. | ||
| Line 105: | Line 115: | ||
| - [[tutoriale:genymotion|Genymotion]] | - [[tutoriale:genymotion|Genymotion]] | ||
| - [[tutoriale:android_virtual_device|Android Virtual Device]] (livrat împreună cu SDK-ul de Android) | - [[tutoriale:android_virtual_device|Android Virtual Device]] (livrat împreună cu SDK-ul de Android) | ||
| - | - un telefon mobil cu sistemul de operare Android pentru care s-a dezvoltat aplicația\\ Pentru a se putea rula o aplicație pe un dispozitiv mobil fizic, trebuie să se activeze posibilitatea de depanare prin USB, din //Dev Tools// → //Developer options// → //Debugging// → //USB debugging//.\\ \\ {{ :laboratoare:laborator01:debugging.png?nolink&400 }} | + | - un telefon mobil cu sistemul de operare Android pentru care s-a dezvoltat aplicația\\ \\ Pentru a se putea rula o aplicație pe un dispozitiv mobil fizic, trebuie să se activeze posibilitatea de depanare prin USB, din //Settings// → //System// → //Developer Options//. Această opțiune trebuie activată, ca de altfel și opțiunea //Debugging// → //Android Debugging// (pe unele sisteme poate apărea ca //USB Debugging//).\\ \\ {{ :laboratoare:laborator01:android_debugging01.png?nolink&400 }}\\ \\ În situația în care opțiunea //Developer Options// nu este disponibilă, aceasta poate fi vizualizată prin intermediul modului //Developer//, obțiunut prin apăsarea de mai multe ori asupra opțiunii //Build Number// din secțiunea //Settings// → //System// → //About Phone//.\\ \\ {{ :laboratoare:laborator01:android_debugging02.png?nolink&400 }} |
| + | |||
| + | Dacă telefonul nu este recunoscut la conectarea prin USB, trebuie instalate niște reguli pentru udev, conform instrucțiunilor de pe [[http://unix.stackexchange.com/questions/119128/linux-mint-16-android-device-not-listed-with-lsusb|stackexchange]]: | ||
| + | |||
| + | <code> | ||
| + | student@eim2016:~$ sudo bash | ||
| + | student@eim2016:~# lsusb | ||
| + | </code> | ||
| + | |||
| + | După ce s-a identificat dispozitivul mobil (prin intermediul comenzii ''lsusb''), se precizează o regulă pentru acesta: | ||
| + | |||
| + | <code> | ||
| + | student@eim2016:~# gedit /etc/udev/rules.d/51-android.rules | ||
| + | </code> | ||
| + | |||
| + | <file text /etc/udev/rules.d/51-android.rules> | ||
| + | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0660", GROUP="plugdev", SYMLINK+="android%n" | ||
| + | </file> | ||
| + | |||
| + | Se reîncarcă dispozitivele conectate prin USB: | ||
| + | |||
| + | <code> | ||
| + | student@eim2016:~# /etc/init.d/udev restart | ||
| + | </code> | ||
| + | |||
| + | Mai multe informații sunt disponibile și la [[http://blog.janosgyerik.com/adding-udev-rules-for-usb-debugging-android-devices/]]. | ||
| ===== Sisteme de control a versiunilor ===== | ===== Sisteme de control a versiunilor ===== | ||
| Line 150: | Line 185: | ||
| Informații suplimentare cu privire la comenzile Git și sintaxa acestora pot fi obținute folosind paginile de manual: | Informații suplimentare cu privire la comenzile Git și sintaxa acestora pot fi obținute folosind paginile de manual: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git help <command> | + | student@eim2016:~$ git help <command> |
| - | student@pdsd2015:~$ git <command> --help | + | student@eim2016:~$ git <command> --help |
| - | student@pdsd2015:~$ man git-<command> | + | student@eim2016:~$ man git-<command> |
| </code> | </code> | ||
| Line 160: | Line 195: | ||
| În cazul în care se dorește monitorizarea unui proiect nou / existent prin sistemul de control al versiunilor Git, directorul în care se găsește acesta va trebui inițializat folosind comanda: | În cazul în care se dorește monitorizarea unui proiect nou / existent prin sistemul de control al versiunilor Git, directorul în care se găsește acesta va trebui inițializat folosind comanda: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git init | + | student@eim2016:~$ git init |
| </code> | </code> | ||
| Astfel, se creează un director ''.git'' în care vor fi plasate toate versiunile fișierelor care sunt monitorizate. Inițial, acesta este vid. | Astfel, se creează un director ''.git'' în care vor fi plasate toate versiunile fișierelor care sunt monitorizate. Inițial, acesta este vid. | ||
| Line 178: | Line 213: | ||
| * ''URL'' - reprezintă adresa serverului la distanță care găzduiește proiectul, putând fi utilizate în acest sens mai multe protocoale pentru transferul de informație | * ''URL'' - reprezintă adresa serverului la distanță care găzduiește proiectul, putând fi utilizate în acest sens mai multe protocoale pentru transferul de informație | ||
| * git <code> | * git <code> | ||
| - | student@pdsd2015:~$ git clone git://github.com/pdsd2015/Laborator01.git | + | student@eim2016:~$ git clone git://github.com/eim2016/Laborator01.git |
| </code> | </code> | ||
| * https <code> | * https <code> | ||
| - | student@pdsd2015:~$ git clone https://github.com/pdsd2015/Laborator01 | + | student@eim2016:~$ git clone https://github.com/eim2016/Laborator01 |
| </code> | </code> | ||
| * ssh <code> | * ssh <code> | ||
| - | student@pdsd2015:~$ git clone git@github.com:pdsd2015/Laborator01.git | + | student@eim2016:~$ git clone git@github.com:eim2016/Laborator01.git |
| </code> | </code> | ||
| * ''local_directory'' (opțional) - denumirea directorului local în care va fi stocată versiunea curentă a proiectului (precum și istoricul din directorul Git), în cazul în care se dorește schimbarea acestuia | * ''local_directory'' (opțional) - denumirea directorului local în care va fi stocată versiunea curentă a proiectului (precum și istoricul din directorul Git), în cazul în care se dorește schimbarea acestuia | ||
| Line 199: | Line 234: | ||
| O astfel de comandă poate întoarce mai multe rezultate: | O astfel de comandă poate întoarce mai multe rezultate: | ||
| * toate fișierele din directorul de lucru se regăsesc întocmai și în directorul Git (nu au fost realizate modificări <code> | * toate fișierele din directorul de lucru se regăsesc întocmai și în directorul Git (nu au fost realizate modificări <code> | ||
| - | student@pdsd2015:~$ git status | + | student@eim2016:~$ git status |
| On branch master | On branch master | ||
| Your branch is up-to-date with 'origin/master'. | Your branch is up-to-date with 'origin/master'. | ||
| Line 206: | Line 241: | ||
| </code> | </code> | ||
| * există date în zona de lucru care nu sunt monitorizate (nu au făcut parte dintr-un instantaneu anterior), care vor fi consemnate numai în situația în care se specifică acest lucru în mod explicit; acest mecanism urmărește ca fișierele generate să nu fie incluse în mod eronat în directorul Git <code> | * există date în zona de lucru care nu sunt monitorizate (nu au făcut parte dintr-un instantaneu anterior), care vor fi consemnate numai în situația în care se specifică acest lucru în mod explicit; acest mecanism urmărește ca fișierele generate să nu fie incluse în mod eronat în directorul Git <code> | ||
| - | student@pdsd2015:~$ git status | + | student@eim2016:~$ git status |
| On branch master | On branch master | ||
| Your branch is up-to-date with 'origin/master'. | Your branch is up-to-date with 'origin/master'. | ||
| Line 218: | Line 253: | ||
| </code> Monitorizarea acestor date se face prin intermediul comenzii **''git add <files/directory>''**, care suportă specificarea de expresii regulate desemnând măști pentru indicarea mai multor fișiere/directoare. | </code> Monitorizarea acestor date se face prin intermediul comenzii **''git add <files/directory>''**, care suportă specificarea de expresii regulate desemnând măști pentru indicarea mai multor fișiere/directoare. | ||
| * există informații în zona de așteptare care vor fi incluse în următorul instantaneu în momentul în care se va realiza consemnarea (trecute în secțiunea ''Changes to be committed''); eventualele fișiere care au existat în instantanee anterioare și au fost modificate în directorul de lucru nu vor fi marcate ca făcând parte din zona de așteptare (trecute în secțiunea ''Changes not staged for commit'') dacă versiunile respective nu vor fi incluse în mod explicit prin comanda **''git add <files/directory>''** <code> | * există informații în zona de așteptare care vor fi incluse în următorul instantaneu în momentul în care se va realiza consemnarea (trecute în secțiunea ''Changes to be committed''); eventualele fișiere care au existat în instantanee anterioare și au fost modificate în directorul de lucru nu vor fi marcate ca făcând parte din zona de așteptare (trecute în secțiunea ''Changes not staged for commit'') dacă versiunile respective nu vor fi incluse în mod explicit prin comanda **''git add <files/directory>''** <code> | ||
| - | student@pdsd2015:~$ git status | + | student@eim2016:~$ git status |
| On branch master | On branch master | ||
| Your branch is up-to-date with 'origin/master'. | Your branch is up-to-date with 'origin/master'. | ||
| Line 245: | Line 280: | ||
| new file: MyFirstAndroidApplication/res/values/strings.xml | new file: MyFirstAndroidApplication/res/values/strings.xml | ||
| new file: MyFirstAndroidApplication/res/values/styles.xml | new file: MyFirstAndroidApplication/res/values/styles.xml | ||
| - | new file: MyFirstAndroidApplication/src/ro/pub/cs/systems/pdsd/lab01/MainActivity.java | + | new file: MyFirstAndroidApplication/src/ro/pub/cs/systems/eim/lab01/MainActivity.java |
| Changes not staged for commit: | Changes not staged for commit: | ||
| Line 263: | Line 298: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git add MyFirstAndroidApplication/* | + | student@eim2016:~$ git add MyFirstAndroidApplication/* |
| </code> | </code> | ||
| Line 275: | Line 310: | ||
| <note tip>Comanda ''git mv <source> <target>'' este echivalentă cu aceeași succesiune de operații: <code> | <note tip>Comanda ''git mv <source> <target>'' este echivalentă cu aceeași succesiune de operații: <code> | ||
| - | student@pdsd2015:~$ mv <source> <target> | + | student@eim2016:~$ mv <source> <target> |
| - | student@pdsd2015:~$ git rm <source> | + | student@eim2016:~$ git rm <source> |
| - | student@pdsd2015:~$ git add <target> | + | student@eim2016:~$ git add <target> |
| </code></note> | </code></note> | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git mv README.md README.txt | + | student@eim2016:~$ git mv README.md README.txt |
| </code> | </code> | ||
| Line 291: | Line 326: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git rm LICENSE | + | student@eim2016:~$ git rm LICENSE |
| rm 'LICENSE' | rm 'LICENSE' | ||
| </code> | </code> | ||
| Line 342: | Line 377: | ||
| === Vizualizarea modificărilor === | === Vizualizarea modificărilor === | ||
| Prin intermediul comenzii **''git diff''**, utilizatorul are posibilitatea de a vizualiza în ce constau actualizările pentru fiecare fișier în parte. | Prin intermediul comenzii **''git diff''**, utilizatorul are posibilitatea de a vizualiza în ce constau actualizările pentru fiecare fișier în parte. | ||
| - | * rulată fără parametri, comanda indică diferențele pentru fișierele care au fost modificate, dar nu au fost marcate pentru a fi incluse în următorul instantaneu (cu alte cuvinte, sunt indicate diferențele dintre zona de lucru și zona de așteptare) <code>student@pdsd2015:~$ git diff | + | * rulată fără parametri, comanda indică diferențele pentru fișierele care au fost modificate, dar nu au fost marcate pentru a fi incluse în următorul instantaneu (cu alte cuvinte, sunt indicate diferențele dintre zona de lucru și zona de așteptare) <code>student@eim2016:~$ git diff |
| diff --git a/README.md b/README.md | diff --git a/README.md b/README.md | ||
| Line 352: | Line 387: | ||
| +MyFirstAndroidApplication | +MyFirstAndroidApplication | ||
| +========================= | +========================= | ||
| - | +A simple application displaying a dialog in which the user is asked to provide his/her name in order to be properly greeted to the PDSD laboratory. | + | +A simple application displaying a dialog in which the user is asked to provide his/her name in order to be properly greeted to the EIM laboratory. |
| </code> | </code> | ||
| <note>Dacă toate fișierele din zona de lucru au fost fie marcate pentru a fi incluse în următorul instantaneu, fie sunt ignorate, rezultatul comenzii ''git diff'' va fi vid.</note> | <note>Dacă toate fișierele din zona de lucru au fost fie marcate pentru a fi incluse în următorul instantaneu, fie sunt ignorate, rezultatul comenzii ''git diff'' va fi vid.</note> | ||
| - | * rulată cu parametrul ''%%--cached%%'' sau ''%%--staged%%'' (disponibil din versiunea 1.6.1, efectul este identic), comanda indică diferențele pentru fișierele care au fost marcate pentru a fi incluse în următorul instantaneu, față de situația existentă în directorul Git (cu alte cuvinte, sunt indicate diferențele dintre zona de așteptare și directorul Git) <code>student@pdsd2015:~$ git diff --staged | + | * rulată cu parametrul ''%%--cached%%'' sau ''%%--staged%%'' (disponibil din versiunea 1.6.1, efectul este identic), comanda indică diferențele pentru fișierele care au fost marcate pentru a fi incluse în următorul instantaneu, față de situația existentă în directorul Git (cu alte cuvinte, sunt indicate diferențele dintre zona de așteptare și directorul Git) <code>student@eim2016:~$ git diff --staged |
| diff --git a/MyFirstAndroidApplication/.classpath b/MyFirstAndroidApplication/.classpath | diff --git a/MyFirstAndroidApplication/.classpath b/MyFirstAndroidApplication/.classpath | ||
| Line 384: | Line 419: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git commit -m "initial commit: graphical user interface, some code to handle the button click" | + | student@eim2016:~$ git commit -m "initial commit: graphical user interface, some code to handle the button click" |
| [master 95fa0b2] initial commit: graphical user interface, some code to handle the button click | [master 95fa0b2] initial commit: graphical user interface, some code to handle the button click | ||
| 21 files changed, 300 insertions(+) | 21 files changed, 300 insertions(+) | ||
| Line 407: | Line 442: | ||
| create mode 100644 MyFirstAndroidApplication/res/values/strings.xml | create mode 100644 MyFirstAndroidApplication/res/values/strings.xml | ||
| create mode 100644 MyFirstAndroidApplication/res/values/styles.xml | create mode 100644 MyFirstAndroidApplication/res/values/styles.xml | ||
| - | create mode 100644 MyFirstAndroidApplication/src/ro/pub/cs/systems/pdsd/lab01/MainActivity.java | + | create mode 100644 MyFirstAndroidApplication/src/ro/pub/cs/systems/eim/lab01/MainActivity.java |
| </code> | </code> | ||
| Se observă că în rezultatul acestei comenzi sunt indicate ramificația pe care se face consemnarea (''master''), suma de control SHA-1 a consemnării (''95fa0b2''), numărul de fișiere modificate (''21'') precum și statistici cu privire la numărul de linii adăugate (''300''), respectiv eliminate (''0''). | Se observă că în rezultatul acestei comenzi sunt indicate ramificația pe care se face consemnarea (''master''), suma de control SHA-1 a consemnării (''95fa0b2''), numărul de fișiere modificate (''21'') precum și statistici cu privire la numărul de linii adăugate (''300''), respectiv eliminate (''0''). | ||
| <note tip>Consemnarea va transfera în directorul Git numai acele fișiere care au fost marcate în acest sens, existând în zona de așteptare. Dacă se dorește să se realizeze transferul direct din zona de lucru în directorul Git, fără a mai trece în zona de așteptare (doar pentru fișierele monitorizate care au fost modificate), comanda ''%%git commit -m "<message>"%%'' trebuie rulată și cu parametrul ''-a''. <code> | <note tip>Consemnarea va transfera în directorul Git numai acele fișiere care au fost marcate în acest sens, existând în zona de așteptare. Dacă se dorește să se realizeze transferul direct din zona de lucru în directorul Git, fără a mai trece în zona de așteptare (doar pentru fișierele monitorizate care au fost modificate), comanda ''%%git commit -m "<message>"%%'' trebuie rulată și cu parametrul ''-a''. <code> | ||
| - | student@pdsd2015:~$ git commit -a -m "initial commit: graphical user interface, some code to handle the button click" | + | student@eim2016:~$ git commit -a -m "initial commit: graphical user interface, some code to handle the button click" |
| </code> Într-un astfel de caz, nu mai este necesar ca în prealabil să se ruleze comanda ''git add''.</note> | </code> Într-un astfel de caz, nu mai este necesar ca în prealabil să se ruleze comanda ''git add''.</note> | ||
| Line 421: | Line 456: | ||
| Git oferă posibilitatea de a defini două tipuri de etichete, prin intermediul comenzii **''git tag''**: | Git oferă posibilitatea de a defini două tipuri de etichete, prin intermediul comenzii **''git tag''**: | ||
| * **etichete 'ușoare'** (//eng.// lightweight) pentru care nu se rețin informații suplimentare, cu excepția sumei de control asociate consemnării respective; de regulă, sunt folosite pentru resurse temporare sau în situația în care informațiile asociate nu sunt necesare <code> | * **etichete 'ușoare'** (//eng.// lightweight) pentru care nu se rețin informații suplimentare, cu excepția sumei de control asociate consemnării respective; de regulă, sunt folosite pentru resurse temporare sau în situația în care informațiile asociate nu sunt necesare <code> | ||
| - | student@pdsd2015:~$ git tag v1.0 | + | student@eim2016:~$ git tag v1.0 |
| </code> | </code> | ||
| * **etichete adnotate** care sunt stocate ca obiecte de sine stătătoare în directorul Git, reținându-se numele și adresa de poștă electronică a utilizatorului care a realizat-o, un mesaj asociat (informații distincte de cele ale consemnării asociate etichetei) precum și suma de control <code> | * **etichete adnotate** care sunt stocate ca obiecte de sine stătătoare în directorul Git, reținându-se numele și adresa de poștă electronică a utilizatorului care a realizat-o, un mesaj asociat (informații distincte de cele ale consemnării asociate etichetei) precum și suma de control <code> | ||
| - | student@pdsd2015:~$ git tag -a v1.0 -m 'an annotated tag for the first release version' | + | student@eim2016:~$ git tag -a v1.0 -m 'an annotated tag for the first release version' |
| </code> Etichetele de acest tip pot fi **semnate** folosind GPG (GNU Privacy Guard), dacă utilizatorul dispune de o cheie privată, acestea având avantajul că pot fi verificate <code> | </code> Etichetele de acest tip pot fi **semnate** folosind GPG (GNU Privacy Guard), dacă utilizatorul dispune de o cheie privată, acestea având avantajul că pot fi verificate <code> | ||
| - | student@pdsd2015:~$ git tag -s v1.0 -m 'a signed tag for the first release version' | + | student@eim2016:~$ git tag -s v1.0 -m 'a signed tag for the first release version' |
| </code> Verificarea unei etichete semnate se face prin intermediul comenzii **''git tag -v <tag_name>''**, fiind necesară existența cheii publice a utilizatorului care a semnat-o.\\ Așadar, opțiunile cu care se poate rulează comanda ''git tag'' în cazul unei etichete adnotate sunt: | </code> Verificarea unei etichete semnate se face prin intermediul comenzii **''git tag -v <tag_name>''**, fiind necesară existența cheii publice a utilizatorului care a semnat-o.\\ Așadar, opțiunile cu care se poate rulează comanda ''git tag'' în cazul unei etichete adnotate sunt: | ||
| * ''-a'': specifică faptul că este vorba despre o etichetă nesemnată | * ''-a'': specifică faptul că este vorba despre o etichetă nesemnată | ||
| Line 435: | Line 470: | ||
| Lista tuturor etichetelor asociate unui proiect poate fi consultată dacă se rulează comanda **''git tag''** fără nici un parametru: | Lista tuturor etichetelor asociate unui proiect poate fi consultată dacă se rulează comanda **''git tag''** fără nici un parametru: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git tag | + | student@eim2016:~$ git tag |
| v1.0 | v1.0 | ||
| </code> | </code> | ||
| Line 442: | Line 477: | ||
| Dacă se dorește consultarea conținutului unei etichete, se poate utiliza comanda **''git show <tag>''**, prin care sunt listate toate informațiile asociate versiunii respective. | Dacă se dorește consultarea conținutului unei etichete, se poate utiliza comanda **''git show <tag>''**, prin care sunt listate toate informațiile asociate versiunii respective. | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git show v1.0 | + | student@eim2016:~$ git show v1.0 |
| commit 5e4b82a0783e5841e5c5241d44104e8b15e4270f | commit 5e4b82a0783e5841e5c5241d44104e8b15e4270f | ||
| - | Author: pdsd2015 <pdsd2015@andreirosucojocaru.ro> | + | Author: eim2016 <informaticamobila2016@gmail.com> |
| Date: Sun Feb 22 18:00:00 2015 +0300 | Date: Sun Feb 22 18:00:00 2015 +0300 | ||
| Line 452: | Line 487: | ||
| În situația în care o versiune a fost consemnată fără a i se asocia o etichetă, o astfel de operație poate fi realizată și ulterior, adăugând la comanda ''git tag'' suma de control asociată respectivei versiuni (obținută ca rezultat al comenzii ''git log''). | În situația în care o versiune a fost consemnată fără a i se asocia o etichetă, o astfel de operație poate fi realizată și ulterior, adăugând la comanda ''git tag'' suma de control asociată respectivei versiuni (obținută ca rezultat al comenzii ''git log''). | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git tag -a v1.1 -m 'version 1.1' e71c1c4b1b9818292b4cda084e47e25bfb573507 | + | student@eim2016:~$ git tag -a v1.1 -m 'version 1.1' e71c1c4b1b9818292b4cda084e47e25bfb573507 |
| </code> | </code> | ||
| Line 499: | Line 534: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git log --pretty=format:"%h - %an [%ae] - %ar -> %s" --graph | + | student@eim2016:~$ git log --pretty=format:"%h - %an [%ae] - %ar -> %s" --graph |
| * df5829c - andreirosucojocaru [andrei.rosucojocaru@gmail.com] - 5 minutes ago -> resolved conflicts among customized_message and fade_effect branches | * df5829c - andreirosucojocaru [andrei.rosucojocaru@gmail.com] - 5 minutes ago -> resolved conflicts among customized_message and fade_effect branches | ||
| |\ | |\ | ||
| Line 506: | Line 541: | ||
| |/ | |/ | ||
| * 839f14e - andreirosucojocaru [andrei.rosucojocaru@gmail.com] - 42 minutes ago -> initial commit: graphical user interface, some code to handle the button click | * 839f14e - andreirosucojocaru [andrei.rosucojocaru@gmail.com] - 42 minutes ago -> initial commit: graphical user interface, some code to handle the button click | ||
| - | * e2594f8 - pdsd2015 [pdsd2015@andreirosucojocaru.ro] - 2 days ago -> Initial commit | + | * e2594f8 - eim2016 [informaticamobila2016@gmail.com] - 2 days ago -> Initial commit |
| </code> | </code> | ||
| ==== Gestiunea depozitelor la distanță (obligatoriu) ==== | ==== Gestiunea depozitelor la distanță (obligatoriu) ==== | ||
| Line 517: | Line 552: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git remote -v | + | student@eim2016:~$ git remote -v |
| Laborator01_andreirosucojocaru git@github.com:andreirosucojocaru/Laborator01.git (fetch) | Laborator01_andreirosucojocaru git@github.com:andreirosucojocaru/Laborator01.git (fetch) | ||
| Laborator01_andreirosucojocaru git@github.com:andreirosucojocaru/Laborator01.git (push) | Laborator01_andreirosucojocaru git@github.com:andreirosucojocaru/Laborator01.git (push) | ||
| - | origin https://github.com/pdsd2015/Laborator01 (fetch) | + | origin https://github.com/eim2016/Laborator01 (fetch) |
| - | origin https://github.com/pdsd2015/Laborator01 (push) | + | origin https://github.com/eim2016/Laborator01 (push) |
| </code> | </code> | ||
| Line 536: | Line 571: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git remote add Laborator01_andreirosucojocaru git@github.com:andreirosucojocaru/Laborator01.git | + | student@eim2016:~$ git remote add Laborator01_andreirosucojocaru git@github.com:andreirosucojocaru/Laborator01.git |
| </code> | </code> | ||
| Line 542: | Line 577: | ||
| Pentru a descărca cod sursă aflat într-un depozit găzduit de un server la distanță pe discul local există trei posibilități: | Pentru a descărca cod sursă aflat într-un depozit găzduit de un server la distanță pe discul local există trei posibilități: | ||
| * comanda **''git clone <URL>''** realizează o copie a datelor aflate la locația indicată de URL, inclusiv a tuturor ramificațiilor (//eng.// branches), ramificația ''master'' (în situația în care există) de pe server fiind monitorizată pentru modificări, astfel încât acestea să fie integrate automat (//eng.// merged) în codul sursă din directorul de lucru <code> | * comanda **''git clone <URL>''** realizează o copie a datelor aflate la locația indicată de URL, inclusiv a tuturor ramificațiilor (//eng.// branches), ramificația ''master'' (în situația în care există) de pe server fiind monitorizată pentru modificări, astfel încât acestea să fie integrate automat (//eng.// merged) în codul sursă din directorul de lucru <code> | ||
| - | student@pdsd2015:~$ git clone https://github.com/pdsd2015/Laborator01.git | + | student@eim2016:~$ git clone https://github.com/eim2016/Laborator01.git |
| Cloning into 'Laborator01'... | Cloning into 'Laborator01'... | ||
| remote: Counting objects: 5, done. | remote: Counting objects: 5, done. | ||
| Line 551: | Line 586: | ||
| </code> | </code> | ||
| * comanda **''git fetch <remote_name>''** descarcă toate informațiile din depozitul de pe serverul la distanță care nu se regăsesc pe discul local, creându-se referințe către ramificația de la locația respectivă, care pot fi consultate pentru ca ulterior să fie integrate <code> | * comanda **''git fetch <remote_name>''** descarcă toate informațiile din depozitul de pe serverul la distanță care nu se regăsesc pe discul local, creându-se referințe către ramificația de la locația respectivă, care pot fi consultate pentru ca ulterior să fie integrate <code> | ||
| - | student@pdsd2015:~$ git fetch Laborator01_andreirosucojocaru | + | student@eim2016:~$ git fetch Laborator01_andreirosucojocaru |
| remote: Counting objects: 39, done. | remote: Counting objects: 39, done. | ||
| remote: Compressing objects: 100% (19/19), done. | remote: Compressing objects: 100% (19/19), done. | ||
| Line 566: | Line 601: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git push origin master | + | student@eim2016:~$ git push origin master |
| Counting objects: 47, done. | Counting objects: 47, done. | ||
| Delta compression using up to 2 threads. | Delta compression using up to 2 threads. | ||
| Line 572: | Line 607: | ||
| Writing objects: 100% (45/45), 891.37 KiB | 0 bytes/s, done. | Writing objects: 100% (45/45), 891.37 KiB | 0 bytes/s, done. | ||
| Total 45 (delta 2), reused 0 (delta 0) | Total 45 (delta 2), reused 0 (delta 0) | ||
| - | To https://github.com/pdsd2015/Laborator01 | + | To https://github.com/eim2016/Laborator01 |
| e2594f8..839f14e master -> master | e2594f8..839f14e master -> master | ||
| </code> | </code> | ||
| Line 587: | Line 622: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git remote show origin | + | student@eim2016:~$ git remote show origin |
| * remote origin | * remote origin | ||
| - | Fetch URL: https://github.com/pdsd2015/Laborator01 | + | Fetch URL: https://github.com/eim2016/Laborator01 |
| - | Push URL: https://github.com/pdsd2015/Laborator01 | + | Push URL: https://github.com/eim2016/Laborator01 |
| HEAD branch: master | HEAD branch: master | ||
| Remote branch: | Remote branch: | ||
| Line 604: | Line 639: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git remote rename Laborator01_andreirosucojocaru Lab01_arc | + | student@eim2016:~$ git remote rename Laborator01_andreirosucojocaru Lab01_arc |
| </code> | </code> | ||
| Line 613: | Line 648: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git remote rm Lab00_arc | + | student@eim2016:~$ git remote rm Lab00_arc |
| </code> | </code> | ||
| Line 635: | Line 670: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git branch | + | student@eim2016:~$ git branch |
| customized_message | customized_message | ||
| fade_effect | fade_effect | ||
| Line 657: | Line 692: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git branch customized_message | + | student@eim2016:~$ git branch customized_message |
| - | student@pdsd2015:~$ git branch fade_effect | + | student@eim2016:~$ git branch fade_effect |
| </code> | </code> | ||
| Line 665: | Line 700: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git checkout customized_message | + | student@eim2016:~$ git checkout customized_message |
| Switched to branch 'customized_message' | Switched to branch 'customized_message' | ||
| </code> | </code> | ||
| Line 676: | Line 711: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git checkout -b customized_message | + | student@eim2016:~$ git checkout -b customized_message |
| Switched to a new branch 'customized_message' | Switched to a new branch 'customized_message' | ||
| </code> | </code> | ||
| Line 690: | Line 725: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git checkout master | + | student@eim2016:~$ git checkout master |
| Switched to branch 'master' | Switched to branch 'master' | ||
| - | student@pdsd2015:~$ git merge customized_message | + | student@eim2016:~$ git merge customized_message |
| Updating 839f14e..e1a9a2e | Updating 839f14e..e1a9a2e | ||
| Fast-forward | Fast-forward | ||
| - | .../src/ro/pub/cs/systems/pdsd/lab01/MainActivity.java | 1 + | + | .../src/ro/pub/cs/systems/eim/lab01/MainActivity.java | 1 + |
| 1 file changed, 1 insertion(+) | 1 file changed, 1 insertion(+) | ||
| - | student@pdsd2015:~$ git merge fade_effect | + | student@eim2016:~$ git merge fade_effect |
| - | Auto-merging MyFirstAndroidApplication/src/ro/pub/cs/systems/pdsd/lab01/MainActivity.java | + | Auto-merging MyFirstAndroidApplication/src/ro/pub/cs/systems/eim/lab01/MainActivity.java |
| - | CONFLICT (content): Merge conflict in MyFirstAndroidApplication/src/ro/pub/cs/systems/pdsd/lab01/MainActivity.java | + | CONFLICT (content): Merge conflict in MyFirstAndroidApplication/src/ro/pub/cs/systems/eim/lab01/MainActivity.java |
| Automatic merge failed; fix conflicts and then commit the result. | Automatic merge failed; fix conflicts and then commit the result. | ||
| </code> | </code> | ||
| Line 716: | Line 751: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git checkout customized_message | + | student@eim2016:~$ git checkout customized_message |
| - | student@pdsd2015:~$ git rebase master | + | student@eim2016:~$ git rebase master |
| First, rewinding head to replay your work on top of it... | First, rewinding head to replay your work on top of it... | ||
| Applying: added staged command | Applying: added staged command | ||
| - | student@pdsd2015:~$ git checkout master | + | student@eim2016:~$ git checkout master |
| Switched to branch 'master' | Switched to branch 'master' | ||
| - | student@pdsd2015:~$ git merge customized_message | + | student@eim2016:~$ git merge customized_message |
| </code> | </code> | ||
| Line 729: | Line 764: | ||
| Astfel, | Astfel, | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git rebase master customized_message | + | student@eim2016:~$ git rebase master customized_message |
| </code> | </code> | ||
| este echivalentă cu | este echivalentă cu | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git checkout customized_message | + | student@eim2016:~$ git checkout customized_message |
| - | student@pdsd2015:~$ git rebase master | + | student@eim2016:~$ git rebase master |
| </code> | </code> | ||
| Line 747: | Line 782: | ||
| <code> | <code> | ||
| - | student@pdsd2015:~$ git branch -d customized_message | + | student@eim2016:~$ git branch -d customized_message |
| Deleted branch customized_message (was 477dcd6). | Deleted branch customized_message (was 477dcd6). | ||
| - | student@pdsd2015:~$ git branch -d fade_effect | + | student@eim2016:~$ git branch -d fade_effect |
| Deleted branch fade_effect (was 30fe2f3). | Deleted branch fade_effect (was 30fe2f3). | ||
| </code> | </code> | ||
| Line 772: | Line 807: | ||
| <note tip>În cazul în care denumirea ramificației din depozitul de pe serverul la distanță coincide cu ramificația din directorul de lucru de pe discul local, comanda ia forma ''git push <remote_name> <branch_name>''.</note> | <note tip>În cazul în care denumirea ramificației din depozitul de pe serverul la distanță coincide cu ramificația din directorul de lucru de pe discul local, comanda ia forma ''git push <remote_name> <branch_name>''.</note> | ||
| - | ===== Crearea unei aplicații Android în Eclipse Luna SR1a (4.4.1) - obligatoriu ===== | + | ===== Crearea unei aplicații Android în Eclipse Mars 1 (4.5.1) - obligatoriu ===== |
| Pentru a crea o aplicație Android se selectează //File// → //New// → //Project//, iar apoi //Android Application Project//. | Pentru a crea o aplicație Android se selectează //File// → //New// → //Project//, iar apoi //Android Application Project//. | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid01.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project01.png?nolink&500 }} |
| - | {{ :laboratoare:laborator01:eclipseproiectandroid02.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project02.png?nolink&500 }} |
| <note tip>În cazul în care anterior au fost create alte aplicații Android, proiectele de acest tip vor putea fi create accesând scurtătura //File// → //New// → //Android Application Project//.</note> | <note tip>În cazul în care anterior au fost create alte aplicații Android, proiectele de acest tip vor putea fi create accesând scurtătura //File// → //New// → //Android Application Project//.</note> | ||
| Line 784: | Line 819: | ||
| Ulterior, se vor specifica detaliile proiectului: | Ulterior, se vor specifica detaliile proiectului: | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid03.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project03.png?nolink&500 }} |
| * **Application Name** - denumirea aplicației, așa cum apare în Play Store și în //Settings// → //Application Manager// (de obicei este același ca Project Name) | * **Application Name** - denumirea aplicației, așa cum apare în Play Store și în //Settings// → //Application Manager// (de obicei este același ca Project Name) | ||
| - | * **Project Name** - denumirea proiectului Eclipse Luna SR1a (4.4.1), folosind convențiile utilizate în cadrul acestui IDE (nu mai este folosită în altă parte, nu sunt permise spații) | + | * **Project Name** - denumirea proiectului Eclipse Mars 1 (4.5.1), folosind convențiile utilizate în cadrul acestui IDE (nu mai este folosită în altă parte, nu sunt permise spații) |
| * **Package Name** - denumirea pachetului care va conține aplicația, aceasta identificând-o în mod unic; utilizatorii nu o pot accesa, însă trebuie păstrată aceeași valoare pe întreaga durată de viață a programului, acesta fiind mecanismul prin care se stabilește că diferite versiuni aparțin aceleiași aplicații; drept convenție, se folosește denumirea domeniului organizației urmat de unul sau mai mulți identificatori ai aplicației, alcătuind o denumire validă pentru un pachet Java (trebuie să conțină cel puțin un caracter '.') | * **Package Name** - denumirea pachetului care va conține aplicația, aceasta identificând-o în mod unic; utilizatorii nu o pot accesa, însă trebuie păstrată aceeași valoare pe întreaga durată de viață a programului, acesta fiind mecanismul prin care se stabilește că diferite versiuni aparțin aceleiași aplicații; drept convenție, se folosește denumirea domeniului organizației urmat de unul sau mai mulți identificatori ai aplicației, alcătuind o denumire validă pentru un pachet Java (trebuie să conțină cel puțin un caracter '.') | ||
| - | <note tip>Este de preferat să se scrie domeniul organizației în ordine inversă.\\ Exemplu: ''ro.pub.cs.systems.pdsd.lab01''.</note> | + | <note tip>Este de preferat să se scrie domeniul organizației în ordine inversă.\\ Exemplu: ''ro.pub.cs.systems.eim.lab01''.</note> |
| * **Minimum Required SDK** - versiunea pe care se dorește să se ruleze aplicația; cu cât va fi aleasă o valoare mai mică, vor fi cuprinse mai multe platforme, însă vor putea fi utilizate mai puține funcționalități; pentru a include cât mai multe dispozitive mobile, se va alege nivelul de API 8 (Android 2.2); în scop didactic, se folosește nivelul de API 16 (Android 4.1) | * **Minimum Required SDK** - versiunea pe care se dorește să se ruleze aplicația; cu cât va fi aleasă o valoare mai mică, vor fi cuprinse mai multe platforme, însă vor putea fi utilizate mai puține funcționalități; pentru a include cât mai multe dispozitive mobile, se va alege nivelul de API 8 (Android 2.2); în scop didactic, se folosește nivelul de API 16 (Android 4.1) | ||
| Line 804: | Line 839: | ||
| * atașarea proiectului la o zonă de lucru | * atașarea proiectului la o zonă de lucru | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid04.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project04.png?nolink&500 }} |
| Se va indica și pictograma aplicației prin care aceasta va putea fi accesată din meniul dispozitivului mobil. Pentru aceasta se va specifica tipul (imagine, text, anumație), locația de la care va fi încărcată, dacă se dorește adăugarea sau ștergerea de spațiu gol, modul în care se va realiza scalarea pentru toate rezoluțiile (mpi, hdpi, xhdpi, xxhdpi), forma (fără formă, pătrat sau cerc), culoarea de fundal. | Se va indica și pictograma aplicației prin care aceasta va putea fi accesată din meniul dispozitivului mobil. Pentru aceasta se va specifica tipul (imagine, text, anumație), locația de la care va fi încărcată, dacă se dorește adăugarea sau ștergerea de spațiu gol, modul în care se va realiza scalarea pentru toate rezoluțiile (mpi, hdpi, xhdpi, xxhdpi), forma (fără formă, pătrat sau cerc), culoarea de fundal. | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid05.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project05.png?nolink&500 }} |
| De asemenea, se specifică dacă se va crea o activitate (și ce tip va avea aceasta - //Blank Activity//, //Blank Activity with Fragment//, //Empty Activity//, //Full Screen Activity//, //Master/Detail Flow//, //Navigation Drawer Activity//, //Tabbed Activity//) sau nu. În Android, o activitate este o fereastră care conține interfața cu utilizatorul a aplicațiilor. O aplicație poate avea zero sau mai multe activități. De asemenea, o activitate poate fi împărțită în mai multe subunități denumite fragmente, utile pentru gestiunea spațiului, în special în situația în care aplicația este proiectată pentru dispozitive cu dimensiuni și rezoluții diferite ale ecranului. | De asemenea, se specifică dacă se va crea o activitate (și ce tip va avea aceasta - //Blank Activity//, //Blank Activity with Fragment//, //Empty Activity//, //Full Screen Activity//, //Master/Detail Flow//, //Navigation Drawer Activity//, //Tabbed Activity//) sau nu. În Android, o activitate este o fereastră care conține interfața cu utilizatorul a aplicațiilor. O aplicație poate avea zero sau mai multe activități. De asemenea, o activitate poate fi împărțită în mai multe subunități denumite fragmente, utile pentru gestiunea spațiului, în special în situația în care aplicația este proiectată pentru dispozitive cu dimensiuni și rezoluții diferite ale ecranului. | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid06.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project06.png?nolink&500 }} |
| Activitatea va fi identificată printr-o denumire, precizându-se un nume și pentru fișierul xml care conține modul de dispunere al elementelor grafice (acesta putând fi editat atât în mod text cât și în mod vizual). | Activitatea va fi identificată printr-o denumire, precizându-se un nume și pentru fișierul xml care conține modul de dispunere al elementelor grafice (acesta putând fi editat atât în mod text cât și în mod vizual). | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid07.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project07.png?nolink&500 }} |
| Rularea aplicației se face prin accesarea opțiunii //Run As// → //Android Application// din cadrul meniului contextual asociat proiectului (și accesibil prin click dreapta pe mouse). | Rularea aplicației se face prin accesarea opțiunii //Run As// → //Android Application// din cadrul meniului contextual asociat proiectului (și accesibil prin click dreapta pe mouse). | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid08.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project08.png?nolink&500 }} |
| Utilizatorul va putea specifica dacă dorește monitorizarea mesajelor transmise de aplicație prin intermediul logcat precum și nivelul de prioritate al acestora (informație, avertisment, eroare). | Utilizatorul va putea specifica dacă dorește monitorizarea mesajelor transmise de aplicație prin intermediul logcat precum și nivelul de prioritate al acestora (informație, avertisment, eroare). | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid09.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_project09.png?nolink&500 }} |
| În prealabil, trebuie conectat un dispozitiv fizic prin cablu USB (sau prin wi-fi, în aceeași rețea cu calculatorul) sau se pornește un emulator pe care se va testa aplicația. | În prealabil, trebuie conectat un dispozitiv fizic prin cablu USB (sau prin wi-fi, în aceeași rețea cu calculatorul) sau se pornește un emulator pe care se va testa aplicația. | ||
| - | {{ :laboratoare:laborator01:eclipseproiectandroid10.png?nolink&400 }} | + | {{ :laboratoare:laborator01:eclipse_project10.png?nolink&400 }} |
| - | ===== Testarea exemplelor de aplicații Android în Eclipse Luna SR1a (4.4.1) - obligatoriu ===== | + | ===== Testarea exemplelor de aplicații Android în Eclipse Mars 1 (4.5.1) - obligatoriu ===== |
| Fiecare versiune de Android este distribuită cu mai multe exemple de aplicații, ce ilustrează modul în care pot fi utilizate diferite funcționalități implementate de API. | Fiecare versiune de Android este distribuită cu mai multe exemple de aplicații, ce ilustrează modul în care pot fi utilizate diferite funcționalități implementate de API. | ||
| Line 836: | Line 871: | ||
| Pentru a accesa proiectul corespunzător unui exemplu, se selectează //File// → //New// → //Project//, iar apoi //Android Sample Project//. | Pentru a accesa proiectul corespunzător unui exemplu, se selectează //File// → //New// → //Project//, iar apoi //Android Sample Project//. | ||
| - | {{ :laboratoare:laborator01:eclipseexemple01.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_sample_project01.png?nolink&500 }} |
| - | Va fi solicitat nivelul de API pentru care se dorește consultarea colecției de aplicații, precum și furnizorul acestora (parte a AOSP - Android Open Source Project sau Google) și platforma pe care va fi rulat. | + | Va fi solicitat nivelul de API pentru care se dorește consultarea colecției de aplicații, precum și furnizorul acestora (parte a AOSP - Android Open Source Project sau Google) și platforma pe care va fi rulat. Pentru unele platforme, aceste informații nu mai sunt afișate, putând fi vizualizate exemplele de proiecte pentru toate nivelurile de API. |
| - | {{ :laboratoare:laborator01:eclipseexemple02.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_sample_project02.png?nolink&500 }} |
| Din setul de aplicații disponibile va fi selectată una, pentru care va putea fi consultat și codul sursă, cu posibilitatea modificării acestuia. | Din setul de aplicații disponibile va fi selectată una, pentru care va putea fi consultat și codul sursă, cu posibilitatea modificării acestuia. | ||
| - | {{ :laboratoare:laborator01:eclipseexemple03.png?nolink&500 }} | + | {{ :laboratoare:laborator01:eclipse_sample_project03.png?nolink&500 }} |
| Rularea proiectului Android se face ca pentru orice resursă de acest tip. | Rularea proiectului Android se face ca pentru orice resursă de acest tip. | ||
| - | {{ :laboratoare:laborator01:eclipseexemple04.png?nolink&400 }} | + | {{ :laboratoare:laborator01:eclipse_sample_project04.png?nolink&400 }} |
| + | |||
| + | ===== Crearea unei aplicații Android în Android Studio 1.5.1 - obligatoriu ===== | ||
| + | |||
| + | Pentru a crea o aplicație Android se selectează //Start a New Android Studio project//. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project01.png?nolink&500 }} | ||
| + | |||
| + | <note tip>Portarea proiectelor dezvoltate folosind Eclipse ADT este foarte facilă, prin intermediul opțiunii //Import project (Eclipse ADT, Gradle, etc.)//.</note> | ||
| + | |||
| + | Configurarea proiectului presupune specificarea unor parametri: | ||
| + | * denumirea aplicației; | ||
| + | * domeniul companiei care dezvoltă aplicația respectivă. | ||
| + | |||
| + | Pe baza valorilor introduse, se generează denumirea pachetului care va identifica în mod unic aplicația. Acesta este format din domeniu (scris în formă inversă) la care se adaugă denumirea aplicației (din care sunt eliminate caracterele albe). | ||
| + | |||
| + | De asemenea, este necesar să se indice locația la care va fi plasat proiectul respectiv. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project02.png?nolink&600 }} | ||
| + | |||
| + | Se indică platforma căreia îi este destinată aplicația Android: | ||
| + | * dispozitiv mobil (telefon sau tabletă), caz în care trebuie să se precizeze valoarea minimă a nivelului de API pentru care se dezvoltă aplicația (cea mai scăzută valoare a platformei pe care poate rula aplicația); | ||
| + | * obiect vestimentar (ceas, brățară); | ||
| + | * televizor; | ||
| + | * dispozitiv pentru automobil; | ||
| + | * ochelari inteligenți. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project03.png?nolink&600 }} | ||
| + | |||
| + | Este selectat tipul de actvitate care va fi vizualizată în momentul în care aplicația Android este pornită (//Blank Activity//, //Empty Activity//, //Fullscreen Activity//, //Google AdMob Activity//, //Google Maps Activity//, //Login Activity//, //Master/Detail Flow//, //Navigation Drawer Activity//, //Scrolling Activity//, //Settings Activity//, //Tabbed Activity//). | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project04.png?nolink&600 }} | ||
| + | |||
| + | Se stabilește o denumire pentru activitatea principală, precum și denumirea fișierelor în care vor fi plasate structura interfeței grafice, respectiv a meniului asociat. Se poate preciza, de asemenea, folosirea de fragmente în cadrul activității. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project05.png?nolink&600 }} | ||
| + | |||
| + | Se apasă butonul //Finish//. | ||
| + | |||
| + | Rularea unei aplicații Android se face prin intermediul unei pictograme asociate unei liste de selecție, în care sunt plasate toate aplicațiile disponibile în cadrul mediului integrat de dezvoltare. Se poate folosi și prescurtarea ''Shift + F10''. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project06.png?nolink&1000 }} | ||
| + | |||
| + | Utilizatorul are posibilitatea de a selecta dispozitivul pe care va fi rulată aplicația, dintre cele conectate la mașina pe care se rulează. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project07.png?nolink }} | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_project08.png?nolink&400 }} | ||
| + | |||
| + | ===== Testarea exemplelor de aplicații Android în Android Studio 1.5.1 - obligatoriu ===== | ||
| + | |||
| + | Accesarea unui exemplu de aplicație Android se face prin intermediul opțiunii //Import an Android code sample//. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_sample_project01.png?nolink&600 }} | ||
| + | |||
| + | Pot fi consultate mai multe proiecte Android, pentru fiecare existând posibilitatea de a vizualiza codul sursă, disponibil în cadrul unui depozit GitHub. Gruparea aplicațiilor Android este realizată pe categorii tematice. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_sample_project02.png?nolink&600 }} | ||
| + | |||
| + | Un exemplu de aplicație Android, care se descarcă din contextul depozitului Github, poate fi redenumită, stabilindu-se și locația la care va fi stocată. | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_sample_project03.png?nolink&600 }} | ||
| + | |||
| + | {{ :laboratoare:laborator01:android_studio_sample_project04.png?nolink&400 }} | ||
| ===== Activitate de Laborator ===== | ===== Activitate de Laborator ===== | ||
| Line 854: | Line 952: | ||
| - kit de dezvoltare pentru limbajul de programare Java; | - kit de dezvoltare pentru limbajul de programare Java; | ||
| - SDK pentru Android; | - SDK pentru Android; | ||
| - | - mediu integrat de dezvoltare Eclipse Luna SR1a (4.4.1) cu plugin-uri pentru Android, Genymotion; | + | - mediu integrat de dezvoltare Eclipse Mars 1 (4.5.1) sau Android Studio 1.5.1 cu plugin-uri pentru Android, Genymotion; |
| - emulator Genymotion în care se configurează un dispozitiv virtual Nexus S - 4.1.1 - API 16 - 400x800; | - emulator Genymotion în care se configurează un dispozitiv virtual Nexus S - 4.1.1 - API 16 - 400x800; | ||
| - Să se instaleze Git, în cazul în care nu există deja. | - Să se instaleze Git, în cazul în care nu există deja. | ||
| - Să se acceseze [[http://www.github.com|GitHub]] și să se creeze un cont. | - Să se acceseze [[http://www.github.com|GitHub]] și să se creeze un cont. | ||
| - Să se realizeze configurațiile globale, specificând informații precum ''user.name'', ''user.email'', ''core.editor'', ''merge.tool''. Verificați faptul că informațiile au fost introduse corect, prin două metode diferite. <code> | - Să se realizeze configurațiile globale, specificând informații precum ''user.name'', ''user.email'', ''core.editor'', ''merge.tool''. Verificați faptul că informațiile au fost introduse corect, prin două metode diferite. <code> | ||
| - | student@pdsd2015:~$ git config --global user.name "Perfect Student" | + | student@eim2016:~$ git config --global user.name "Perfect Student" |
| - | student@pdsd2015:~$ git config --global user.email "perfect_student@cti.pub.ro" | + | student@eim2016:~$ git config --global user.email "perfect_student@cti.pub.ro" |
| - | student@pdsd2015:~$ git config --global core.editor gedit | + | student@eim2016:~$ git config --global core.editor gedit |
| - | student@pdsd2015:~$ git config --global merge.tool diff | + | student@eim2016:~$ git config --global merge.tool diff |
| </code> Verificarea valorii pe care o au variabilele de configurare poate fi realizată în mai multe moduri: <code> | </code> Verificarea valorii pe care o au variabilele de configurare poate fi realizată în mai multe moduri: <code> | ||
| - | student@pdsd2015:~$ git cofig --list | + | student@eim2016:~$ git config --list |
| </code> <code> | </code> <code> | ||
| - | student@pdsd2015:~$ cat .git/config | + | student@eim2016:~$ cat .git/config |
| </code> <code> | </code> <code> | ||
| - | student@pdsd2015:~$ git config user.name | + | student@eim2016:~$ git config user.name |
| - | student@pdsd2015:~$ git config user.email | + | student@eim2016:~$ git config user.email |
| - | student@pdsd2015:~$ git config core.editor | + | student@eim2016:~$ git config core.editor |
| - | student@pdsd2015:~$ git config merge.tool | + | student@eim2016:~$ git config merge.tool |
| </code> | </code> | ||
| - Să se creeze un depozit pe contul Github creat, denumit 'Laborator01'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''README.md'', nici a fișierului ''.gitignore'' sau a a fișierului ''LICENSE''). | - Să se creeze un depozit pe contul Github creat, denumit 'Laborator01'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''README.md'', nici a fișierului ''.gitignore'' sau a a fișierului ''LICENSE''). | ||
| - | - Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/pdsd2015/Laborator01|]]. În urma acestei operații, directorul Laborator01 va trebui să se conțină proiectul Eclipse denumit ''MyFirstAndroidApplication'', fișierul ''README.md'' și un fișier ''.gitignore'' care indică tipurile de fișiere (extensiile) ignorate. <code> | + | - Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim2016/Laborator01|]]. În urma acestei operații, directorul Laborator01 va trebui să se conțină un director ''labtaks'' care conține proiectele Eclipse și AndroidStudio denumite ''MyFirstAndroidApplication'', fișierele ''README.md'' și ''LICENSE'' și un fișier ''.gitignore'' care indică tipurile de fișiere (extensiile) ignorate. <code> |
| - | student@pdsd2015:~$ git init | + | student@eim2016:~$ git clone https://www.github.com/eim2016/Laborator01.git |
| - | student@pdsd2015:~$ git clone https://www.github.com/pdsd2015/Laborator01 | + | |
| </code> | </code> | ||
| - Să se încarce conținutul descărcat în cadrul depozitului 'Laborator01' de pe contul Github personal. <code> | - Să se încarce conținutul descărcat în cadrul depozitului 'Laborator01' de pe contul Github personal. <code> | ||
| - | student@pdsd2015:~$ cd Laborator01 | + | student@eim2016:~$ cd Laborator01 |
| - | student@pdsd2015:~/Laborator01$ git remote add Laborator01_perfectstudent https://github.com/perfectstudent/Laborator01 | + | student@eim2016:~/Laborator01$ git remote add Laborator01_perfectstudent https://github.com/perfectstudent/Laborator01 |
| - | student@pdsd2015:~/Laborator01$ git push Laborator01_perfectstudent master | + | student@eim2016:~/Laborator01$ git push Laborator01_perfectstudent master |
| </code> | </code> | ||
| - | - În fișierul ''MainActivity.java'' din pachetul ''ro.pub.cs.systems.pdsd.lab01'' (directorul ''src''), să se modifice metoda ''onClick'' a clasei interne ''ButtonClickListener'' astfel încât: | + | - Să se ruleze aplicația schelet: |
| + | - în Eclipse: //File// → //New// → //Project// → //Android Project from existing code// SAU //File// → //Import// → //Android// → //Existing Android Code Into Workspace// și se indică directorul Laborator01/labtasks/eclipse; | ||
| + | - în Android Studio: //Open an existing Android Studio project// și se indică directorul Laborator01/labtasks/androidstudio; | ||
| + | - În fișierul ''MainActivity.java'' din pachetul ''ro.pub.cs.systems.eim.lab01'' (directorul ''src''), să se modifice metoda ''onClick'' a clasei interne ''ButtonClickListener'' astfel încât: | ||
| - mesajul afișat să includă numele utilizatorului, așa cum apare în widget-ul de tip ''EditBox''; <code java> | - mesajul afișat să includă numele utilizatorului, așa cum apare în widget-ul de tip ''EditBox''; <code java> | ||
| - | greetingTextView.setText(greetingTextView.getText().replace("xxx", "\n"+userNameEditText.getText())); | + | greetingTextView.setText(greetingTextView.getText().toString().replace("xxx", "\n"+userNameEditText.getText())); |
| </code> | </code> | ||
| - să se aplice un efect de fade, astfel încât mesajul afișat să dispară treptat în decurs de ''TRANSPARENCY_EFFECT_DURATION'' milisecunde. <code java> | - să se aplice un efect de fade, astfel încât mesajul afișat să dispară treptat în decurs de ''TRANSPARENCY_EFFECT_DURATION'' milisecunde. <code java> | ||
| Line 894: | Line 994: | ||
| </code> | </code> | ||
| - Să se încarce modificările realizate în cadrul depozitului 'Laborator01' de pe contul Github personal, folosind un mesaj sugestiv. <code> | - Să se încarce modificările realizate în cadrul depozitului 'Laborator01' de pe contul Github personal, folosind un mesaj sugestiv. <code> | ||
| - | student@pdsd2015:~/Laborator01$ git add MyFirstAndroidApplication/src/ro/pub/cs/systems/pdsd/lab01.MainActivity.java | + | student@eim2016:~/Laborator01$ git add MyFirstAndroidApplication/src/ro/pub/cs/systems/eim/lab01.MainActivity.java |
| - | student@pdsd2015:~/Laborator01$ git commit -m "implemented functionality for customized message and fade effect" | + | student@eim2016:~/Laborator01$ git commit -m "implemented functionality for customized message and fade effect" |
| - | student@pdsd2015:~/Laborator01$ git push Laborator01_perfectstudent master | + | student@eim2016:~/Laborator01$ git push Laborator01_perfectstudent master |
| </code> | </code> | ||
| - | - Să se ruleze proiectul ''AccelerometerPlay'' din cadrul exemplelor corespunzătoare nivelului de API 16. Să se ruleze proiectul folosind emulatorul Genymotion. Să se simuleze un eveniment de tipul rotirea ecranului și să se observe modul în care se comportă aplicația. | + | - Să se ruleze un exemplu de proiect Android, dintre cele disponibile, folosind dispozivitul virtual instalat în cadrul emulatorului Genymotion. Să se simuleze un eveniment de tipul rotirea ecranului și să se observe modul în care se comportă aplicația. |
| + | - în Eclipse, ''AccelerometerPlay'' din cadrul exemplelor corespunzătoare nivelului de API 16 (legacy); | ||
| + | - în Android Studio, ''Action Bar Compat - Basic'', din cadrul categoriei //Getting Started//. | ||
| ===== Resurse Utile ===== | ===== Resurse Utile ===== | ||
