Differences

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

Link to this comparison view

eim:laboratoare:laborator02 [2016/03/04 09:45]
tmp.andrei.cojocaru
eim:laboratoare:laborator02 [2022/03/14 09:32] (current)
dan_valentin.bina [Ciclul de Viață al unei Activități]
Line 102: Line 102:
     android:​paddingTop="​@dimen/​activity_vertical_margin"​     android:​paddingTop="​@dimen/​activity_vertical_margin"​
     android:​orientation="​vertical"​     android:​orientation="​vertical"​
-    tools:​context="​ro.pub.cs.systems.pdsd.lab02.graphicuserinterface.LifecycleMonitorActivity"​ >+    tools:​context="​ro.pub.cs.systems.eim.lab02.graphicuserinterface.LifecycleMonitorActivity"​ >
     ​     ​
     <!-- ... -->     <!-- ... -->
Line 152: Line 152:
 <note tip>​Distincția între cele două situații în care o activitate este distrusă poate fi realizată prin intermediul metodei ''​isFinishing()''​.</​note>​ <note tip>​Distincția între cele două situații în care o activitate este distrusă poate fi realizată prin intermediul metodei ''​isFinishing()''​.</​note>​
  
-{{ :​eim:​laboratoare:​laborator02:​ciclul_de_viata_al_unei_activitati_2.png?​nolink&​700 }}+{{ :​eim:​laboratoare:​laborator02:​ciclul_de_viata_al_unei_activitati_2_nou.png?​nolink&​700 }} 
  
 <note important>​Fiecare dintre metodele ce gestionează ciclul de viață al activității trebuie să apeleze metoda părintelui. În cazul metodei ''​onCreate()'',​ este necesar ca acest lucru să fie realizat la începutul metodei.</​note>​ <note important>​Fiecare dintre metodele ce gestionează ciclul de viață al activității trebuie să apeleze metoda părintelui. În cazul metodei ''​onCreate()'',​ este necesar ca acest lucru să fie realizat la începutul metodei.</​note>​
Line 272: Line 273:
   super.onSaveInstanceState(savedInstanceState);​   super.onSaveInstanceState(savedInstanceState);​
   EditText usernameEditText = (EditText)findViewById(R.id.username_edit_text);​   EditText usernameEditText = (EditText)findViewById(R.id.username_edit_text);​
-  savedInstanceState.putString(Constants.USERNAME_EDIT_TEXT,​ usernameEditText.getText());​+  savedInstanceState.putString(Constants.USERNAME_EDIT_TEXT,​ usernameEditText.getText().toString());
 } }
 </​code>​ </​code>​
Line 325: Line 326:
  
 ==== Coordonarea Activităților ==== ==== Coordonarea Activităților ====
 +<​spoiler>​
 În situația în care o activitate nouă este pornită în timp ce o activitate veche este în execuție, fiind necesară transmiterea de informații dintre acestea, este util să se cunoască ordinea în care sunt apelate metodele care gestionează ciclul de viață al celor două activități,​ astfel încât comunicarea dintre acestea să se realizeze în mod corect: În situația în care o activitate nouă este pornită în timp ce o activitate veche este în execuție, fiind necesară transmiterea de informații dintre acestea, este util să se cunoască ordinea în care sunt apelate metodele care gestionează ciclul de viață al celor două activități,​ astfel încât comunicarea dintre acestea să se realizeze în mod corect:
   - se apelează metoda ''​onPause()''​ a activității vechi - aici trebuie realizată partea de scriere a informațiilor care trebuie să fie trimise;   - se apelează metoda ''​onPause()''​ a activității vechi - aici trebuie realizată partea de scriere a informațiilor care trebuie să fie trimise;
Line 333: Line 334:
  
 {{ :​eim:​laboratoare:​laborator02:​coordonare_activitati.png?​nolink&​400 }} {{ :​eim:​laboratoare:​laborator02:​coordonare_activitati.png?​nolink&​400 }}
 +</​spoiler>​
 +===== Structura unui Proiect Android =====
  
-===== Structura unui Proiect Android în Eclipse ​Luna SR1a (4.4.1) =====+<​hidden>​ 
 +==== Eclipse ​- nu mai folosim eclipse ​====
  
-Structura unui proiect Android în mediul integrat de dezvoltare Eclipse ​Luna SR1a (4.4.1) ​poate fi observată în fereastra //Package Explorer//.+Structura unui proiect Android în mediul integrat de dezvoltare Eclipse poate fi observată în fereastra //Package Explorer//.
  
 {{ :​eim:​laboratoare:​laborator02:​eclipse_package_explorer.png?​nolink&​300 }} {{ :​eim:​laboratoare:​laborator02:​eclipse_package_explorer.png?​nolink&​300 }}
Line 346: Line 350:
     * ''​maps.jar''​ - folosită de aplicațiile Android care implementează funcționalități legate de localizare.     * ''​maps.jar''​ - folosită de aplicațiile Android care implementează funcționalități legate de localizare.
   * **Android Private Libraries** conține un singur fișier ''​android-support-v4.jar'';​   * **Android Private Libraries** conține un singur fișier ''​android-support-v4.jar'';​
-  * **src** - conține sursele ''​.java''​ ale proiectului,​ organizate pe pachete. În exemplu, codul este organizat pe trei pachete, cea mai importanta clasa fiind ''​LifecycleMonitorActivity.java''​ (în pachetul ''​ro.pub.cs.systems.pdsd.lab02.graphicuserinterface''​) continand activitatea principala a aplicației Android.+  * **src** - conține sursele ''​.java''​ ale proiectului,​ organizate pe pachete. În exemplu, codul este organizat pe trei pachete, cea mai importanta clasa fiind ''​LifecycleMonitorActivity.java''​ (în pachetul ''​ro.pub.cs.systems.eim.lab02.graphicuserinterface''​) continand activitatea principala a aplicației Android.
   * **gen** - cuprinde fișiere generate:   * **gen** - cuprinde fișiere generate:
     * ''​BuildConfig.java''​ - definește unele proprietăți ale aplicației (cum ar fi activarea sau nu a modului de depanare);     * ''​BuildConfig.java''​ - definește unele proprietăți ale aplicației (cum ar fi activarea sau nu a modului de depanare);
