Differences

This shows you the differences between two versions of the page.

Link to this comparison view

eim:laboratoare:laborator01 [2016/02/24 21:36]
laura.vasilescu [Materiale Ajutătoare]
eim:laboratoare:laborator01 [2022/05/30 09:46] (current)
dragos.niculescu [Caracteristici (obligatoriu)]
Line 1: Line 1:
 ====== Laborator 01. Introducere în Programarea Android ====== ====== Laborator 01. Introducere în Programarea Android ======
- 
-===== Materiale Ajutătoare ===== 
- 
-  * [[http://​ocw.cs.pub.ro/​courses/​_media/​eim/​laboratoare/​laborator01/​pdsd2015-lab01-slides.pdf|pdsd2015-lab01-slides.pdf]] 
-  * [[http://​ocw.cs.pub.ro/​courses/​_media/​eim/​laboratoare/​laborator01/​pdsd2015-lab01-slides-3pp.pdf|pdsd2015-lab01-slides-3pp.pdf]] 
  
 ===== Sistemul de Operare Android ===== ===== Sistemul de Operare Android =====
  
 ==== Android - Prezentare Generală ===== ==== Android - Prezentare Generală =====
 +<​spoiler>​
 +Android este un SO mobil bazat pe o versiune modificată de Linux (pentru gestiunea componentelor hardware, a proceselor și a memoriei) și biblioteci Java (pentru telefonie (audio/​video),​ conectivitate,​ grafică, programarea interfețelor cu utilizatorul). Este un produs open-source (putând fi dezvoltat de producătorii de dispozitive mobile cu extensii proprietare pentru a-și particulariza platforma), dezvoltat în prezent de compania Google, conceput pe ideea transformării dispozitivelor mobile în adevărate mașini de calcul. Google încearcă totuși să realizeze tranziția de la AOSP (Android Open Source Project) către GMS (Google Mobile Services), peste care sunt construite cele mai multe aplicații, în încercarea de a-și apăra acest proiect în fața concurenței. În acest sens, a fost dezvoltat **proiectul Google One**, prin care este oferit un set de specificații (ecran de 4.5 inchi - 845x480 pixeli, procesor quad-core, memorie 1GB RAM, spațiu de stocare 4GB, suport pentru dual sim) pe care producătorii de dispozitive mai ieftine trebuie să le respecte astfel încât acestea să fie compatibile cu un sistem Android, fără a întâmpina probleme de performanță. Acesta include toate aplicațiile și serviciile Google, la care se pot adăuga și altele, furnizate de producător sau operatorul de telefonie mobilă. În acest fel, se asigură calitatea (păstrând renumele Android) și controlul asupra veniturilor. Comunitatea Android este în creștere, mai multe companii renunțând la propriul sistem de operare în favoarea acestuia, pentru a putea face față fenomenului iPhone.
  
-Android este un sistem de operare mobil bazat pe o versiune modificată de Linux (pentru gestiunea componentelor hardware, a proceselor și a memoriei) și biblioteci Java (pentru telefonie (audio/​video),​ conectivitate,​ grafică, programarea interfețelor cu utilizatorul). Este un produs open-source (putând fi dezvoltat de producătorii de dispozitive mobile cu extensii proprietare pentru ​a-și particulariza platforma), dezvoltat în prezent de compania Google, conceput pe ideea transformării ​dispozitivelor mobile ​în adevărate mașini de calcul. Google încearcă totuși să realizeze tranziția de la AOSP (Android Open Source Project) către GMS (Google Mobile Services), peste care sunt construite ​cele mai multe aplicații, în încercarea de a-și apăra acest proiect în fața concurenței. În acest sens, a fost dezvoltat **proiectul Google One**, prin care este oferit un set de specificații (ecran de 4.5 inchi - 845x480 pixeliprocesor quad-core, memorie 1GB RAM, spațiu de stocare 4GB, suport pentru dual sim) pe care producătorii de dispozitive mai ieftine trebuie să le respecte astfel încât acestea să fie compatibile cu un sistem ​Android, fără a întâmpina probleme ​de performanță. Acesta include toate aplicațiile și serviciile Google, la care se pot adăuga și altele, furnizate de producător sau operatorul de telefonie mobilăÎn acest felse asigură calitatea (păstrând renumele ​Android) și controlul asupra veniturilor. Comunitatea Android este în creștere, ​mai multe companii renunțând la propriul sistem ​de operare ​în favoarea acestuia, pentru a putea face față fenomenului iPhone.+În condițiile în care pe piața dispozitivelor mobile ​aplicațiile sunt cele care aduc avantajul competiționalbeneficiul ​Android ​este reprezentat ​de abordarea unitară pentru dezvoltarea ​aplicațiilorCu alte cuvinteo aplicație dezvoltată conform API-ului ​Android ​va putea rula pe mai multe dispozitive mobile pe care este instalat sistemul ​de operare ​respectiv.
  
-În condițiile în care pe piața dispozitivelor mobile aplicațiile sunt cele care aduc avantajul competițional,​ beneficiul Android este reprezentat de abordarea unitară pentru dezvoltarea aplicațiilor. Cu alte cuvinte, o aplicație dezvoltată conform API-ului Android va putea rula pe mai multe dispozitive mobile pe care este instalat sistemul de operare respectiv.+</​spoiler>​
  
 ==== Versiuni Android ==== ==== Versiuni Android ====
  
 +<​spoiler>​
 ^ Versiune Android ^ Nivel API ^ Data Lansării ^    Nume de Cod     ^ Cota de Piață ^ ^ Versiune Android ^ Nivel API ^ Data Lansării ^    Nume de Cod     ^ Cota de Piață ^
-|   5.0 - 5.0.2    |    21     ​| ​ 12.11.2014 ​  ​| ​     Lollipop ​     |     1.6%      |+|   ​10 ​     |    29     ​| ​ 03.09.2019 ​  ​| ​     ??          |      0.?%      | 
 +|   ​9 ​     |    28     ​| ​ 21.08.2017 ​  ​| ​     Pie          |      0.?%      | 
 +|   8.1 - 8.1      |    26-27     ​| ​ 21.08.2017 ​  ​| ​     Oreo          |      0.?%      | 
 +|   7.1 - 7.1.1    |    25     ​| ​ 04.10.2016 ​  ​| ​     Nougat ​       |      0.3%      | 
 +|       ​7.0 ​       |    24     ​| ​ 22.08.2016 ​  ​| ​     Nougat ​       |      0.9%      | 
 +|   6.0 - 6.0.1    |    23     ​| ​ 05.10.2015 ​  ​| ​   Marshmellow ​    ​| ​    ​30.7% ​     | 
 +|   5.1 - 5.1.1    |    22     ​| ​ 09.03.2015 ​  ​| ​     Lollipop ​     |     ​23.1% ​     | 
 +|   5.0 - 5.0.2    |    21     ​| ​ 12.11.2014 ​  ​| ​     Lollipop ​     |      9.8%      |
 |  4.4W - 4.4W.2 ​  ​| ​   20     ​| ​ 25.06.2014 ​  ​| ​ KitKat with wearable extensions ​ |  | |  4.4W - 4.4W.2 ​  ​| ​   20     ​| ​ 25.06.2014 ​  ​| ​ KitKat with wearable extensions ​ |  |
-|   4.4 - 4.4.4    |    19     ​| ​ 31.10.2013 ​  ​| ​      ​KitKat ​      ​| ​    39.7%     | +|   4.4 - 4.4.4    |    19     ​| ​ 31.10.2013 ​  ​| ​      ​KitKat ​      ​| ​    21.9%     | 
-|       ​4.3 ​       |    18     ​| ​ 24.07.2013 ​  ​| ​    Jelly Bean     ​| ​    ​6.3     +|       ​4.3 ​       |    18     ​| ​ 24.07.2013 ​  ​| ​    Jelly Bean     ​| ​     1.6%     ​
-|      4.2.x       ​| ​   17     ​| ​ 13.11.2012 ​  ​| ​    Jelly Bean     ​| ​    19.8%     | +|      4.2.x       ​| ​   17     ​| ​ 13.11.2012 ​  ​| ​    Jelly Bean     ​| ​     5.7%     | 
-|      4.1.x       ​| ​   16     ​| ​ 09.07.2012 ​  ​| ​    Jelly Bean     ​| ​    18.4%     | +|      4.1.x       ​| ​   16     ​| ​ 09.07.2012 ​  ​| ​    Jelly Bean     ​| ​     4.0%     | 
-|  4.0.3 - 4.0.4   ​| ​   15     ​| ​ 16.12.2011 ​  ​| ​ Ice Cream Sandwich ​ |     6.4%      |+|  4.0.3 - 4.0.4   ​| ​   15     ​| ​ 16.12.2011 ​  ​| ​ Ice Cream Sandwich ​ |     1.0%      |
 |   4.0 - 4.0.2    |    14     ​| ​ 19.10.2011 ​  ​| ​ Ice Cream Sandwich ​ |               | |   4.0 - 4.0.2    |    14     ​| ​ 19.10.2011 ​  ​| ​ Ice Cream Sandwich ​ |               |
 |       ​3.2 ​       |    13     ​| ​ 15.07.2011 ​  ​| ​    ​Honeycomb ​     |               | |       ​3.2 ​       |    13     ​| ​ 15.07.2011 ​  ​| ​    ​Honeycomb ​     |               |
 |       ​3.1 ​       |    12     ​| ​ 10.05.2011 ​  ​| ​    ​Honeycomb ​     |               | |       ​3.1 ​       |    12     ​| ​ 10.05.2011 ​  ​| ​    ​Honeycomb ​     |               |
 |       ​3.0 ​       |    11     ​| ​ 22.02.2011 ​  ​| ​    ​Honeycomb ​     |               | |       ​3.0 ​       |    11     ​| ​ 22.02.2011 ​  ​| ​    ​Honeycomb ​     |               |
-|  2.3.3 - 2.3.7   ​| ​   10     ​| ​ 09.02.2011 ​  ​| ​   Gingerbread ​    ​| ​    7.4%      |+|  2.3.3 - 2.3.7   ​| ​   10     ​| ​ 09.02.2011 ​  ​| ​   Gingerbread ​    ​| ​    1.0%      |
 |   2.3 - 2.3.2    |     ​9 ​    ​| ​ 06.12.2010 ​  ​| ​   Gingerbread ​    ​| ​              | |   2.3 - 2.3.2    |     ​9 ​    ​| ​ 06.12.2010 ​  ​| ​   Gingerbread ​    ​| ​              |
-|   2.2 - 2.2.3    |     ​8 ​    ​| ​ 20.05.2010 ​  ​| ​      ​Froyo ​       |     0.4%      ​|+|   2.2 - 2.2.3    |     ​8 ​    ​| ​ 20.05.2010 ​  ​| ​      ​Froyo ​       |               ​|
 |       ​2.1 ​       |     ​7 ​    ​| ​ 12.01.2010 ​  ​| ​      ​Eclair ​      ​| ​              | |       ​2.1 ​       |     ​7 ​    ​| ​ 12.01.2010 ​  ​| ​      ​Eclair ​      ​| ​              |
 |      2.0.1       ​| ​    ​6 ​    ​| ​ 03.12.2009 ​  ​| ​      ​Eclair ​      ​| ​              | |      2.0.1       ​| ​    ​6 ​    ​| ​ 03.12.2009 ​  ​| ​      ​Eclair ​      ​| ​              |
Line 38: Line 43:
 |       ​1.1 ​       |     ​2 ​    ​| ​ 09.02.2009 ​  ​| ​                   |               | |       ​1.1 ​       |     ​2 ​    ​| ​ 09.02.2009 ​  ​| ​                   |               |
 |       ​1.0 ​       |     ​1 ​    ​| ​ 23.09.2008 ​  ​| ​                   |               | |       ​1.0 ​       |     ​1 ​    ​| ​ 23.09.2008 ​  ​| ​                   |               |
 +
 +</​spoiler>​
 +
 +{{:​eim:​laboratoare:​laborator01:​android_api_7.png?​nolink&​600|}}
 +
 +
 +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 10, lansată la sfârșitul anului 2019;
 +  * 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 29;
 +  * 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 Q.
 +
 +Î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 ====
 +<​spoiler>​
  
 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:
  
-{{ :​eim:​laboratoare:​laborator01:​arhitecturaandroid.png?​nolink&​600 }}+{{ :​eim:​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 utilizatorulfurnizori ​de conținut și gestiunea pachetelor ​(instalaresecuritate) +    - **ART (Android Runtime)** este mașina virtuală Java care fost implementată începând ​cu versiunea 5.0folosind un tip de compilare AOH (Ahead of Time)în care bytecode-ul este transpus în cod mașină la momentul instalăriiastfel î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 ARTizolâ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 baterieresurse ​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 Harmonynu sunt conținute pachetele pentru AWT / Swingimprimare sau alte componente speciale. Prin urmare, deși de poate utiliza versiunea curentă de Java (7) pentru dezvoltarea ​aplicațieifacilităț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 caracterealte constante) fiind incluse ​singură dată, motiv pentru care un astfel de fișier necomprimat va avea o dimensiune mai mică decât o arhivă .jar (comprimată). De asemenease 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țiilefiind 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 energieitelefonie, furnizori ​de conținutgestiunea pachetelor, serviciul de localizare, serviciul de notificări;​ 
 +      - atunci când este necesar să lanseze în execuție ​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. 
 +</​spoiler>​
  
 ==== Funcționalități Android ==== ==== Funcționalități Android ====
 +<​spoiler>​
 De vreme ce Android este un produs open-source,​ producătorii având posibilitatea de a-l modifica în mod gratuit, nu există configurații hardware sau software standard. Totuși, Android implementează următoarele funcționalități:​ De vreme ce Android este un produs open-source,​ producătorii având posibilitatea de a-l modifica în mod gratuit, nu există configurații hardware sau software standard. Totuși, Android implementează următoarele funcționalități:​
   * **stocare** - folosește SQLite, o bază de date relațională ce utilizează resurse puține   * **stocare** - folosește SQLite, o bază de date relațională ce utilizează resurse puține
Line 71: Line 98:
   * **suport pentru aplicații Flash** (până în versiunea 4.3)   * **suport pentru aplicații Flash** (până în versiunea 4.3)
   * **legătură la Internet** - suportă partajarea conexiunilor la Internet ca punct de distribuție cu fir / fără fir   * **legătură la Internet** - suportă partajarea conexiunilor la Internet ca punct de distribuție cu fir / fără fir
 +</​spoiler>​
  
 ==== Android vs. iPhone ==== ==== Android vs. iPhone ====
 +<​spoiler>​
  
-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.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 dolari) față de puterea de cumpărare a persoanelor ce dețin un telefon Android (al cărui preț mediu este de 200-300 dolari), 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.milioane, comparativ cu 1.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 dolari) față de puterea de cumpărare a persoanelor ce dețin un telefon Android (al cărui preț mediu este de 200-300 dolari), 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 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. 
 +</​spoiler>​
  
 ==== Comunitatea programatorilor Android ==== ==== Comunitatea programatorilor Android ====
- +<​spoiler>​ 
-Ajunsă deja la a cincea ​versiune, Android este o platformă care beneficiază de experiența a numeroși dezvoltatori ce poate fi exploatată:​+Ajunsă deja la a șaptea ​versiune, Android este o platformă care beneficiază de experiența a numeroși dezvoltatori ce poate fi exploatată:​
   * [[http://​developer.android.com/​training/​index.html|Google Android Training]] conține o serie de tutoriale și exemple de clase grupate în funcție de diferite subiecte, utile pentru deprinderea cunoștințelor de bază pentru dezvoltarea aplicațiilor Android.   * [[http://​developer.android.com/​training/​index.html|Google Android Training]] conține o serie de tutoriale și exemple de clase grupate în funcție de diferite subiecte, utile pentru deprinderea cunoștințelor de bază pentru dezvoltarea aplicațiilor Android.
   * [[http://​www.stackoverflow.com/​questions/​tagged/​android|Stack Overflow]] este un forum pentru programatori editat în mod colaborativ,​ conținând întrebări și răspunsuri la acestea (cele mai bune putând fi identificate cu ușurință prin voturile primite de la participanți). Este destul de probabil ca o întrebare să își găsească deja răspunsul pe acestă resursă.   * [[http://​www.stackoverflow.com/​questions/​tagged/​android|Stack Overflow]] este un forum pentru programatori editat în mod colaborativ,​ conținând întrebări și răspunsuri la acestea (cele mai bune putând fi identificate cu ușurință prin voturile primite de la participanți). Este destul de probabil ca o întrebare să își găsească deja răspunsul pe acestă resursă.
   * [[http://​groups.google.com/​group/​android-discuss|Android Discuss]] este o listă de discuții monitorizată îndeaproape de echipa Android de la Google astfel încât reprezintă un loc unde pot fi clarificate numeroase nelămuriri putând fi însușite diferite sfaturi și trucuri.   * [[http://​groups.google.com/​group/​android-discuss|Android Discuss]] este o listă de discuții monitorizată îndeaproape de echipa Android de la Google astfel încât reprezintă un loc unde pot fi clarificate numeroase nelămuriri putând fi însușite diferite sfaturi și trucuri.
 +</​spoiler>​
  
 ===== Cerințe pentru dezvoltarea unei aplicații Android (obligatoriu) ===== ===== Cerințe pentru dezvoltarea unei aplicații Android (obligatoriu) =====
Line 97: Line 128:
   - [[eim:​tutoriale:​sdk_android|SDK-ul de Android]], pentru care se descarcă definițiile corespunzătoare unuia sau mai multor niveluri de API   - [[eim:​tutoriale:​sdk_android|SDK-ul de Android]], pentru care se descarcă definițiile corespunzătoare unuia sau mai multor niveluri de API
   - un mediu integrat de dezvoltare (IDE)   - un mediu integrat de dezvoltare (IDE)
-    - [[eim:​tutoriale:​eclipse|Elipse Luna SR1a (4.4.1)]], cu plugin-ul pentru Android 
     - [[eim:​tutoriale:​android_studio|Android Studio]]     - [[eim:​tutoriale:​android_studio|Android Studio]]
   - un dispozitiv pe care să se ruleze aplicațiile   - un dispozitiv pe care să se ruleze aplicațiile
Line 103: Line 133:
       - [[eim:​tutoriale:​genymotion|Genymotion]]       - [[eim:​tutoriale:​genymotion|Genymotion]]
       - [[eim:​tutoriale:​android_virtual_device|Android Virtual Device]] (livrat împreună cu SDK-ul de Android)       - [[eim:​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''​.\\ \\ {{ :​eim:​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//​).\\ \\ {{ :​eim:​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//.\\ \\ {{ :​eim:​laboratoare:​laborator01:​android_debugging02.png?​nolink&​400 }}
-    - Dacă telefonul ​nu este recunoscut la conectarea prin USBtrebuie instalate niște reguli pentru udev [[http://unix.stackexchange.com/questions/119128/​linux-mint-16-android-device-not-listed-with-lsusb|stackexchange]]\ +
-      - # sudo bash  +
-      - # lsusbgăsiți identificatorul telefonului  +
-      - # /etc/udev/rules.d/51-android.rules - se adaugă o regulă pentru dispozitivul găsit de lsusb +
-      - # SUBSYSTEM=="​usb",​ ATTR{idVendor}=="​18d1",​ ATTR{idProduct}=="​d002",​ MODE="​0660", ​ GROUP="​plugdev",​ SYMLINK+="​android%n"​ +
-      - # /etc/init.d/udev restart +
-      - [[http://blog.janosgyerik.com/adding-udev-rules-for-usb-debugging-android-devices/]]+
  
 +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]]:​
  
-==== Scurtătură ====+<​code>​ 
 +student@eim-lab:​~$ sudo bash  
 +student@eim-lab:​~#​ lsusb 
 +</​code>​
  
-Există [[http://wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​tgz/​|un set de arhive]] care conțin toate instrumentele necesare pentru dezvoltarea unei aplicații Androidutil mai ales în situația în care procesul de descărcare din surse externe durează mai mult, din cauza unei conexiuni la Internet deficitare.+După ce s-a identificat dispozitivul mobil (prin intermediul comenzii ''​lsusb''​)se precizează o regulă pentru acesta:
  
-<note important>​Aceste arhive funcționează doar pentru distribuții de Linux ce rulează pe mașini cu arhitecturi pe 64 de biți.</​note>​ +<​code>​ 
- +student@eim-lab:~# gedit /etc/udev/rules.d/51-android.rules
-  * SDK-ul pentru Android - va fi instalat în ''/​opt/​android-sdk-linux'' ​<​code>​ +
-student@pdsd2015:~$ cd /tmp +
-student@pdsd2015:/​tmp$ wget http://​wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​tgz/​opt.android-sdk-linuz.zip +
-student@pdsd2015:/​tmp$ sudo bash +
-root@pdsd2015:/​tmpcd / +
-root@pdsd2015:​/# unzip /tmp/opt.android-sdk-linuz.zip +
-root@pdsd2015:​/# exit +
-student@pdsd2015:/​tmp$ rm -f opt.android-sdk-linuz.zip +
-</​code>​ +
-  * mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1), cu plugin-uri pentru Android și Genymotion - va fi instalat în ''/​opt/​eclipse''​ (configurările vor fi plasate în ''/​home/​student/​.eclipse''​) ​ <​code>​ +
-student@pdsd2015:​~$ cd /tmp +
-student@pdsd2015:/​tmp$ wget http://​wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​tgz/​opt.eclipse.zip +
-student@pdsd2015:/​tmp$ wget http://​wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​tgz/​dot.eclipse.zip +
-student@pdsd2015:/​tmp$ cd / +
-student@pdsd2015:/​$ unzip /​tmp/​dot.eclipse.zip +
-student@pdsd2015:/​$ sudo bash +
-root@pdsd2015:/#​ unzip /​tmp/​opt.eclipse.zip +
-root@pdsd2015:/#​ exit +
-student@pdsd2015:/​$ rm -f /​tmp/​opt.eclipse.zip +
-student@pdsd2015:/​$ rm -f /​tmp/​dot.eclipse.zip +
-</​code>​ +
-  * emulatorul Genymotion - va fi instalat în ''/​opt/​genymotion''​ (dispozitivul virtual va fi plasat în ''/​home/​student/​.Genymobile''​) ​ <​code>​ +
-student@pdsd2015:​~$ cd /tmp +
-student@pdsd2015:/​tmp$ wget http://​wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​tgz/​opt.genymotion.zip +
-student@pdsd2015:/​tmp$ wget http://​wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​tgz/​dot.Genymobile.zip +
-student@pdsd2015:/​tmp$ cd / +
-student@pdsd2015:/​$ unzip /​tmp/​dot.Genymobile.zip +
-student@pdsd2015:/​$ sudo bash  +
-root@pdsd2015:/#​ unzip /​tmp/​opt.genymotion.zip +
-root@pdsd2015:/#​ exit +
-student@pdsd2015:/​$ rm -f /​tmp/​opt.genymotion.zip +
-student@pdsd2015:/​$ rm -f /​tmp/​dot.Genymobile.zip+
 </​code>​ </​code>​
  
-Totodatasunt necesare si pachetele:<​code>​ +<file text /​etc/​udev/​rules.d/​51-android.rules>​ 
-student@pdsd2015:~$ sudo apt-get install virtualbox lib32z1+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@eim-lab:~# /​etc/​init.d/​udev restart
 </​code>​ </​code>​
  
-În situația în care memoria reprezintă o problemă, pot fi instalate și alte aplicații care o economisesc. ​<​code>​ + 
-student@pdsd2015:​~$ sudo apt-get install fluxbox tmux netcat-traditional epiphany-browser+Fie că ați instalat un emulator, fie un telefon conectat prin cablu USB, puteti verifica că el este pornit si este vizibil  
 + 
 +<​code>​ 
 +/​opt/​Android/​SDK/​platform-tools/adb devices
 </​code>​ </​code>​
-  * fluxbox - utilitar pentru gestiunea ferestrelor 
-  * tmux - aplicație de "​multiplexare"​ a terminalelor,​ capabilă să gestioneze mai multe interfețe în linie de comandă 
-  * netcat-traditional - aplicație pentru scrierea și citirea de date în / din diferite conexiuni la rețea, folosind protocoalele TCP saiu UDP 
-  * virtualbox - aplicație pentru gestiunea de mașini virtuale 
-  * epiphany-browser - navigator ce implementează doar funcționalități de bază 
-  * lib32z1 - biblioteca ''​libc6'',​ versiunea pe 32 de biți 
  
-/* +Dacă dispozitivul este listatva puteti conecta la prompt 
-De asemeneamediul integrat de dezvoltare Eclipse poate fi optimizat folosind [[http://​wi-fi.cs.pub.ro/​~dniculescu/​didactic/​pdsd/​eclipse/​eclipse.ini|o serie de configurări]],​ care vor fi plasate în rădăcina aplicației. ​<​code>​ + 
-student@pdsd2015:​~$ wget http://wi-fi.cs.pub.ro/~dniculescu/didactic/​pdsd/​eclipse/​eclipse.ini +<​code>​ 
-student@pdsd2015:​~$ sudo mv eclipse.ini /opt/eclipse+/opt/Android/SDK/platform-tools/adb shell
 </​code>​ </​code>​
-*/+ 
 + 
 +  
 + 
 + 
 ===== Sisteme de control a versiunilor ===== ===== Sisteme de control a versiunilor =====
 +
  
 ==== Ce este un sistem de control al versiunilor?​ ==== ==== Ce este un sistem de control al versiunilor?​ ====
 +<​spoiler>​
 Un sistem de control al versiunilor (//eng.// VCS - Version Control System) este un mecanism prin intermediul căruia sunt gestionate fișiere / proiecte în dinamică (pe măsură ce sunt modificate),​ în scopul de a se putea realiza revenirea la o anumită stare în caz de eroare (restaurarea unei versiuni stabile) și pentru a permite colaborarea între mai multe echipe care lucrează concomitent la diferite funcționalități ale unui același proiect. Un sistem de control al versiunilor (//eng.// VCS - Version Control System) este un mecanism prin intermediul căruia sunt gestionate fișiere / proiecte în dinamică (pe măsură ce sunt modificate),​ în scopul de a se putea realiza revenirea la o anumită stare în caz de eroare (restaurarea unei versiuni stabile) și pentru a permite colaborarea între mai multe echipe care lucrează concomitent la diferite funcționalități ale unui același proiect.
  
 Deși în mod curent astfel de produse sunt folosite pentru dezvoltarea de aplicații (urmărindu-se o gestionare eficientă a codului sursă și a utilizatorilor care implementează anumite funcționalități sau corectează defecte), ele pot fi folosite și pentru alte tipuri de proiecte, ce implică lucrul cu fișiere binare, pentru care diferențele între diferite versiuni se realizează mai dificil. ​ Deși în mod curent astfel de produse sunt folosite pentru dezvoltarea de aplicații (urmărindu-se o gestionare eficientă a codului sursă și a utilizatorilor care implementează anumite funcționalități sau corectează defecte), ele pot fi folosite și pentru alte tipuri de proiecte, ce implică lucrul cu fișiere binare, pentru care diferențele între diferite versiuni se realizează mai dificil. ​
 +</​spoiler>​
  
 ==== Clasificarea sistemelor de control al versiunilor ==== ==== Clasificarea sistemelor de control al versiunilor ====
 +<​spoiler>​
 În prezent, sunt folosite trei tipuri de sisteme de control a versiunilor,​ fiecare dintre acestea fiind adecvate unei anumite situații: În prezent, sunt folosite trei tipuri de sisteme de control a versiunilor,​ fiecare dintre acestea fiind adecvate unei anumite situații:
   - **sisteme locale de control a versiunilor**,​ în cazul în care se dorește monitorizarea variantelor unui fișier exclusiv pe discul local; în baza de date, versiunile sunt reținute sub forma diferențelor (rezultatul comenzii ''​diff''​) dintre versiuni succesive, astfel că se poate reveni oricând la o stare anterioară (exemplu: rcs);   - **sisteme locale de control a versiunilor**,​ în cazul în care se dorește monitorizarea variantelor unui fișier exclusiv pe discul local; în baza de date, versiunile sunt reținute sub forma diferențelor (rezultatul comenzii ''​diff''​) dintre versiuni succesive, astfel că se poate reveni oricând la o stare anterioară (exemplu: rcs);
Line 187: Line 194:
     * dezavantaje:​ în cazul când serverul dedicat pe care găsește baza de date cu tot istoricul versiunilor se defectează,​ există riscul de a se pierde toate aceste informații (dacă nu există copii de siguranță),​ păstrându-se doar versiunile salvate pe mașinile utilizatorilor;​ mai mult, într-o astfel de situație utilizatorii se află în incapacitatea de a mai transmite propriile modificări și de a consulta modificările celorlalți;​     * dezavantaje:​ în cazul când serverul dedicat pe care găsește baza de date cu tot istoricul versiunilor se defectează,​ există riscul de a se pierde toate aceste informații (dacă nu există copii de siguranță),​ păstrându-se doar versiunile salvate pe mașinile utilizatorilor;​ mai mult, într-o astfel de situație utilizatorii se află în incapacitatea de a mai transmite propriile modificări și de a consulta modificările celorlalți;​
   - **sisteme distribuite de control a versiunilor** în care consultarea stării actuale a unui fișier presupune și descărcarea,​ pe discul local, a întregului istoric de modificări astfel încât acesta să poată fi reconstituit în situații precum defectarea serverului; de asemenea, acestea au capacitatea de a gestiona mai multe depozite aflate la distanță, chiar în cazul în care acestea conțin același proiect, permițând stabilirea unor anumite fluxuri de transmitere a informației (exemple: Git, Mercurial, Bazaar, Darcs);   - **sisteme distribuite de control a versiunilor** în care consultarea stării actuale a unui fișier presupune și descărcarea,​ pe discul local, a întregului istoric de modificări astfel încât acesta să poată fi reconstituit în situații precum defectarea serverului; de asemenea, acestea au capacitatea de a gestiona mai multe depozite aflate la distanță, chiar în cazul în care acestea conțin același proiect, permițând stabilirea unor anumite fluxuri de transmitere a informației (exemple: Git, Mercurial, Bazaar, Darcs);
 +</​spoiler>​
 ===== GIT ===== ===== GIT =====
  
 ==== Istoric ==== ==== Istoric ====
 +<​spoiler>​
 Apariția Git în 2005 este strâns legată de dezvoltarea kernelului pentru Linux, proiect open-source la care lucra o comunitate destul de numeroasă de programatori. Dacă anterior actualizările erau distribuite sub forma unor arhive ce conțineau modificările (1991-2002),​ respectiv prin intermediul unui sistem distribuit de control al versiunilor denumit BitKeeper (2002-2005),​ pe măsură ce proiectul a devenit mai complex și din ce în ce mai multe persoane și-au exprimat disponibilitatea de a contribui la dezvoltarea acestuia, s-a pus problema conceperii unui produs care să satisfacă cerințele legate de viteză, arhitectură scalabilă, suport pentru dezvoltare non-liniară (numeroase ramificații la care se lucrează concomitent),​ distribuire totală, capacitate de a gestiona proiecte de dimensiuni mari. Apariția Git în 2005 este strâns legată de dezvoltarea kernelului pentru Linux, proiect open-source la care lucra o comunitate destul de numeroasă de programatori. Dacă anterior actualizările erau distribuite sub forma unor arhive ce conțineau modificările (1991-2002),​ respectiv prin intermediul unui sistem distribuit de control al versiunilor denumit BitKeeper (2002-2005),​ pe măsură ce proiectul a devenit mai complex și din ce în ce mai multe persoane și-au exprimat disponibilitatea de a contribui la dezvoltarea acestuia, s-a pus problema conceperii unui produs care să satisfacă cerințele legate de viteză, arhitectură scalabilă, suport pentru dezvoltare non-liniară (numeroase ramificații la care se lucrează concomitent),​ distribuire totală, capacitate de a gestiona proiecte de dimensiuni mari.
 +</​spoiler>​
  
 ==== Caracteristici (obligatoriu) ==== ==== Caracteristici (obligatoriu) ====
Line 212: Line 221:
   - consemnarea propriu-zisă a datelor din zona de așteptare înapoi în directorul Git.   - consemnarea propriu-zisă a datelor din zona de așteptare înapoi în directorul Git.
  
 +<note important>​
 +Git [[https://​ndpsoftware.com/​git-cheatsheet.html|cheatsheet]] - doar o mica parte dintre comenzile din cheatsheet sunt necesare pentru laboratorul de EIM. 
 +</​note>​
 ==== Instalare & Configurare (obligatoriu) ==== ==== Instalare & Configurare (obligatoriu) ====
-Instrucțiunile pentru instalarea și configurarea Git sunt disponibile [[pdsd:​tutoriale:​git|aici]].+Instrucțiunile pentru instalarea și configurarea Git sunt disponibile [[eim:​tutoriale:​git|aici]].
 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@eim-lab:~$ git help <​command>​ 
-student@pdsd2015:~$ git <​command>​ --help +student@eim-lab:~$ git <​command>​ --help 
-student@pdsd2015:~$ man git-<​command>​+student@eim-lab:~$ man git-<​command>​
 </​code>​ </​code>​
  
Line 226: Line 238:
 Î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@eim-lab:~$ 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 244: Line 256:
   * ''​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@eim-lab:~$ git clone git://​github.com/​eim-lab/​Laborator01.git
 </​code>​ </​code>​
     * https <​code>​     * https <​code>​
-student@pdsd2015:~$ git clone https://​github.com/​pdsd2015/​Laborator01+student@eim-lab:~$ git clone https://​github.com/​eim-lab/​Laborator01
 </​code>​ </​code>​
     * ssh <​code>​     * ssh <​code>​
-student@pdsd2015:~$ git clone git@github.com:​pdsd2015/​Laborator01.git+student@eim-lab:~$ git clone git@github.com:​eim-lab/​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 265: Line 277:
 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@eim-lab:~$ 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 272: Line 284:
 </​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@eim-lab:~$ 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 284: Line 296:
 </​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@eim-lab:~$ 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 311: Line 323:
         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 329: Line 341:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git add MyFirstAndroidApplication/​*+student@eim-lab:~$ git add MyFirstAndroidApplication/​*
 </​code>​ </​code>​
  
Line 341: Line 353:
  
 <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@eim-lab:~$ mv <​source>​ <​target>​ 
-student@pdsd2015:~$ git rm <​source>​ +student@eim-lab:~$ git rm <​source>​ 
-student@pdsd2015:~$ git add <​target>​+student@eim-lab:~$ git add <​target>​
 </​code></​note>​ </​code></​note>​
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git mv README.md README.txt+student@eim-lab:~$ git mv README.md README.txt
 </​code>​ </​code>​
  
Line 357: Line 369:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git rm LICENSE+student@eim-lab:~$ git rm LICENSE
 rm '​LICENSE'​ rm '​LICENSE'​
 </​code>​ </​code>​
Line 408: Line 420:
 === 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@eim-lab:~$ git diff
  
 diff --git a/README.md b/README.md diff --git a/README.md b/README.md
Line 418: Line 430:
 +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@eim-lab:~$ git diff --staged
  
 diff --git a/​MyFirstAndroidApplication/​.classpath b/​MyFirstAndroidApplication/​.classpath diff --git a/​MyFirstAndroidApplication/​.classpath b/​MyFirstAndroidApplication/​.classpath
Line 450: Line 462:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git commit -m "​initial commit: graphical user interface, some code to handle the button click"+student@eim-lab:~$ 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 473: Line 485:
  ​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@eim-lab:~$ 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 483: Line 495:
  
 === Etichetarea versiunilor === === Etichetarea versiunilor ===
 +<​spoiler>​
 Unei versiuni consemnate în directorul Git îi poate fi asociată o etichetă (//eng.// tag) prin care se desemnează,​ de regulă, o anumită funcționalitate. ​ Unei versiuni consemnate în directorul Git îi poate fi asociată o etichetă (//eng.// tag) prin care se desemnează,​ de regulă, o anumită funcționalitate. ​
  
 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@eim-lab:~$ 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@eim-lab:~$ 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@eim-lab:~$ 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 501: Line 514:
 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@eim-lab:~$ git tag
 v1.0 v1.0
 </​code>​ </​code>​
Line 508: Line 521:
 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@eim-lab:~$ git show v1.0
 commit 5e4b82a0783e5841e5c5241d44104e8b15e4270f commit 5e4b82a0783e5841e5c5241d44104e8b15e4270f
-Author: ​pdsd2015 ​<pdsd2015@andreirosucojocaru.ro>+Author: ​eim-lab ​<informaticamobila2017@gmail.com>
 Date:   Sun Feb 22 18:00:00 2015 +0300 Date:   Sun Feb 22 18:00:00 2015 +0300
  
Line 518: Line 531:
 Î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@eim-lab:~$ git tag -a v1.1 -m '​version 1.1' e71c1c4b1b9818292b4cda084e47e25bfb573507
 </​code>​ </​code>​
  
Line 526: Line 539:
   * pentru o singură etichetă, se specifică denumirea acesteia ''​git push <​remote_name>​ <​tag>'';​   * pentru o singură etichetă, se specifică denumirea acesteia ''​git push <​remote_name>​ <​tag>'';​
   * pentru toate etichetele, se folosește comanda ''​%%git push <​remote_name>​ --tags%%''​.   * pentru toate etichetele, se folosește comanda ''​%%git push <​remote_name>​ --tags%%''​.
 +</​spoiler>​
  
 === Vizualizarea istoricului de versiuni === === Vizualizarea istoricului de versiuni ===
Line 546: Line 560:
 | ''​%%--graph%%''​ | afișează un graf (în format ASCII) al ramificațiilor,​ ilustrând momentul la care acestea au fost combinate | | ''​%%--graph%%''​ | afișează un graf (în format ASCII) al ramificațiilor,​ ilustrând momentul la care acestea au fost combinate |
 | ''​%%--pretty%%''​ | modifică formatul în care sunt afișate informațiile despre versiuni:\\ ♦ ''​oneline''​ - informațiile despre fiecare consemnare sunt afișate pe o singură linie\\ ♦ ''​short'',​ ''​full'',​ ''​fuller''​ - controlează cantitatea de informație\\ ♦ ''​format''​ - permite personalizarea informațiilor,​ util pentru situația în care conținutul urmează să fie prelucrat în mod automat:\\ ✔ ''​%H''​ - suma de control, ''​%h''​ - suma de control prescurtată\\ ✔ ''​%T''​ - arborele sumei de control, ''​%t''​ - arborele sumei de control prescurtat\\ ✔ ''​%P''​ - suma de control a părintelui,​ ''​%p''​ - suma de control prescurtată a părintelui\\ ✔ ''​%an''​ - numele autorului, ''​%ae''​ - adresa de poștă electonică a autorului\\ ✔ ''​%ad''​ - data autorului, ''​%ar''​ - data autorului (relativă)\\ ✔ ''​%cn''​ - numele contributorului*),​ ''​%ce''​ - adresa de poștă electronică a contributorului\\ ✔ ''​%cd''​ - data contributorului,​ ''​%cr''​ - data contributorului (relativă)\\ ✔ ''​%s''​ - subiectul | | ''​%%--pretty%%''​ | modifică formatul în care sunt afișate informațiile despre versiuni:\\ ♦ ''​oneline''​ - informațiile despre fiecare consemnare sunt afișate pe o singură linie\\ ♦ ''​short'',​ ''​full'',​ ''​fuller''​ - controlează cantitatea de informație\\ ♦ ''​format''​ - permite personalizarea informațiilor,​ util pentru situația în care conținutul urmează să fie prelucrat în mod automat:\\ ✔ ''​%H''​ - suma de control, ''​%h''​ - suma de control prescurtată\\ ✔ ''​%T''​ - arborele sumei de control, ''​%t''​ - arborele sumei de control prescurtat\\ ✔ ''​%P''​ - suma de control a părintelui,​ ''​%p''​ - suma de control prescurtată a părintelui\\ ✔ ''​%an''​ - numele autorului, ''​%ae''​ - adresa de poștă electonică a autorului\\ ✔ ''​%ad''​ - data autorului, ''​%ar''​ - data autorului (relativă)\\ ✔ ''​%cn''​ - numele contributorului*),​ ''​%ce''​ - adresa de poștă electronică a contributorului\\ ✔ ''​%cd''​ - data contributorului,​ ''​%cr''​ - data contributorului (relativă)\\ ✔ ''​%s''​ - subiectul |
-| ''​%%--oneline%%''​ | afișează numai câteva caractere (din cele 40) ale sumei de control SHA-1 asociată fiecărei consemnări,​ pe o singură linie\\ prescurtare pentru ''​%%--pretty=oneline ​abbrev-commit%%''​ |+| ''​%%--oneline%%''​ | afișează numai câteva caractere (din cele 40) ale sumei de control SHA-1 asociată fiecărei consemnări,​ pe o singură linie\\ prescurtare pentru ''​%%--pretty=online ​abbrev-commit%%''​ |
 *) Distincția dintre autor și contributor este următoarea:​ *) Distincția dintre autor și contributor este următoarea:​
   * autorul este utilizatorul care a implementat o anumită funcționalitate   * autorul este utilizatorul care a implementat o anumită funcționalitate
Line 565: Line 579:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git log --pretty=format:"​%h - %an [%ae] - %ar -> %s" --graph+student@eim-lab:~$ 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 572: Line 586:
 |/  ​ |/  ​
 * 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 - eim-lab ​[informaticamobila2017@gmail.com] - 2 days ago -> Initial commit
 </​code>​ </​code>​
 ==== Gestiunea depozitelor la distanță (obligatoriu) ==== ==== Gestiunea depozitelor la distanță (obligatoriu) ====
 Mai mulți utilizatori pot colabora în cadrul unui proiect Git aflat pe un server la distanță (//eng.// remote repository),​ pe care pot avea fie doar drepturi de citire fie atât drepturi de citire cât și de scriere. Operațiile pe care le pot realiza sunt descărcarea de cod sursă, respectiv încărcarea (în situația în care au drepturi suficiente). Mai mulți utilizatori pot colabora în cadrul unui proiect Git aflat pe un server la distanță (//eng.// remote repository),​ pe care pot avea fie doar drepturi de citire fie atât drepturi de citire cât și de scriere. Operațiile pe care le pot realiza sunt descărcarea de cod sursă, respectiv încărcarea (în situația în care au drepturi suficiente).
  
-=== Vizualizarea referințelor către depozitele la distanță (git remote) ===+=== Vizualizarea referințelor către depozitele la distanță (git remote) ​Obligatoriu ​===
 Prin intermediul comenzii **''​git remote''​**,​ pot fi consultate depozitele la distanță cu care se lucrează în mod curent. În mod implicit, sunt afișate doar denumirile scurte asociate acestora. În cazul în care se dorește să se afișeze și URL-ul locației corespunzătoare fiecărui depozit la distanță, se va folosi opțiunea ''​-v''​. Prin intermediul comenzii **''​git remote''​**,​ pot fi consultate depozitele la distanță cu care se lucrează în mod curent. În mod implicit, sunt afișate doar denumirile scurte asociate acestora. În cazul în care se dorește să se afișeze și URL-ul locației corespunzătoare fiecărui depozit la distanță, se va folosi opțiunea ''​-v''​.
  
Line 583: Line 597:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git remote -v+student@eim-lab:~$ 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/​eim-lab/​Laborator01 (fetch) 
-origin ​ https://​github.com/​pdsd2015/​Laborator01 (push)+origin ​ https://​github.com/​eim-lab/​Laborator01 (push)
 </​code>​ </​code>​
  
 Utilizatorul va avea drepturi de scriere numai pe depozitele la distanță pentru care dispune de cheile SSH corespunzătoare. Utilizatorul va avea drepturi de scriere numai pe depozitele la distanță pentru care dispune de cheile SSH corespunzătoare.
  
-=== Adăugarea unei referințe către un depozit la distanță ===+=== Adăugarea unei referințe către un depozit la distanță ​(Obligatoriu) ​===
 Pentru a putea referi un depozit la distanță prin intermediul unei denumiri (mai scurte) se va rula comenda ''​git remote add'':​ Pentru a putea referi un depozit la distanță prin intermediul unei denumiri (mai scurte) se va rula comenda ''​git remote add'':​
  
Line 602: Line 616:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git remote add Laborator01_andreirosucojocaru git@github.com:​andreirosucojocaru/​Laborator01.git+student@eim-lab:~$ git remote add Laborator01_andreirosucojocaru git@github.com:​andreirosucojocaru/​Laborator01.git
 </​code>​ </​code>​
  
-=== Descărcarea de cod sursă de pe un depozit la distanță ===+=== Descărcarea de cod sursă de pe un depozit la distanță ​(Obligatoriu) ​===
 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@eim-lab:~$ git clone https://​github.com/​eim-lab/​Laborator01.git
 Cloning into '​Laborator01'​... Cloning into '​Laborator01'​...
 remote: Counting objects: 5, done. remote: Counting objects: 5, done.
Line 617: Line 631:
 </​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@eim-lab:~$ 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 632: Line 646:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git push origin master+student@eim-lab:~$ 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 638: Line 652:
 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/​eim-lab/​Laborator01
    ​e2594f8..839f14e ​ master -> master    ​e2594f8..839f14e ​ master -> master
 </​code>​ </​code>​
Line 653: Line 667:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git remote show origin+student@eim-lab:~$ git remote show origin
 * remote origin * remote origin
-  Fetch URL: https://​github.com/​pdsd2015/​Laborator01 +  Fetch URL: https://​github.com/​eim-lab/​Laborator01 
-  Push  URL: https://​github.com/​pdsd2015/​Laborator01+  Push  URL: https://​github.com/​eim-lab/​Laborator01
   HEAD branch: master   HEAD branch: master
   Remote branch:   Remote branch:
Line 670: Line 684:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git remote rename Laborator01_andreirosucojocaru Lab01_arc+student@eim-lab:~$ git remote rename Laborator01_andreirosucojocaru Lab01_arc
 </​code>​ </​code>​
  
Line 679: Line 693:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git remote rm Lab00_arc+student@eim-lab:~$ git remote rm Lab00_arc
 </​code>​ </​code>​
  
-==== Gestiunea ramificațiilor ​====+<​spoiler ​Gestiunea ramificațiilor ​(facultativ)>​
 O ramificație (//eng.// branch) marchează un punct din care dezvoltarea unui proiect se realizează în zone diferite (corespunzătoare unor anumite funcționalități sau unor anumite echipe care le implementează),​ în scopul obținerii unui nivel de izolare cât mai mare până la obținerea rezultatului dorit, când mai multe ramificații pot fi integrate împreună. ​ O ramificație (//eng.// branch) marchează un punct din care dezvoltarea unui proiect se realizează în zone diferite (corespunzătoare unor anumite funcționalități sau unor anumite echipe care le implementează),​ în scopul obținerii unui nivel de izolare cât mai mare până la obținerea rezultatului dorit, când mai multe ramificații pot fi integrate împreună. ​
  
Line 697: Line 711:
 Ramificația pe care se găsește utilizatorul în mod curent este indicată de o altă referință,​ denumită ''​HEAD''​. Ramificația pe care se găsește utilizatorul în mod curent este indicată de o altă referință,​ denumită ''​HEAD''​.
  
-=== Vizualizarea ramificațiilor ​===+ **Vizualizarea ramificațiilor**  
 Pentru a se lista ramificațiile din cadrul proiectului curent, se rulează comanda **''​git branch''​**,​ fără nici un parametru: Pentru a se lista ramificațiile din cadrul proiectului curent, se rulează comanda **''​git branch''​**,​ fără nici un parametru:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git branch+student@eim-lab:~$ git branch
   customized_message   customized_message
   fade_effect   fade_effect
Line 719: Line 734:
 <note warning>​Sistemul Git nu va permite ștergerea ramificațiilor al căror conținut nu a fost încă integrat decât în situația în care se rulează comanda ''​git branch -D <​branch_name>'',​ cu pierderea modificărilor realizate în cadrul acesteia.</​note>​ <note warning>​Sistemul Git nu va permite ștergerea ramificațiilor al căror conținut nu a fost încă integrat decât în situația în care se rulează comanda ''​git branch -D <​branch_name>'',​ cu pierderea modificărilor realizate în cadrul acesteia.</​note>​
  
-=== Crearea unei ramificații ​===+ ​** ​Crearea unei ramificații ​**
 Comanda **''​git branch <​branch_name>''​** are rolul de a crea o nouă ramificație în cadrul proiectului,​ având o denumirea dată. Inițial, aceasta va fi o referință către aceeași versiune ca și ''​master'',​ urmând ca pe măsură ce sunt realizate noi consemnări,​ să indice obiectele de tip ''​commit''​ corespunzătoare acestora. Comanda **''​git branch <​branch_name>''​** are rolul de a crea o nouă ramificație în cadrul proiectului,​ având o denumirea dată. Inițial, aceasta va fi o referință către aceeași versiune ca și ''​master'',​ urmând ca pe măsură ce sunt realizate noi consemnări,​ să indice obiectele de tip ''​commit''​ corespunzătoare acestora.
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git branch customized_message +student@eim-lab:~$ git branch customized_message 
-student@pdsd2015:~$ git branch fade_effect+student@eim-lab:~$ git branch fade_effect
 </​code>​ </​code>​
  
-=== Transferul între ramificații ​===+ **Transferul între ramificații** 
 Prin intermediul comenzii **''​git checkout <​branch_name>''​** se realizează mutarea din ramificația curentă în ramificația indicată ca parametru, prin modificarea pointerului ''​HEAD''​. Totodată, se actualizează și conținutul directorului de lucru de pe discul local, corespunzător cu structura ramificației pe care s-a trecut. Prin intermediul comenzii **''​git checkout <​branch_name>''​** se realizează mutarea din ramificația curentă în ramificația indicată ca parametru, prin modificarea pointerului ''​HEAD''​. Totodată, se actualizează și conținutul directorului de lucru de pe discul local, corespunzător cu structura ramificației pe care s-a trecut.
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git checkout customized_message+student@eim-lab:~$ git checkout customized_message
 Switched to branch '​customized_message'​ Switched to branch '​customized_message'​
 </​code>​ </​code>​
Line 742: Line 757:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git checkout -b customized_message+student@eim-lab:~$ git checkout -b customized_message
 Switched to a new branch '​customized_message'​ Switched to a new branch '​customized_message'​
 </​code>​ </​code>​
  
-=== Integrarea conținutului a două ramificații și rezolvarea conflictelor ​===+ **Integrarea conținutului a două ramificații și rezolvarea conflictelor** 
 Integrarea modificărilor realizate pe o ramificație poate fi realizată în Git prin: Integrarea modificărilor realizate pe o ramificație poate fi realizată în Git prin:
   * merge   * merge
Line 752: Line 767:
 Rezultatul celor două tipuri de operații este întotdeauna același, în sensul că versiunea obținută va avea același conținut, distincția constând în modul în care este consemnat istoricul: în cazul merge acesta reflectă exact ce s-a întâmplat (care este punctul din care proiectul a fost dezvoltat în paralel și care este momentul de timp în care modificările au fost integrate), fiind însă mai dificil de gestionat, în timp ce în cazul rebase, dezvoltarea proiectului apare ca fiind liniară, ceea ce face ca referințele către stările proiectului să poată fi mutate mai ușor, putând fi introduse însă probleme serioase în cazul în care această operație este realizată pentru o consemnare existentă pe un server la distanță (aceasta dispare de pe server, în timp ce poate să existe în directoarele de lucru de pe discul local al utilizatorilor). Rezultatul celor două tipuri de operații este întotdeauna același, în sensul că versiunea obținută va avea același conținut, distincția constând în modul în care este consemnat istoricul: în cazul merge acesta reflectă exact ce s-a întâmplat (care este punctul din care proiectul a fost dezvoltat în paralel și care este momentul de timp în care modificările au fost integrate), fiind însă mai dificil de gestionat, în timp ce în cazul rebase, dezvoltarea proiectului apare ca fiind liniară, ceea ce face ca referințele către stările proiectului să poată fi mutate mai ușor, putând fi introduse însă probleme serioase în cazul în care această operație este realizată pentru o consemnare existentă pe un server la distanță (aceasta dispare de pe server, în timp ce poate să existe în directoarele de lucru de pe discul local al utilizatorilor).
  
-== Varianta MERGE ==+ **Varianta MERGE** 
 Integrarea modificărilor realizate pe o ramificație în varianta MERGE se face prin comanda **''​git merge <​branch_name>''​**,​ după ce toate modificările din cadrul acesteia au fost consemnate și s-a trecut înapoi pe ramificația ''​master''​. Integrarea modificărilor realizate pe o ramificație în varianta MERGE se face prin comanda **''​git merge <​branch_name>''​**,​ după ce toate modificările din cadrul acesteia au fost consemnate și s-a trecut înapoi pe ramificația ''​master''​.
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git checkout master+student@eim-lab:~$ git checkout master
 Switched to branch '​master'​ Switched to branch '​master'​
-student@pdsd2015:~$ git merge customized_message+student@eim-lab:~$ 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@eim-lab:~$ 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 776: Line 791:
     - folosind un utilitar vizual (indicat de variabila de configurare ''​merge.tool''​)     - folosind un utilitar vizual (indicat de variabila de configurare ''​merge.tool''​)
  
-== Varianta REBASE ​==+ **Varianta REBASE**
 Integrarea modificărilor realizate pe o ramificație în varianta REBASE se face prin comanda **''​git rebase master''​**,​ după ce toate modificările din cadrul acesteia au fost consemnate. În acest caz, se identifică modificările realizate în cadrul ramificației de la cel mai recent strămoș comun, acestea fiind aplicate versiunii indicate de ramificația ''​master''​ și introduse într-o consemnare care o va referi direct pe aceasta, ca părinte. După această operație, se poate trece înapoi pe ramificația ''​master'',​ integrându-se printr-o operație de tip fast-forward modificările din ramificația obținută (spre care va indica referința ramificației care a fost integrată). Integrarea modificărilor realizate pe o ramificație în varianta REBASE se face prin comanda **''​git rebase master''​**,​ după ce toate modificările din cadrul acesteia au fost consemnate. În acest caz, se identifică modificările realizate în cadrul ramificației de la cel mai recent strămoș comun, acestea fiind aplicate versiunii indicate de ramificația ''​master''​ și introduse într-o consemnare care o va referi direct pe aceasta, ca părinte. După această operație, se poate trece înapoi pe ramificația ''​master'',​ integrându-se printr-o operație de tip fast-forward modificările din ramificația obținută (spre care va indica referința ramificației care a fost integrată).
  
Line 782: Line 797:
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git checkout customized_message +student@eim-lab:~$ git checkout customized_message 
-student@pdsd2015:~$ git rebase master+student@eim-lab:~$ 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@eim-lab:~$ git checkout master
 Switched to branch '​master'​ Switched to branch '​master'​
-student@pdsd2015:~$ git merge customized_message+student@eim-lab:~$ git merge customized_message
 </​code>​ </​code>​
  
Line 795: Line 810:
 Astfel, Astfel,
 <​code>​ <​code>​
-student@pdsd2015:~$ git rebase master customized_message+student@eim-lab:~$ git rebase master customized_message
 </​code>​ </​code>​
 este echivalentă cu este echivalentă cu
 <​code>​ <​code>​
-student@pdsd2015:~$ git checkout customized_message +student@eim-lab:~$ git checkout customized_message 
-student@pdsd2015:~$ git rebase master+student@eim-lab:~$ git rebase master
 </​code>​ </​code>​
  
Line 809: Line 824:
 <note warning>​Varianta REBASE nu trebuie folosită asupra versiunilor care se găsesc în depozite rezidente pe servere la distanță întrucât referințele către acestea nu vor mai exista, făcând dificilă integrarea modificărilor realizate de alți utilizatori care se bazau pe ea. De aceea, ea reprezintă o soluție doar pentru acele ramificații care nu au fost făcute publice niciodată.</​note>​ <note warning>​Varianta REBASE nu trebuie folosită asupra versiunilor care se găsesc în depozite rezidente pe servere la distanță întrucât referințele către acestea nu vor mai exista, făcând dificilă integrarea modificărilor realizate de alți utilizatori care se bazau pe ea. De aceea, ea reprezintă o soluție doar pentru acele ramificații care nu au fost făcute publice niciodată.</​note>​
  
-=== Distrugerea unei ramificații ​===+ **Distrugerea unei ramificații**
 Ștergerea unei ramificaţii este necesară în momentul în care aceasta referă o consemnare spre care mai există și alte referințe, ale unor ramificaţii în care au fost integrate (de regulă ''​master''​). O astfel de operaţie poate fi realizată prin comanda **''​git branch -d <​branch_name>''​**. Ștergerea unei ramificaţii este necesară în momentul în care aceasta referă o consemnare spre care mai există și alte referințe, ale unor ramificaţii în care au fost integrate (de regulă ''​master''​). O astfel de operaţie poate fi realizată prin comanda **''​git branch -d <​branch_name>''​**.
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git branch -d customized_message+student@eim-lab:~$ 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@eim-lab:~$ git branch -d fade_effect
 Deleted branch fade_effect (was 30fe2f3). Deleted branch fade_effect (was 30fe2f3).
 </​code>​ </​code>​
  
-=== Lucrul cu ramificații la distanță ​===+ **Lucrul cu ramificații la distanță**
 O ramificație la distanță este o referință către starea unei ramificații aflată într-un depozit găzduit de un server la distanță. Ele sunt stocate în directorul local, fiind descărcate în mod automat în momentul în care se realizează comunicații prin rețea. Nu se pot realiza nici un fel de operații asupra lor, cu excepția consultării,​ pentru a se realiza mai ușor comparația față de directorul de lucru de pe discul local. O ramificație la distanță este o referință către starea unei ramificații aflată într-un depozit găzduit de un server la distanță. Ele sunt stocate în directorul local, fiind descărcate în mod automat în momentul în care se realizează comunicații prin rețea. Nu se pot realiza nici un fel de operații asupra lor, cu excepția consultării,​ pentru a se realiza mai ușor comparația față de directorul de lucru de pe discul local.
  
Line 838: Line 853:
 <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 ​=====+</​spoiler>​ 
 + 
 +<​hidden>​ 
 +===== Crearea unei aplicații Android în Eclipse - nu mai folosim eclipse ​=====
  
 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//.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid01.png?​nolink&​500 }}+{{ :​eim:​laboratoare:​laborator01:​eclipse_project01.png?​nolink&​500 }}
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid02.png?​nolink&​500 }}+{{ :​eim:​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 850: Line 868:
 Ulterior, se vor specifica detaliile proiectului:​ Ulterior, se vor specifica detaliile proiectului:​
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid03.png?​nolink&​500 }}+{{ :​eim:​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, 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 870: Line 888:
   * atașarea proiectului la o zonă de lucru   * atașarea proiectului la o zonă de lucru
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid04.png?​nolink&​500 }}+{{ :​eim:​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.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid05.png?​nolink&​500 }}+{{ :​eim:​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.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid06.png?​nolink&​500 }}+{{ :​eim:​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).
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid07.png?​nolink&​500 }}+{{ :​eim:​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).
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid08.png?​nolink&​500 }}+{{ :​eim:​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).
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid09.png?​nolink&​500 }}+{{ :​eim:​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.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseproiectandroid10.png?​nolink&​400 }}+{{ :​eim:​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 - 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 902: Line 920:
 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//.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseexemple01.png?​nolink&​500 }}+{{ :​eim:​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.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseexemple02.png?​nolink&​500 }}+{{ :​eim:​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.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseexemple03.png?​nolink&​500 }}+{{ :​eim:​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.
  
-{{ :​eim:​laboratoare:​laborator01:​eclipseexemple04.png?​nolink&​400 }}+{{ :​eim:​laboratoare:​laborator01:​eclipse_sample_project04.png?​nolink&​400 }} 
 + 
 +</​hidden>​ 
 + 
 +===== Crearea unei aplicații Android în Android Studio - obligatoriu ===== 
 + 
 +Pentru a crea o aplicație Android se selectează //Start a New Android Studio project//​. 
 + 
 +{{ :​eim:​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. 
 + 
 +{{ :​eim:​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. 
 + 
 +{{ :​eim:​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//​). 
 + 
 +{{ :​eim:​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. 
 + 
 +{{ :​eim:​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''​. 
 + 
 +{{ :​eim:​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ă. 
 + 
 +{{ :​eim:​laboratoare:​laborator01:​android_studio_project07.png?​nolink }} 
 + 
 +{{ :​eim:​laboratoare:​laborator01:​android_studio_project08.png?​nolink&​400 }} 
 + 
 +===== Testarea exemplelor de aplicații Android în Android Studio - obligatoriu ===== 
 + 
 +Accesarea unui exemplu de aplicație Android se face prin intermediul opțiunii //Import an Android code sample//. 
 + 
 +{{ :​eim:​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. 
 + 
 +{{ :​eim:​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ă. 
 + 
 +{{ :​eim:​laboratoare:​laborator01:​android_studio_sample_project03.png?​nolink&​600 }} 
 + 
 +{{ :​eim:​laboratoare:​laborator01:​android_studio_sample_project04.png?​nolink&​400 }}
  
 ===== Activitate de Laborator ===== ===== Activitate de Laborator =====
Line 920: Line 1003:
     - 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 ​Android Studio ​cu plugin-uri pentru Android, Genymotion;​ 
-    - emulator Genymotion în care se configurează un dispozitiv virtual ​Nexus S 4.1.- API 16 400x800;+    - emulator Genymotion în care se configurează un dispozitiv virtual ​Phone 7.- API 24 960x540;
   - 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@eim-lab:~$ git config --global user.name "​Perfect Student"​ 
-student@pdsd2015:~$ git config --global user.email "​perfect_student@cti.pub.ro"​ +student@eim-lab:~$ git config --global user.email "​perfect_student@cti.pub.ro"​ 
-student@pdsd2015:~$ git config --global core.editor gedit +student@eim-lab:~$ git config --global core.editor gedit 
-student@pdsd2015:~$ git config --global merge.tool diff+student@eim-lab:~$ 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@eim-lab:~$ git config ​--list
 </​code>​ <​code>​ </​code>​ <​code>​
-student@pdsd2015:~$ cat .git/config+student@eim-lab:~$ cat .git/config
 </​code>​ <​code>​ </​code>​ <​code>​
-student@pdsd2015:~$ git config user.name +student@eim-lab:~$ git config user.name 
-student@pdsd2015:~$ git config user.email +student@eim-lab:~$ git config user.email 
-student@pdsd2015:~$ git config core.editor +student@eim-lab:~$ git config core.editor 
-student@pdsd2015:~$ git config merge.tool+student@eim-lab:~$ 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/​eim-lab/​Laborator01|]]. În urma acestei operații, directorul Laborator01 va trebui să se conțină ​un director ''​labtaks''​ care conține proiectele 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 clone https://​www.github.com/​pdsd2015/​Laborator01+student@eim-lab:~$ git clone https://​www.github.com/​eim-lab/​Laborator01.git
 </​code>​ </​code>​
-  - Să se ruleze aplicația schelet: New/​Project/​Android Project from existing code/, și se indică directorul Laborator01 ​ 
   - 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@eim-lab:~$ cd Laborator01 
-student@pdsd2015:​~/​Laborator01$ git remote add Laborator01_perfectstudent https://​github.com/​perfectstudent/​Laborator01 +student@eim-lab:​~/​Laborator01$ git remote add Laborator01_perfectstudent https://​github.com/​perfectstudent/​Laborator01 
-student@pdsd2015:​~/​Laborator01$ git push Laborator01_perfectstudent master+student@eim-lab:​~/​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 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().toString().replace("​xxx",​ "​\n"​+userNameEditText.getText()));​ greetingTextView.setText(greetingTextView.getText().toString().replace("​xxx",​ "​\n"​+userNameEditText.getText()));​
Line 960: Line 1044:
 </​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@eim-lab:​~/​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@eim-lab:​~/​Laborator01$ git commit -m "​implemented functionality for customized message and fade effect"​ 
-student@pdsd2015:​~/​Laborator01$ git push Laborator01_perfectstudent master+student@eim-lab:​~/​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 Android Studio, ''​AccelerometerPlay''​ , din cadrul categoriei //Getting Started//. (sau https://​github.com/​googlearchive/​android-AccelerometerPlay) 
 ===== Resurse Utile ===== ===== Resurse Utile =====
  
Line 974: Line 1060:
 [[http://​git-scm.com/​book|Scott CHACON, Pro Git, Apress, 2009]] - capitolele 1-3\\  [[http://​git-scm.com/​book|Scott CHACON, Pro Git, Apress, 2009]] - capitolele 1-3\\ 
 [[https://​github.com/​|GitHub]] [[https://​github.com/​|GitHub]]
 +
eim/laboratoare/laborator01.1456342568.txt.gz · Last modified: 2016/02/24 21:36 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0