Line 378: Line 382:
     android:​paddingTop="​@dimen/​activity_vertical_margin"​     android:​paddingTop="​@dimen/​activity_vertical_margin"​
     android:​orientation="​vertical"​     android:​orientation="​vertical"​
-    tools:​context="​ro.pub.cs.systems.pdsd.lab02.graphicuserinterface.LifecycleMonitorActivity"​ >+    tools:​context="​ro.pub.cs.systems.eim.lab02.graphicuserinterface.LifecycleMonitorActivity"​ >
  
     <​ImageView     <​ImageView
Line 485: Line 489:
 <?xml version="​1.0"​ encoding="​utf-8"?>​ <?xml version="​1.0"​ encoding="​utf-8"?>​
 <​manifest xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​ <​manifest xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​
-    package="​ro.pub.cs.systems.pdsd.lab02"​+    package="​ro.pub.cs.systems.eim.lab02"​
     android:​versionCode="​1"​     android:​versionCode="​1"​
     android:​versionName="​1.0"​ >     android:​versionName="​1.0"​ >
Line 499: Line 503:
         android:​theme="​@style/​AppTheme"​ >         android:​theme="​@style/​AppTheme"​ >
         <​activity         <​activity
-            android:​name="​ro.pub.cs.systems.pdsd.lab02.graphicuserinterface.LifecycleMonitorActivity"​+            android:​name="​ro.pub.cs.systems.eim.lab02.graphicuserinterface.LifecycleMonitorActivity"​
             android:​label="​@string/​app_name"​ >             android:​label="​@string/​app_name"​ >
             <​intent-filter>​             <​intent-filter>​
Line 510: Line 514:
 </​manifest>​ </​manifest>​
 </​file>​ </​file>​
-    * denumirea pachetului aplicației este ''​ro.pub.cs.systems.pdsd.lab02'';​+    * denumirea pachetului aplicației este ''​ro.pub.cs.systems.eim.lab02'';​
     * versiunea codului aplicației este 1 (definit prin intermediul atributului ''​android:​versionCode''​);​ această valoare este utilizată pentru a identifica numărul de versiune al aplicației,​ putând fi folosit pentru a determina (programatic) dacă o aplicație trebuie să fie actualizată;​     * versiunea codului aplicației este 1 (definit prin intermediul atributului ''​android:​versionCode''​);​ această valoare este utilizată pentru a identifica numărul de versiune al aplicației,​ putând fi folosit pentru a determina (programatic) dacă o aplicație trebuie să fie actualizată;​
     * denumirea versiunii aplicației este 1.0 (definită prin intermediul atributului ''​android:​versionName''​);​ această valoare este afișată utilizatorului,​ recomandându-se să se utilizeze formatul ''<​major>​.<​minor>​.<​build>''​     * denumirea versiunii aplicației este 1.0 (definită prin intermediul atributului ''​android:​versionName''​);​ această valoare este afișată utilizatorului,​ recomandându-se să se utilizeze formatul ''<​major>​.<​minor>​.<​build>''​
Line 589: Line 593:
   - în fișierul ''​activity_lifecycle_monitor.xml'',​ prin specificarea proprietății ''​android:​onClick''​ asociată elementului buton având ca valoare denumirea metodei în cauză:\\ <​code>​android:​onClick="​onClick"</​code>​   - în fișierul ''​activity_lifecycle_monitor.xml'',​ prin specificarea proprietății ''​android:​onClick''​ asociată elementului buton având ca valoare denumirea metodei în cauză:\\ <​code>​android:​onClick="​onClick"</​code>​
  
-La compilare, este posibil ca unele clase să nu poată fi rezolvate. Se folosește ''​Ctrl+Shift+O''​ pentru a adăuga automat importurile necesare. ​+La compilare, este posibil ca unele clase să nu poată fi rezolvate. Se folosește ''​Ctrl+Shift+O''​ pentru a adăuga automat importurile necesare
 +</​hidden>​ 
 +==== Android Studio ==== 
 +<​spoiler>​ 
 +În Android Studio, există mai multe perspective sub care poate fi vizualizată structura unui proiect: 
 +  * Project (reprezintă structura de pe discul fizic) 
 +  * Packages 
 +  * Scratches 
 +  * Android (reprezintă gruparea logică a modulelor aplicației Android) 
 +  * Project Files 
 +  * Problems 
 +  * Production 
 +  * Tests 
 +  * Local Unit Tests 
 +  * Android Instrumented Tests 
 +Cele mai frecvent utilizate perspective sunt //Project// și //Android//.
  
 +Organizarea unui proiect Android Studio conține următoarele directoare:
 +
 +{{ :​eim:​laboratoare:​laborator02:​09application_structure_android_studio.png?​nolink&​500 }}
 +
 +  * .gradle - fișiere temporare Gradle (biblioteci descărcate,​ fișiere de configurare)
 +  * .idea - fișiere temporare Android Studio
 +  * app
 +    * build - fișiere generate conținând referințe (adrese) către resursele definite (spre exemplu, în directorul ''​generated/​source''​ se găsesc clasele ''​BuildConfig''​ și ''​R''​);​
 +    * src
 +      * androidTest - cazuri de test
 +      * main
 +        * assets - resurse necompilate
 +        * java - codul sursă java
 +        * res
 +          * drawable - resurse grafice
 +          * layout - interfețe grafice definite static în fișiere XML
 +          * midmap-<​resolution>​ - pictograma aplicației,​ pentru diferite rezoluții
 +          * values - constante care vor fi referite în text
 +            * colors.xml
 +            * dimens.xml
 +            * strings.xml
 +            * styles.xml
 +          * AndroidManifest.xml - doar componentele aplicației Android: activități,​ servicii, receptoare cu difuzare, filtre de intenții pentru fiecare componentă
 +      * test - surse pentru teste unitare
 +  * build - cache pentru fișiere .dex
 +  * gradle
 +  * External Libraries
 +  * alte fișiere (în rădăcină):​
 +    * .gitignore
 +    * <​project>​.iml
 +    * build.gradle
 +    * gradle.properties
 +    * gradlew
 +    * local.properties
 +    * settings.gradle
 +</​spoiler>​
 +
 +==== Gradle ====
 +
 +Android Studio folosește un mecanism automat pentru construirea aplicației Android, denumit **Gradle**, responsabil cu aducerea bibliotecilor referite de pe un depozit la distanță, cu definirea proprietăților aplicației Android, cu compilarea și împachetarea tuturor resurselor folosite, pentru rularea și instalarea aplicației astfel rezultate.
 +
 +Regulile pentru construiea aplicației Android sunt precizate în fișiere ''​build.gradle'',​ care se definesc pentru fiecare modul și proiect constituent.
 +
 +Un fișier de configurare Gradle pentru o aplicație Android conține de regulă două secțiuni:
 +  * ''​android''​ - conține proprietățile aplicației Android
 +    * ''​compileSdkVersion''​ - reprezintă versiunea de SDK care va fi utilizată pentru compilarea proiectului Android
 +    * ''​buildToolsVersion''​ - reprezintă versiunea de Android SDK Build Tools folosită pentru construirea fișierului care va fi instalat pe dispozitivul mobil
 +    * defaultConfig - conține diferite configurări
 +      * ''​applicationId''​ - pachetul care identifică **în mod unic** aplicația Android
 +      * ''​midSdkVersion''​ - platforma minimă pe care se garantează că aplicația Android va rula; astfel, se vor folosi numai funcționalități definite la acest nivel sau funcționalități definite în API-uri superioare, dar care sunt disponibile la nivelul bibliotecilor de suport;
 +      * ''​targetSdkVersion''​ - platforma maximă la care se garantează că aplicația Android va rula (de regulă, este versiunea cea mai recentă și este aceeași versiune folosită pentru compilarea codului sursă);
 +      * ''​versionCode''​ - versiunea curentă a aplicației (număr întreg)
 +      * ''​versionName''​ - versiunea curentă a aplicației,​ afișată către utilizator (format lizibil, de tip șir de caractere)
 +      * ''​testInstrumentationRunner''​ - biblioteca folosită pentru testele aplicației Android
 +  * ''​dependencies''​ - reprezintă bibliotecile de care depinde aplicația Android pentru a putea fi compilată / rulată, precum și reguli de compilare
 +    * ''​compile''​ - se precizează care fișiere sunt luate în considerare pentru classpath ​
 +      * directiva ''​include''​ se folosește pentru a indica tipuri de fișiere care conțin diverse biblioteci);​
 +      * directiva ''​fileTree''​ este utilizată pentru a indica o structura de directoare
 +    * ''​testCompile''​ și ''​androidTestCompile''​ - indică pachete care conțin biblioteci pentru teste unitare.
 +
 +<file .gradle build.gradle>​
 +apply plugin: '​com.android.application'​
 +
 +android {
 +    compileSdkVersion 25
 +    buildToolsVersion "​25.0.2"​
 +    defaultConfig {
 +        applicationId "​ro.pub.systems.eim.lab02.activitylifecyclemonitor"​
 +        minSdkVersion 16
 +        targetSdkVersion 25
 +        versionCode 1
 +        versionName "​1.0"​
 +        testInstrumentationRunner "​android.support.test.runner.AndroidJUnitRunner"​
 +    }
 +    buildTypes {
 +        release {
 +            minifyEnabled false
 +            proguardFiles getDefaultProguardFile('​proguard-android.txt'​),​ '​proguard-rules.pro'​
 +        }
 +    }
 +}
 +dependencies {
 +    compile fileTree(dir:​ '​libs',​ include: ['​*.jar'​])
 +    compile '​com.android.support:​appcompat-v7:​25.2.0'​
 +}
 +</​file>​
 ===== Rularea și Depanarea unei aplicații Android ===== ===== Rularea și Depanarea unei aplicații Android =====
  
Line 607: Line 712:
 Depanarea unei aplicații Android poate fi realizată în mod clasic, ca în cazul oricărui proiect (prin stabilirea unor puncte în care execuția codului sursă este întreruptă și rularea pas cu pas) sau prin intermediul unor utilitare specifice. Depanarea unei aplicații Android poate fi realizată în mod clasic, ca în cazul oricărui proiect (prin stabilirea unor puncte în care execuția codului sursă este întreruptă și rularea pas cu pas) sau prin intermediul unor utilitare specifice.
  
-În cadrul mediului integrat de dezvoltare Eclipse ​Luna SR1a (4.4.1), depanarea unei aplicații este facilitată prin împărțirea ecranului în mai multe perspective între care programatorul are posibilitatea de a comuta:+<​hidden>​ 
 +În cadrul mediului integrat de dezvoltare Eclipse, depanarea unei aplicații este facilitată prin împărțirea ecranului în mai multe perspective între care programatorul are posibilitatea de a comuta:
   * Java - pentru realizarea de modificări la nivelul codului sursă   * Java - pentru realizarea de modificări la nivelul codului sursă
   * Debug - pentru monitorizarea pas cu pas a execuției programului,​ cu posibilitatea de consultare a valorilor pe care le au la un moment dat diferite obiecte   * Debug - pentru monitorizarea pas cu pas a execuției programului,​ cu posibilitatea de consultare a valorilor pe care le au la un moment dat diferite obiecte
Line 614: Line 720:
  
 {{ :​eim:​laboratoare:​laborator02:​eclipse_perspectives_for_android.png?​nolink }} {{ :​eim:​laboratoare:​laborator02:​eclipse_perspectives_for_android.png?​nolink }}
 +</​hidden>​
 === Android Debug Bridge (ADB) === === Android Debug Bridge (ADB) ===
 +
 Android Debug Bridge este un utilitar în linie de comandă care permite comunicarea cu cu un dispozitiv mobil fizic sau cu un emulator, prin intermediul unui program client-server ce include 3 componente: ​ Android Debug Bridge este un utilitar în linie de comandă care permite comunicarea cu cu un dispozitiv mobil fizic sau cu un emulator, prin intermediul unui program client-server ce include 3 componente: ​
-  * un client, apelat prin comanda ''​adb''​ (alți clienți sunt plugin-ul ADT, DDMS-ul, Hierarchy View);+  * un client, apelat prin comanda ''​adb''​ (alți clienți sunt plugin-ul ADT, ADM-ul, Layout Inspector);
   * un server (rulează ca proces de fundal), care gestionează comunicarea dintre client și daemonul ce rulează pe emulator sau dispozitivul mobil fizic;   * un server (rulează ca proces de fundal), care gestionează comunicarea dintre client și daemonul ce rulează pe emulator sau dispozitivul mobil fizic;
   * un daemon, care rulează ca un proces de fundal pentru fiecare emulator sau dispozitiv mobil fizic.   * un daemon, care rulează ca un proces de fundal pentru fiecare emulator sau dispozitiv mobil fizic.
Line 624: Line 732:
   * pentru a folosi ADB shell, device-ul Android trebuie să fie root-at (imaginile genymotion sunt deja).   * pentru a folosi ADB shell, device-ul Android trebuie să fie root-at (imaginile genymotion sunt deja).
   * comenzile ADB pot fi rulate din linia de comandă sau din script, având următorul format:<​code>​   * comenzile ADB pot fi rulate din linia de comandă sau din script, având următorul format:<​code>​
-student@eim2016:/​opt/​android-sdk-linux/​platform-tools$ adb [-d|-e|-s <​serialNumber>​] <​command>​+student@eim-lab:/​opt/​android-sdk-linux/​platform-tools$ adb [-d|-e|-s <​serialNumber>​] <​command>​
 </​code>​ </​code>​
   * înainte de a utiliza comenzi ''​adb''​ este important să fie cunoscut identificatorul dispozitivului care este conectat la serverul adb, acesta putând fi identificat prin comanda ''​adb devices'':<​code>​   * înainte de a utiliza comenzi ''​adb''​ este important să fie cunoscut identificatorul dispozitivului care este conectat la serverul adb, acesta putând fi identificat prin comanda ''​adb devices'':<​code>​
-student@eim2016:/​opt/​android-sdk-linux/​platform-tools$ adb devices+student@eim-lab:/​opt/​android-sdk-linux/​platform-tools$ adb devices
 List of devices attached ​ List of devices attached ​
 emulator-5556 ​          ​device emulator-5556 ​          ​device
Line 670: Line 778:
  
 Există două mecanisme prin care utilizatorii pot genera astfel de mesaje: Există două mecanisme prin care utilizatorii pot genera astfel de mesaje:
-  * metodele statice ale clasei [[http://​developer.android.com/​reference/​android/​util/​Log.html|Log]],​ care primesc ca parametru prioritatea mesajului, eticheta și mesajul propriu zis<code java>​Log.println ​(Log.DEBUG, "log sample",​ "this is a log message using 'log sample'​ tag"​);</​code>​Pentru a se evita specificarea priorității mesajului de fiecare dată, se pot utiliza metode specifice, care primesc ca parametrii doar denumirea etichetei și mesajul ce se dorește a fi jurnalizat:+  * metodele statice ale clasei [[http://​developer.android.com/​reference/​android/​util/​Log.html|Log]],​ care primesc ca parametru prioritatea mesajului, eticheta și mesajul propriu zis<code java>​Log.[wdiea] ​(Log.DEBUG, "log sample",​ "this is a log message using 'log sample'​ tag"​);</​code>​Pentru a se evita specificarea priorității mesajului de fiecare dată, se pot utiliza metode specifice, care primesc ca parametrii doar denumirea etichetei și mesajul ce se dorește a fi jurnalizat:
  
 <​HTML>​ <​HTML>​
Line 696: Line 804:
   * nivelului minim al tipului de mesaj (''​verbose''​ → ''​assert''​)   * nivelului minim al tipului de mesaj (''​verbose''​ → ''​assert''​)
  
-Un filtru se creează prin apăsarea butonului plus de culoare verde din bara panoului Log (respectiv LogCat în Eclipse).+Un filtru se creează prin apăsarea butonului plus de culoare verde din bara panoului Log (respectiv LogCat în Eclipse). ​In Android Studio, LogCat se poate accesa din partea stânga jos a IDE-ului. 
 + 
 +{{ :​eim:​laboratoare:​logcat_2.png?​900&​nolink }}
  
 {{ :​eim:​laboratoare:​laborator02:​logcat_message_filter_settings.png?​nolink }} {{ :​eim:​laboratoare:​laborator02:​logcat_message_filter_settings.png?​nolink }}
Line 704: Line 814:
 {{ :​eim:​laboratoare:​laborator02:​logcat_configuration.png?​nolink&​700 }} {{ :​eim:​laboratoare:​laborator02:​logcat_configuration.png?​nolink&​700 }}
  
-=== DDMS ===+<​hidden>​ 
 +=== Android Device Monitor - deprecated!!! ​===
  
-Utilitarul pentru depanarea aplicațiilor pentru Android se numește **DDMS (Dalvik Debug Monitor System)**. Acesta folosește **ADB (Android Debug Bridge)**, pentru a se conecta dispozitive fizice sau la emulatoare. Prin intermediul ​DDMS se pot vizualiza parametrii dispozitivului si a aplicațiilor ce ruleaza pe acesta. ​DDMS poate fi accesat sub forma unei perspective ​Eclipse, care va fi deschisă prin //Window// → //Open Perspective//​ → //DDMS//.+Utilitarul pentru depanarea aplicațiilor pentru Android se numește **Android Device Monitor** ​(anterior purta denumirea DDMS - Dalvik Debug Monitor System). Acesta folosește **ADB (Android Debug Bridge)**, pentru a se conecta dispozitive fizice sau la emulatoare. Prin intermediul ​ADM se pot vizualiza parametrii dispozitivului si a aplicațiilor ce ruleaza pe acesta. ​În Android Studio, Android Device Monitor este accesibil din //Tools// → //Android// → //Android Device Monitor//. În Eclipse, ​poate fi accesat sub forma unei perspective,​ care va fi deschisă prin //Window// → //Open Perspective//​ → //​DDMS//​. ​
  
 {{ :​eim:​laboratoare:​laborator02:​ddms.png?​nolink&​300 }} {{ :​eim:​laboratoare:​laborator02:​ddms.png?​nolink&​300 }}
  
-DDMS va afișa lista tuturor dispozitivelor mobile conectate (fizice sau virtuale), pentru fiecare indicându-se toate procesele care rulează (identificabile prin denumirea pachetului),​ numărul de proces și numărul firului de execuție. Alegerea dispozitivului curent se face prin selectarea lui din panoul ''​Devices''​. Operațiile disponibile pentru fiecare proces în parte sunt: depanarea, actualizarea informațiilor cu privire la memoria utilizată, rularea (forțată) procesului de colectare a memoriei disponibile,​ afișarea firelor de execuție asociate, analiza metodelor, oprirea, realizarea unei capturi de ecran, vizualizarea ierarhiei de componente grafice.+Android Device Monitor ​va afișa lista tuturor dispozitivelor mobile conectate (fizice sau virtuale), pentru fiecare indicându-se toate procesele care rulează (identificabile prin denumirea pachetului),​ numărul de proces și numărul firului de execuție. Alegerea dispozitivului curent se face prin selectarea lui din panoul ''​Devices''​. Operațiile disponibile pentru fiecare proces în parte sunt: depanarea, actualizarea informațiilor cu privire la memoria utilizată, rularea (forțată) procesului de colectare a memoriei disponibile,​ afișarea firelor de execuție asociate, analiza metodelor, oprirea, realizarea unei capturi de ecran, vizualizarea ierarhiei de componente grafice.
  
 Cele mai importante funcționalități pe care le oferă DDMS sunt:  Cele mai importante funcționalități pe care le oferă DDMS sunt: 
Line 722: Line 833:
  
 **Procese și Fire de Execuție** **Procese și Fire de Execuție**
- 
 În panoul **//​Threads//​** sunt afișate informațiile despre fiecare fir de execuție corespunzător unui proces. Întrucât aceste informații sunt preluate prin intermediul unei legături de rețea, astfel încât traficul generat este destul de mare, pentru nu a se încetini semnificativ funcționarea dispozitivului mobil (care este nevoit sa transmită aceste date permanent), vizualizarea trebuie activată manual. Astfel, se selectează dispozitivul mobil dorit și procesul respectiv (din panoul //​Devices//​) și se apasă butonul //​Refresh//​. În panoul **//​Threads//​** sunt afișate informațiile despre fiecare fir de execuție corespunzător unui proces. Întrucât aceste informații sunt preluate prin intermediul unei legături de rețea, astfel încât traficul generat este destul de mare, pentru nu a se încetini semnificativ funcționarea dispozitivului mobil (care este nevoit sa transmită aceste date permanent), vizualizarea trebuie activată manual. Astfel, se selectează dispozitivul mobil dorit și procesul respectiv (din panoul //​Devices//​) și se apasă butonul //​Refresh//​.
  
 {{ :​eim:​laboratoare:​laborator02:​ddms_threads.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_threads.png?​nolink&​600 }}
- 
 **Utilizarea Memoriei** **Utilizarea Memoriei**
- 
 DDMS oferă posibilitatea de a monitoriza utilizarea memoriei în cadrul panourilor **//​Heap//​** și **//​Allocation Tracker//​**,​ oferind informații cu privire la gradul de ocupare a memoriei, defalcată pe tipuri de obiecte (obiecte, clase, tablouri conținând elemente stocate pe 1, 2, 4, 8 octeți, date non-Java). ​ DDMS oferă posibilitatea de a monitoriza utilizarea memoriei în cadrul panourilor **//​Heap//​** și **//​Allocation Tracker//​**,​ oferind informații cu privire la gradul de ocupare a memoriei, defalcată pe tipuri de obiecte (obiecte, clase, tablouri conținând elemente stocate pe 1, 2, 4, 8 octeți, date non-Java). ​
  
 {{ :​eim:​laboratoare:​laborator02:​ddms_heap.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_heap.png?​nolink&​600 }}
- 
 **Sistemul de Fișiere** **Sistemul de Fișiere**
- 
 Consultarea sistemului de fișiere al dispozitivului mobil poate fi realizat prin intermediul panoului **//File Explorer//​**,​ putând fi vizualizate datele aplicației,​ stocate în ''​data/​data/<​package-name>'',​ unde ''<​package-name>''​ este denumirea pachetului corespunzător aplicației investigate. Consultarea sistemului de fișiere al dispozitivului mobil poate fi realizat prin intermediul panoului **//File Explorer//​**,​ putând fi vizualizate datele aplicației,​ stocate în ''​data/​data/<​package-name>'',​ unde ''<​package-name>''​ este denumirea pachetului corespunzător aplicației investigate.
- 
 {{ :​eim:​laboratoare:​laborator02:​ddms_file_explorer.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_file_explorer.png?​nolink&​600 }}
 +</​hidden>​
 **Simularea unor evenimente de tip întrerupere pentru emulator** **Simularea unor evenimente de tip întrerupere pentru emulator**
- +<​spoiler>​ 
-Întrucât emulatorul de Android nu poate simula toate funcțiile unui telefon real, pentru a se putea testa comportamentul aplicațiilor în cazul apariției unor evenimente de tip întrerupere,​ DDMS pune la dispoziție un panou **//​Emulator Control//​**,​ prin care pot fi controlate:+Întrucât emulatorul de Android nu poate simula toate funcțiile unui telefon real, pentru a se putea testa comportamentul aplicațiilor în cazul apariției unor evenimente de tip întrerupere,​ DDMS(deprecated) ​pune la dispoziție un panou **//​Emulator Control//​**,​ prin care pot fi controlate:
   * starea conexiunii de voce / date   * starea conexiunii de voce / date
   * primirea unui apel telefonic / SMS (apel, pierdere apel)   * primirea unui apel telefonic / SMS (apel, pierdere apel)
Line 748: Line 853:
 {{ :​eim:​laboratoare:​laborator02:​ddms_emulator_control.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_emulator_control.png?​nolink&​600 }}
  
-<note important>​În cazul testării pe dispozitive mobile reale, aceste funcționalități nu vor fi disponibile prin intermediul ​DDMS.</​note>​+<note important>​În cazul testării pe dispozitive mobile reale, aceste funcționalități nu vor fi disponibile prin intermediul ​ADM.</​note>​
  
 <note warning>​Emulatorul Genymotion nu permite simularea nici unuia dintre evenimentele de mai sus prin intermediul DDMS.</​note>​ <note warning>​Emulatorul Genymotion nu permite simularea nici unuia dintre evenimentele de mai sus prin intermediul DDMS.</​note>​
Line 755: Line 860:
   * cameră foto   * cameră foto
   * accelerometru   * accelerometru
- +</​spoiler>​ 
-=== Hierarchy View === +=== Layout Inspector ​=== 
- +<​spoiler>​ 
-Un alt program foarte util pentru depanare este **Hierarchy View**. Acesta permite vizualizarea arborescentă a structurii ferestrelor. De asemenea, afișează parametrii fiecărui ''​View'',​ inclusiv timpul de încărcare. O altă funcționalitate pusă la dispoziția programatorilor este posibilitatea capturării unei imagini a View-ului. ​+Un alt program foarte util pentru depanare este **Layout Inspector** (anterior, purta denumirea ​Hierarchy View). Acesta permite vizualizarea arborescentă a structurii ferestrelor. De asemenea, afișează parametrii fiecărui ''​View'',​ inclusiv timpul de încărcare. O altă funcționalitate pusă la dispoziția programatorilor este posibilitatea capturării unei imagini a View-ului. ​
  
 Întrucât prin acest utilitar se poate analiza orice aplicație (componentă) care rulează pe un dispozitiv mobil, el poate fi utilizat și ca sursă de inspirație asupra modului în care este construită interfața grafică. ​ Întrucât prin acest utilitar se poate analiza orice aplicație (componentă) care rulează pe un dispozitiv mobil, el poate fi utilizat și ca sursă de inspirație asupra modului în care este construită interfața grafică. ​
  
-Hierarchy View poate fi accesat sub forma unei perspective ​Eclipse, care va fi deschisă prin //Window// → //Open Perspective//​ → //Hierarchy View//.+Layout Inspector este accesibil în Android Studio în //Tools// → //Android// → //Android Device Monitor//​. ​Hierarchy View poate fi accesat ​în Eclipse ​sub forma unei perspective,​ care va fi deschisă prin //Window// → //Open Perspective//​ → //Hierarchy View//.
  
 {{ :​eim:​laboratoare:​laborator02:​hierarchy_view_tree_view.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​hierarchy_view_tree_view.png?​nolink&​600 }}
  
-Hierarchy View funcționează atât pentru emulatoare cât și cu dispozitive fizice. ​+Utilitarul ​funcționează atât pentru emulatoare cât și cu dispozitive fizice. ​
  
 La pornire, în panoul //Windows// (stânga) este afișată lista tuturor dispozitivelor mobile conectate. Se alege un dispozitiv mobil și o componentă ce rulează pe acel dispozitiv (prin expandarea dispozitivului mobil) și se apasă butonul //Load the view hierarchy into the tree view//. Afișarea ierarhiei de View-uri se face în panoul //Tree View// (centru) sub forma unui arbore. Panoul //Tree Overview// (dreapta) va prezenta o imagine de ansamblu a ierarhiei, evidențiindu-se selecția vizibilă la momentul respectiv în fereastra principală. La pornire, în panoul //Windows// (stânga) este afișată lista tuturor dispozitivelor mobile conectate. Se alege un dispozitiv mobil și o componentă ce rulează pe acel dispozitiv (prin expandarea dispozitivului mobil) și se apasă butonul //Load the view hierarchy into the tree view//. Afișarea ierarhiei de View-uri se face în panoul //Tree View// (centru) sub forma unui arbore. Panoul //Tree Overview// (dreapta) va prezenta o imagine de ansamblu a ierarhiei, evidențiindu-se selecția vizibilă la momentul respectiv în fereastra principală.
Line 781: Line 886:
  
 {{ :​eim:​laboratoare:​laborator02:​hierarchy_view_layout_view.png?​nolink }} {{ :​eim:​laboratoare:​laborator02:​hierarchy_view_layout_view.png?​nolink }}
 +</​spoiler>​
  
 ===== Activitate de Laborator ===== ===== Activitate de Laborator =====
Line 786: Line 892:
 **1.** În contul Github personal, să se creeze un depozit denumit '​Laborator02'​. 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''​). **1.** În contul Github personal, să se creeze un depozit denumit '​Laborator02'​. 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''​).
  
-**2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​eim2016/​Laborator02|]]. În urma acestei operații, directorul Laborator02 va trebui să se conțină un director ''​labtasks''​ ce va deține ​atât proiectul Android Studio ​cât și proiectul Eclipse, ambele denumite ​''​ActivityLifecycleMonitor'',​ fișierul ''​README.md''​ și un fișier ''​.gitignore''​ care indică tipurile de fișiere (extensiile) ignorate. <​code>​ +**2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​eim-lab/​Laborator02|]]. În urma acestei operații, directorul Laborator02 va trebui să se conțină un director ''​labtasks''​ ce va deține proiectul Android Studio ​denumit ​''​ActivityLifecycleMonitor'',​ fișierul ''​README.md''​ și un fișier ''​.gitignore''​ care indică tipurile de fișiere (extensiile) ignorate. <​code>​ 
-student@eim2016:~$ git clone https://​www.github.com/​eim2016/​Laborator02.git+student@eim-lab:~$ git clone https://​www.github.com/​eim-lab/​Laborator02.git
 </​code>​ </​code>​
  
 **3.** Să se încarce conținutul descărcat în cadrul depozitului '​Laborator02'​ de pe contul Github personal. ​ <​code>​ **3.** Să se încarce conținutul descărcat în cadrul depozitului '​Laborator02'​ de pe contul Github personal. ​ <​code>​
-student@eim2016:~$ cd Laborator02 +student@eim-lab:~$ cd Laborator02 
-student@eim2016:​~/​Laborator02$ git remote add Laborator02_perfectstudent https://​github.com/​perfectstudent/​Laborator02 +student@eim-lab:​~/​Laborator02$ git remote add Laborator02_perfectstudent https://​github.com/​perfectstudent/​Laborator02 
-student@eim2016:​~/​Laborator02$ git push Laborator02_perfectstudent master+student@eim-lab:​~/​Laborator02$ git push Laborator02_perfectstudent master
 </​code>​ </​code>​
  
-**4.** Să se încarce în mediul integrat de dezvoltare ​Eclipse ​proiectul ''​ActivityLifecycleMonitor'',​ folosind opțiunea //File// → //Import...//.+**4.** Să se încarce în mediul integrat de dezvoltare ​Android Studio ​proiectul ''​ActivityLifecycleMonitor'',​ folosind opțiunea //Open an Existing Android Studio Project//.
  
-{{ :​eim:​laboratoare:​laborator02:​eclipse_import_project01.png?​nolink&​500 }}+{{ :​eim:​laboratoare:​laborator02:​android_studio_open_project01.png?​nolink&​600 }}
  
-{{ :​eim:​laboratoare:​laborator02:​eclipse_import_project02.png?​nolink&​500 }}+{{ :​eim:​laboratoare:​laborator02:​android_studio_open_project02.png?​nolink&​300 }}
  
 **5.** În clasa ''​LifecycleMonitorActivity''​ din pachetul ''​ro.pub.cs.systems.eim.lab02.activitylifecyclemonitor.graphicuserinterface'',​ să se suprascrie metodele care monitorizează ciclul de viață al unei activități;​ fiecare dintre acestea va trebui **să apeleze metoda părinte** și **să notifice apelarea sa prin intermediul unui mesaj**, având prioritatea ''​DEBUG''​ și eticheta ''​activitylifecyclemonitor'':<​code java> **5.** În clasa ''​LifecycleMonitorActivity''​ din pachetul ''​ro.pub.cs.systems.eim.lab02.activitylifecyclemonitor.graphicuserinterface'',​ să se suprascrie metodele care monitorizează ciclul de viață al unei activități;​ fiecare dintre acestea va trebui **să apeleze metoda părinte** și **să notifice apelarea sa prin intermediul unui mesaj**, având prioritatea ''​DEBUG''​ și eticheta ''​activitylifecyclemonitor'':<​code java>
Line 812: Line 918:
     - ''​onDestroy()''​     - ''​onDestroy()''​
  
-**6.** Să se creeze un filtru, denumit ''​ActivityLifecycleMonitor'',​ astfel încât LogCat să afișeze doar mesajele care au eticheta ''​activitylifecyclemonitor'',​ generate de aplicația ''​ro.pub.cs.systems.eim.lab02.activitylifecyclemonitor''​ și au cel puțin prioritatea ''​debug''​.+**6.** Să se creeze un filtru, denumit ''​ActivityLifecycleMonitor'',​ astfel încât LogCat să afișeze doar mesajele care au eticheta ''​activitylifecycle'',​ generate de aplicația ''​ro.pub.systems.eim.lab02.activitylifecyclemonitor''​ și au cel puțin prioritatea ''​debug''​.
  
 **7.** Să se modifice mesajul din metoda ''​onCreate()'',​ astfel încât să se indice dacă activitatea a mai fost lansată în execuție anterior sau nu (dacă există o stare a activității care trebuie restaurată). **7.** Să se modifice mesajul din metoda ''​onCreate()'',​ astfel încât să se indice dacă activitatea a mai fost lansată în execuție anterior sau nu (dacă există o stare a activității care trebuie restaurată).
Line 820: Line 926:
     - se apasă butonul //Back//     - se apasă butonul //Back//
     - se apasă butonul //OK// din cadrul aplicației (indiferent dacă datele de autentificare sunt corecte sau nu)     - se apasă butonul //OK// din cadrul aplicației (indiferent dacă datele de autentificare sunt corecte sau nu)
-    - se ține apăsat butonul //Home// o perioadă de timp mai mare +    - se apasă butonul //lista app//  
-    - se primește un apel telefonic\\ a) pentru AVD, se poate folosi //DDMS// → //Emulator Control//\\ b) pentru Genymotion se poate simula doar formarea unui număr de telefon <​code>​ +    - se primește un apel telefonic\\ a) pentru AVD, se poate folosi //ADM// → //Emulator Control//\\ b) pentru Genymotion se poate simula doar formarea unui număr de telefon <​code>​ 
-student@eim2016:/​opt/​android-sdk-linux/​platform-tools$ adb devices+student@eim-lab:/​opt/​android-sdk-linux/​platform-tools$ adb devices
 List of devices attached ​ List of devices attached ​
 192.168.56.101:​5555 device 192.168.56.101:​5555 device
-student@eim2016:/​opt/​android-sdk-linux/​platform-tools$ adb -s 192.168.56.101:​5555 shell+student@eim-lab:/​opt/​android-sdk-linux/​platform-tools$ adb -s 192.168.56.101:​5555 shell
 root@android:/​ # am start -a android.intent.action.CALL tel:​1122334455 root@android:/​ # am start -a android.intent.action.CALL tel:​1122334455
 Starting: Intent { act=android.intent.action.CALL dat=tel:​xxxxxxxxxx } Starting: Intent { act=android.intent.action.CALL dat=tel:​xxxxxxxxxx }
Line 839: Line 945:
 | 2) buton //Back// |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | 2) buton //Back// |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | 3) buton //OK// din aplicație |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | 3) buton //OK// din aplicație |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
-| 4) buton //Home// perioadă de timp mai mare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |+| 4) buton //lista app//  |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | 5) apel telefonic |   ​||||||| | 5) apel telefonic |   ​|||||||
 | a) acceptare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | a) acceptare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | 6) rotire ecran |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | 6) rotire ecran |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +
 +<​hidden>​
 +2019, genymotion, Nexus 5X API 24, butoane "​hardware"​
 +
 +^  ^  ''​onCreate()'' ​ ^  ''​onRestart()'' ​ ^  ''​onStart()'' ​ ^  ''​onResume()'' ​ ^  ''​onPause()'' ​ ^  ''​onStop()'' ​ ^  ''​onDestroy()'' ​ ^ ''​onSaveInst()'' ​ ^ ''​onRestoreInst()'' ​ ^
 +| 1) buton //Home// |   ​| ​  ​| ​   |    |  1  |  3  |   ​| ​ 2  |   |
 +| 2) buton //Back// |   ​| ​  ​| ​   |    |  1  |  2  |  3  |     ​| ​  |
 +| 3) buton //OK// din aplicație |  nici | una   | dintre ​  | metode ​ | nu   | se  | apelează ​ |
 +| 4) buton //lista app//  |   ​| ​  ​| ​  ​| ​  ​| ​ 1  |  3  |   ​| ​ 2  | |  ​
 +| 5) apel telefonic |   | | | |  1  |  3  | |  2  | |  ​
 +| a) acceptare |   ​| ​ 1  |  2  |   ​| ​   |    |   ​| ​ |  | 
 +| b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +| 6) rotire ecran |  5  |   ​| ​ 6  |   ​| ​ 1  |  3  |  4  |  2  |  7  |
 +
 +Galaxy S7, butoane hw 
 +^  ^  ''​onCreate()'' ​ ^  ''​onRestart()'' ​ ^  ''​onStart()'' ​ ^  ''​onResume()'' ​ ^  ''​onPause()'' ​ ^  ''​onStop()'' ​ ^  ''​onDestroy()'' ​ ^ ''​onSaveInst()'' ​ ^ ''​onRestoreInst()'' ​ ^
 +| 1) buton //Home// |   ​| ​  ​| ​   |    |  1  |  3  |   ​| ​ 2  |   |
 +| 2) buton //Back// |   ​| ​  ​| ​   |    |  1  |  2  |  3  |     ​| ​  |
 +| 3) buton //OK// din aplicație |  nici | una   | dintre ​  | metode ​ | nu   | se  | apelează ​ |
 +| 4) buton //lista app//  |   ​| ​  ​| ​  ​| ​  ​| ​ 1  |  3  |   ​| ​ 2  | |  ​
 +| 5) apel telefonic |   ​|||||||
 +| a) acceptare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +| b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +| 6) rotire ecran |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +
 +
 +
 +</​hidden>​
 +
  
 **9.** Să se dezactiveze opțiunea de salvare a stării. ​ **9.** Să se dezactiveze opțiunea de salvare a stării. ​
Line 849: Line 984:
 <note tip>În fișierul ''​activity_lifecycle_monitor.xml'',​ pentru fiecare dintre elementele grafice pentru care se dorește să se dezactiveze opțiunea de salvare a stării, se va completa proprietatea ''​android:​saveEnabled="​false"''​.</​note>​ <note tip>În fișierul ''​activity_lifecycle_monitor.xml'',​ pentru fiecare dintre elementele grafice pentru care se dorește să se dezactiveze opțiunea de salvare a stării, se va completa proprietatea ''​android:​saveEnabled="​false"''​.</​note>​
  
-Să se observe care este comportamentul în privința informațiilor reținute în elementele grafice de tip ''​EditText'',​ respectiv ''​CheckBox'',​ în condițiile în care activitatea este distrusă (se apasă butonul //Home//, astfel încât să se apeleze metodele ''​onPause()''​ și ''​onStop()'',​ apoi, în DDMS, în panoul //​Devices//, ​se identifică procesul corespunzător ​aplicației și se oprește folosind butonul //Stop Process//). Să se repornească aplicația din meniul dispozitivului mobil. ​+Să se observe care este comportamentul în privința informațiilor reținute în elementele grafice de tip ''​EditText'',​ respectiv ''​CheckBox'',​ în condițiile în care activitatea este distrusă (se apasă butonul //Home//, astfel încât să se apeleze metodele ''​onPause()''​ și ''​onStop()'',​ apoi se închide ​aplicația. Să se repornească aplicația din meniul dispozitivului mobil. ​
  
 **10.** Să se implementeze metoda ''​onSaveInstanceState()'',​ astfel încât, **în condițiile în care este bifat elementul grafic de tip ''​CheckBox''​**,​ să se salveze informațiile din interfața cu utilizatorul. **10.** Să se implementeze metoda ''​onSaveInstanceState()'',​ astfel încât, **în condițiile în care este bifat elementul grafic de tip ''​CheckBox''​**,​ să se salveze informațiile din interfața cu utilizatorul.
Line 859: Line 994:
 **11.** Să se implementeze metoda ''​onRestoreInstanceState()''​ astfel încât să se restaureze starea elementelor grafice. Să se observe comportamentul aplicației în condițiile producerii evenimentului descris anterior. **11.** Să se implementeze metoda ''​onRestoreInstanceState()''​ astfel încât să se restaureze starea elementelor grafice. Să se observe comportamentul aplicației în condițiile producerii evenimentului descris anterior.
  
-Să se transfere comportamentul de restaurare a stării pe metoda ''​onCreate()''​ și să se identifice diferențele de implementare ([[http://​developer.android.com/​training/basics/​activity-lifecycle/recreating.html|Hint]]).+Să se transfere comportamentul de restaurare a stării pe metoda ''​onCreate()''​ și să se identifice diferențele de implementare ([[https://​developer.android.com/​guide/components/​activities/​activity-lifecycle.html#saras|Hint]]).
  
 **12.** ​ Să se încarce modificările realizate în cadrul depozitului '​Laborator02'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​ **12.** ​ Să se încarce modificările realizate în cadrul depozitului '​Laborator02'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​
-student@eim2016:​~/​Laborator02$ git add labtasks/​* +student@eim-lab:​~/​Laborator02$ git add labtasks/​* 
-student@eim2016:​~/​Laborator02$ git commit -m "​implemented ​taks for laboratory 02" +student@eim-lab:​~/​Laborator02$ git commit -m "​implemented ​tasks for laboratory 02" 
-student@eim2016:​~/​Laborator02$ git push Laborator02_perfectstudent master+student@eim-lab:​~/​Laborator02$ git push Laborator02_perfectstudent master
 </​code>​ </​code>​
  
eim/laboratoare/laborator02.1457077517.txt.gz · Last modified: 2016/03/04 09:45 (external edit)
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