Travail confortable avec Android Studio


Bonne journée à tous!


Quelle est la productivité d'Android Studio? Pensez-vous que cela fonctionne intelligemment sur votre PC ou Mac? Ou, parfois, vous rencontrez des retards ou un long assemblage? Et sur de grands projets?


Dans tous les cas, nous voulons tous obtenir des performances maximales du matériel et des logiciels. Par conséquent, j'ai préparé une liste de points et de conseils pour les débutants et les développeurs expérimentés qui vous aideront à travailler confortablement avec de grands projets ou tout simplement augmenter la productivité. Vous comprendrez également si votre équipement a besoin d'une mise à niveau.


Les utilisateurs d'autres IDE populaires peuvent également trouver quelque chose d'utile pour eux-mêmes.


La motivation


Android Studio était lent au moment de la transition d'Eclipse. Et déjà, j'ai commencé à chercher des moyens d'optimiser le travail de cet IDE. Cependant, la plupart des collègues se réfèrent à ce "aucun moyen". Ça marche. Pas toujours rapide. Et bien.


Mais depuis un an maintenant, je travaille dans une autre entreprise. Le climat est différent, les développeurs lisent des rapports sur diverses technologies. Lors de l'un de ces rapports, il m'a semblé que le sujet de cet article pouvait être demandé. Surtout dans le cadre de projets de complexité technique accrue.


Après avoir parlé avec des collègues et des connaissances de développeurs, il est devenu clair pour moi que même chaque «pro» ne comprend pas les nuances de fer, OS et IDE. Parce qu'ici, j'ai essayé de rassembler un programme éducatif complet basé sur ma propre expérience.


AVERTISSEMENT! Tous les modèles et marques mentionnés dans l'article ne sont pas de la publicité!


Le fer


Voici ce qui est dit sur le matériel sur le site officiel d'Android Studio dans la colonne Configuration requise (sans compter l'espace disque):


3 GB RAM minimum, 8 GB RAM recommended; plus 1 GB for the Android Emulator 1280x800 minimum screen resolution 

Cela suffit pour que le studio démarre et travaille. Nous ne parlons pas de performance et de confort.


Dans ce chapitre, je parlerai du type de matériel souhaitable pour un travail confortable avec de grands projets et de ce qui peut devenir un «goulot d'étranglement» dans votre système.


Ici, 5 paramètres sont les plus critiques pour nous:


  • Performances CPU
  • Nombre de threads matériels CPU
  • Quantité de RAM
  • Vitesse de lecture et d'écriture aléatoire du sous-système de disque
  • La vitesse de lecture de petits blocs et d'écriture de petits blocs d'un sous-système de disque

Comme j'ai souvent travaillé sur des configurations basées sur des produits Intel, nous en parlerons. Cependant, si vous avez AMD, lisez-le et corrigez les technologies rouges similaires. Le seul inconvénient que j'ai rencontré sur AMD a déjà été décrit sur Habré .


Quelques mots sur Mac


On pense que le Mac est la meilleure machine à développer. Cela est souvent dit à propos du MacBook Pro.


Personnellement, je considère cela comme un mythe. Avec l'avènement de la technologie, NVMe Mac a perdu sa «magie». Aujourd'hui, même parmi les ordinateurs portables, le Mac n'est pas un leader en termes de rapport qualité-prix-performances. Surtout dans le cadre du développement pour Android Studio.


Sinon, pour un développement confortable, le MacBook Pro 2015 ou 2016 n'a pas de processeur U. Découvrez les autres fonctionnalités et services ci-dessous.


CPU


Les performances du processeur sont évidentes et compréhensibles. Plus il est haut, mieux c'est. La seule chose à noter est que si vous avez un lecteur assez rapide, un processeur faible deviendra un goulot d'étranglement dans votre système. Particulièrement critique dans le cas du lecteur NVMe. Souvent, lorsque vous travaillez avec, l'accent est précisément mis sur la puissance du processeur.


Avec les fils, les choses sont un peu plus compliquées. J'ai lu que les utilisateurs réduisent la priorité du studio et de ses sous-processus pour que l'OS ne "se bloque" pas lors du montage. La raison ici est un à 1-2 threads matériels. Ce n'est pas suffisant non seulement pour l'IDE, mais aussi pour un système d'exploitation moderne. Le seul «mais» - dans ma pratique, il y avait des situations où les processeurs U à double cœur avec Hyper Threading (c'est-à-dire 2 cœurs pour 4 threads) fonctionnaient normalement avec des projets relativement petits, mais les problèmes ci-dessus ont commencé sur les grands.


Bien sûr, la virtualisation matérielle est requise.


Par conséquent, je recommande de regarder vers le Core i5 HQ Skylake avec plus de 4 flux et plus puissant.


RAM


Concernant les normes, DDR3 et supérieures. Ici, je pense, c'est clair.


S'il est possible de travailler en mode 2 ou 4 canaux et que vous n'êtes pas actif, je vous recommande fortement de l'utiliser, car vous pouvez obtenir une augmentation significative de la réactivité de l'IDE. Cette fonctionnalité est activée soit dans les paramètres BIOS \ UEFI, soit en installant des modules RAM supplémentaires (si vous avez encore un module).


Quel volume est nécessaire? Pour les petits (très petits) projets, 4 Go suffisent. Sur des projets plus importants, le studio est capable d'occuper rapidement 4 Go de mémoire et plus encore. Ajoutez l'émulateur HAXM (disons 2 Go) ici et tenez compte du fait que le système d'exploitation moderne (à l'exception de certaines distributions Linux) occupe environ 2 Go en mémoire - et maintenant il s'avère que 8 Go sont déjà "dos à dos".


Cela ne prend pas en compte, par exemple, Slack (qui prend en moyenne environ 500 Mo de mémoire) et Chrome (où la facture passe en gigaoctets).


En général, avec 8 Go de RAM, vous pouvez travailler rapidement et confortablement - il enregistre un disque rapide et un fichier swap \ swap. Mais cela vaut la peine de penser à une mise à niveau.


Par conséquent, la société en achète de nouvelles ou fournit une mise à niveau des machines actuelles pour 12 Go de RAM ou plus.


SSD


Le sous-système de disques est le «goulot d'étranglement» le plus fréquent, il est donc nécessaire d'y prêter attention en premier lieu.


Travailler avec Android Studio sur le disque dur en 2018 est comparable au tourment - plus le projet est grand, plus vous avez de frises. Par conséquent, évidemment, utilisez uniquement SSD.


Comme mentionné ci-dessus, il existe deux paramètres critiques:


  • Vitesse de lecture et d'écriture aléatoire du sous-système de disque
  • La vitesse de lecture de petits blocs et d'écriture de petits blocs d'un sous-système de disque

Plus ils sont élevés, plus le studio sera réactif et plus il se chargera et s'assemblera rapidement.


J'attire votre attention sur le fait qu'il n'est pas question de vitesses de lecture / écriture linéaires - ce n'est pas critique pour un studio. Par conséquent, lorsque vous choisissez un lecteur, vous devez regarder non pas sa vitesse de lecture / écriture sur le site Web du fabricant ou du magasin, mais le nombre d' IOPS (plus il y en a, mieux c'est).


Bien sûr, ici, nous ne parlons pas du Mac, car le lecteur a son propre standard ou est simplement soudé sur la carte. Le remplacement est possible, sauf pour un volume plus important. Il est peu probable qu'il soit possible d'augmenter les caractéristiques de vitesse ici.


NVMe


Si votre carte mère prend en charge la technologie NVMe , il est préférable d'utiliser un lecteur avec son support. Il vous permet d'obtenir des vitesses comparables aux SSD sur Mac et supérieures.


Si vous avez un lecteur rapide, l'accent est mis sur le bus PCIe et la puissance de votre CPU. Par conséquent, si, par exemple, votre carte mère prend en charge la sortie vers un lecteur PCIe 2.0x4 \ 3.0x2 ou si vous ne disposez pas d'un processeur très puissant, vous ne devriez pas acheter un lecteur très cher. Regardez les capacités de votre système et l'épaisseur de votre portefeuille.


SATA3


Oui, SATA3 est plus vivant que tous les vivants. Et vous pouvez y travailler rapidement en studio.


Dans ce segment, les disques haute vitesse sont plus abordables, il est donc logique de regarder immédiatement les meilleures solutions avec une capacité de 120 Go ou plus.


Intel Optane


Je n'ai pas eu à utiliser Android Studio sur une machine avec ce lecteur (si vous pouvez l'appeler ainsi). Si quelqu'un a de l'expérience, écrivez dans les commentaires.


GPU


Il n'est pas nécessaire de parler beaucoup.
Si vous écrivez des applications utilisateur ordinaires, quelque chose comme la série Intel HD 500 suffit pour le studio et l'émulateur lui-même.


Si vous développez des jeux ou s'il s'agit de votre machine personnelle, les graphiques discrets ont du sens. Lequel - regardez selon vos besoins.


Système de refroidissement et étranglement


Il ne s'agit pas de mise à niveau, mais de maintenance.


La plupart d'entre nous connaissent le phénomène d' étranglement . Sa mise en œuvre est utilisée pour protéger contre la surchauffe.


Bien entendu, la limitation entraîne une baisse de la productivité. Pas toujours visible. Dans certains cas, le fonctionnement de Turbo Boost est réduit aux valeurs minimales, dans d'autres, une baisse des fréquences maximales du processeur commence. La raison en est un fonctionnement insuffisant du système de refroidissement. Il est également important de comprendre que la plupart des tests de résistance (comme AIDA) diagnostiquent le fonctionnement régulier du Turbo Boost comme un étranglement.


Dans le cas des PC de bureau, tout est en ligne depuis longtemps. Dans le cas des systèmes mobiles basés sur des caloducs, beaucoup d'informations contradictoires. Cela inclut la plupart des ordinateurs portables, nettops, MacBooks et iMacs. De plus, nous nous concentrerons sur eux.


Sur les processeurs mobiles modernes et puissants, 80 à 90 degrés sur une puce sous charge est la norme. Dans le même temps, les SOC avec ces processeurs ont une conception à puce ouverte, ce qui réduit la zone de transfert de chaleur. Tout ce tas de chaleur est enlevé ce ridicule conception similaire avec un petit circuit de liquide fermé.


Système de refroidissement mobile moderne


Il faut comprendre que ces systèmes de refroidissement subissent des charges plus importantes et nécessitent un entretien plus fréquent. Surtout dans le cas des ordinateurs portables et des MacBook, lorsqu'elle est transportée par les vibrations, la couche de pâte thermique séchée s'effondre plus rapidement. Et une maintenance intempestive se heurte non seulement à une perte de productivité, mais aussi à des fuites de thermotubes et à des «décharges» de cristaux.


L'entretien consiste à remplacer la pâte thermique et à nettoyer le radiateur une fois tous les six mois à un an après la fin de la période de garantie. En tout cas, c'est ce que nous faisons.


En raison de la petite surface du cristal, il est logique d'utiliser une pâte thermique diélectrique avec une conductivité thermique élevée (cela coûte environ 800-1000 r par gramme). N'utilisez jamais de métal liquide! Sinon, vous ne pourrez probablement pas séparer le cristal de la plaque!


Si vous n'avez pas suffisamment de compétences pour cette procédure, il est préférable de contacter le service.


Paramètres matériels


Ce chapitre se concentrera sur les fonctions et les réglages de l'équipement. Très probablement, vous le connaissez déjà.


Intel Hyper Threading


Il s'agit de la technologie Intel, qui divise le flux matériel du noyau en deux flux "virtuels". Grâce à elle, le système considère le processeur à 4 cœurs comme un processeur à 8 cœurs. Cette approche vous permet d'utiliser efficacement la puissance du processeur. AMD a une technologie similaire.


Souvent, je rencontre le fait que de nombreux développeurs ont désactivé cette fonctionnalité et ils ne le savent généralement pas. Cependant, son inclusion peut augmenter la réactivité du studio et améliorer les performances. Dans certains cas, de 10 à 15%.


Il s'active dans les paramètres BIOS \ UEFI de votre carte mère ou de votre ordinateur portable. Un élément est appelé d'une manière similaire ou similaire. Si vous ne connaissiez toujours pas cette technologie, il est judicieux de vérifier sa disponibilité et de l'activer si cela n'a pas été fait.


Intel Turbo Boost


Une autre technologie bien connue. En fait, il s'agit d'un overclocking automatique à court terme du CPU et donne une augmentation significative lors de l'assemblage. Et, en même temps, il a la capacité de chauffer des processeurs mobiles à des températures non loin de Tjunction .


Par conséquent, si cette technologie était précédemment désactivée, avant de l'allumer, il est conseillé de vérifier l'état du système de refroidissement et, éventuellement, d'effectuer sa maintenance, comme décrit dans le chapitre précédent.


Il peut être activé à la fois sur BIOS \ UEFI et dans les paramètres du système d'exploitation.


Intel Rapid Storage


La prise en charge de cette carte mère technologique est fortement recommandée. Plus de détails peuvent être trouvés ici .


Je ne peux que recommander la mise à jour des pilotes de cette technologie en temps opportun vers la dernière version du site officiel d'Intel. Même si le fabricant de votre ordinateur portable vous fournit des pilotes plus anciens.


Dans mon cas particulier, la mise à jour de la version du pilote du fabricant vers la version actuelle a augmenté la vitesse d'enregistrement linéaire d'environ 30% et la vitesse arbitraire de 15%.


Comment installer et mettre à jour les pilotes IRST sous Linux - je ne sais pas (et en général, est-ce possible?). Si quelqu'un le sait, écrivez dans les commentaires, je compléterai volontiers l'article.


Effacement sécurisé SSD


Les performances des modèles SSD à faible coût peuvent diminuer avec le temps. Cela ne se produit pas toujours en raison de la "dégradation" du lecteur. Peut-être que dans votre modèle TRIM n'est pas mis en œuvre de manière très efficace.


L'effacement sécurisé forcera le contrôleur à marquer toutes les cellules de mémoire comme vides, ce qui, théoriquement, devrait restaurer les performances du SSD à l'état d'usine. Et, aussi, effacez toutes vos données! Soyez prudent, faites des sauvegardes!


Vous pouvez effectuer la procédure à l'aide d'un utilitaire propriétaire du fabricant. Si votre disque est un système, vous aurez besoin d'un lecteur flash, que l'utilitaire rendra amorçable. Suivez les instructions ci-dessous.


À un moment donné, vous devrez peut-être reconnecter le lecteur directement pendant le fonctionnement. Par conséquent, dans le cas de M.2, la présence d'un adaptateur est très souhaitable.


L'utilisation d'utilitaires tiers pour cette opération est fortement déconseillée.


Cependant, si votre SSD a considérablement perdu de la vitesse en moins d'un an, il est préférable de changer le lecteur pour un autre modèle.


Virtualisation matérielle


Cette technologie est nécessaire au fonctionnement rapide de l'émulateur x86. Si vous l'avez désactivé, activez-le dans les paramètres BIOS \ UEFI. Différents fournisseurs peuvent avoir des noms de paramètres différents.


Oui, nous connaissons tous Genymotion et BlueStacks, qui fonctionnent bien sans virtualisation matérielle. Cependant, dans les images de ces émulateurs, certaines ou plusieurs implémentations de l'API Android sont considérablement modifiées afin d'augmenter la vitesse de travail. Cela peut provoquer un comportement que vous ne rencontrerez jamais sur un appareil réel. Ou lors du débogage, vous pouvez manquer quelques bogues. Par conséquent, la présence d'un AVD fonctionnel et agile est hautement souhaitable.


OS et logiciels tiers


Dans ce chapitre, nous discuterons de la configuration possible du système d'exploitation et de l'installation de logiciels tiers afin d'augmenter la productivité.


Indexation


Il s'agit de trouver Windows et Spotlight sur Mac OS. Ces mécanismes peuvent prendre jusqu'à 15% de la puissance du processeur pendant l'assemblage car ils essaient d'indexer tout ce qui est généré dans / build.


Bien sûr, de l'indexation il faut exclure tous les répertoires avec lesquels le studio travaille:


  • Répertoire SDK
  • Répertoire Studio
  • Répertoire de projets (fortement recommandé)
  • ~ / .gradle
  • ~ / .android
  • ~ / Android StudioX.X
  • ~ / lldb
  • Répertoire de cache Kotlin

Antivirus


Je sais que tout le monde dans l'environnement de développement n'a pas décidé d'utiliser un antivirus. Mais beaucoup l'utilisent. Y compris, parfois, sur Linux et Mac OS. Et son utilisation est parfaitement justifiée.


Même si vous avez Windows 10 et aucun antivirus, Windows Defender remplit ses fonctions.


Lors de l'assemblage d'un antivirus peut prendre une partie très importante du CPU. Par conséquent, tous les répertoires répertoriés dans la colonne "Indexation" doivent être ajoutés aux exceptions antivirus. Il est également judicieux d'ajouter les noms de processus du studio et de la JVM JetBrains aux exceptions.


En fonction de l'implémentation de l'antivirus, la consommation du processeur pendant la génération diminuera considérablement, ou cessera de consommer du tout la puissance du processeur. Et le temps de montage lui-même diminuera sensiblement.


Chiffrement du lecteur ou du répertoire personnel


Ces fonctions sont présentes sur tous les systèmes d'exploitation courants ou sont implémentées par des logiciels tiers. Bien sûr, le travail en studio dans un espace fichier crypté peut nécessiter plus de puissance CPU. Combien dépend de la mise en œuvre du cryptage. Par conséquent, il est recommandé de désactiver complètement ces fonctions ou, si possible, pour les répertoires répertoriés dans la colonne "Indexation".


TRIM fonctionne-t-il?


TRIM peut être implémenté à la fois matériel et logiciel. Dans ce dernier cas, l'obligation d'appeler TRIM incombe au système d'exploitation. Et, pour diverses raisons, un appel périodique peut être déconnecté, ce qui entraîne une baisse de la vitesse du lecteur.


Vous pouvez tester l'intégrité et reprendre les appels TRIM à l'aide d'utilitaires spécialisés. Il est recommandé d'utiliser les utilitaires du fabricant du lecteur.


RAMDisk


Qu'est-ce que RAMDisk, la plupart le savent depuis longtemps. Mais quelle est son efficacité à travailler avec le studio?


D'après ma propre expérience, je ne dirai pas grand-chose. Sauf si vous transférez le projet lui-même, le SDK, le studio, etc. sur RAMDisk. Si vous avez suffisamment de RAM ...


Avec un simple transfert du projet pesant plus de 500 Mo (le chiffre est indiqué avec le cache de build), je n'ai pas pu atteindre une augmentation de plus de 15%. Apparemment, les appels au SDK et aux API système sont ralentis. En conséquence, une telle augmentation est assez coûteuse.


La méthode suivante est beaucoup plus efficace et beaucoup moins chère.


Caching Drive Requests


Quelque chose de similaire est implémenté dans Mac OS. Cependant, en comparaison avec les technologies énumérées ci-dessous, il n'est pas si efficace.


Malheureusement, je ne connais que deux implémentations, et les deux sont étroitement liées aux produits des fabricants. Il s'agit de Samsung RAPID et PlexTurbo .


Les deux technologies fonctionnent sur des principes similaires (je décris ce que j'ai compris moi-même):


  • S'il y avait une demande de lecture de petits volumes, ils sont reportés dans la RAM et, lorsqu'ils sont relus, ils sont déjà extraits de là. Cache RAM standard.
  • S'il y avait une demande d'écriture de petites données, elles sont reportées dans le cache RAM. Ensuite, les demandes d'écriture sont comparées au cache. Si vous réécrivez les mêmes données sur les mêmes chemins - pourquoi les réenregistrer dans le matériel? Et le SSD vivra plus longtemps.

La seule différence est que le RAPID utilise la RAM libre restante comme cache. Moins d'équilibre - moins de taille de cache, moins d'accélération. PlexTurbo vous permet de limiter la taille maximale du cache et de la charger depuis le disque dur au démarrage du système.


S'il est utilisé sur SATA 3, vous pouvez obtenir une augmentation allant jusqu'à 50%. Lorsque vous utilisez un lecteur NVMe, il est plus petit, mais souvent également important.


Pour le moment, j'ai un Samsung 860 EVO SATA 3. En dessous du spoiler se trouvent des références avec i7 6700HQ et Turbo Boost désactivés.


860 EVO avant d'allumer le RAPID et deux essais après

RAPIDE éteint



Première course



Deuxième manche



Vous pouvez clairement voir comment le système commence à mettre en cache les données lors de la première exécution. Le résultat final est nettement supérieur à SATA 3. Cependant, l'efficacité de cette technologie dépend davantage des capacités du processeur. Ce qui est clairement visible lorsque vous activez Turbo Boost.


860 EVO + RAPID + Turbo Boost


Les synthétiques sont bien sûr bons. Mais tout fonctionne lors de la lecture / écriture de petits fichiers répétés. Et ce sont les opérations les plus courantes lors de l'exécution d'Android Studio.


Je travaille actuellement sur un projet avec un cache total de plus de 700 Mo, composé de 10 modules. L'un des modules est son propre générateur de code basé sur kapt avec une logique très lourde. Deux modules NDK, dont l'un fait référence à Boost sur un chemin externe. Le reste est des tonnes de code Kotlin.


Si nous comparons le temps d'une reconstruction complète de ce projet, les résultats sont les suivants:


  • Avec RAPID éteint, le temps était de 1m 47s 633ms. Tolérant.
  • Avec RAPID activé, la première reconstruction est passée en 1m 41s 633ms. Empilé dans l'erreur.
  • Avec RAPID activé, la deuxième reconstruction s'est déroulée en 1m 7s 132m. Voici le gain. Un peu plus de 37%, ce qui est significatif. Les reconstructions ultérieures montrent un temps encore plus court, mais avec une différence ne dépassant pas 3-5 secondes par rapport à la dernière mesure. Ce qui est sans importance.

Dans les processus plus courts, la croissance dans le studio est immédiatement perceptible.


Par conséquent, nous pouvons recommander ces technologies et lecteurs comme un bon moyen d'augmenter la productivité. Il n'y a eu aucune plainte concernant la stabilité.


Android Studio


Beaucoup de ces conseils sont tirés d'ici et complétés par mes commentaires. Le reste est le résultat de mes recherches et de mon expérience.


Mises à jour


Le conseil, bien que banal, est toujours pertinent. Si vous n'avez pas de projet hérité, essayez si possible de maintenir à jour les versions du studio et des composants associés (tels que Gradle, Android Plugin, Kotlin Plugin). Google et JetBrains font beaucoup de travail pour optimiser la vitesse et intégrer de nouvelles versions.


Parfois, bien sûr, l'embarras se produit lorsque les nouvelles versions cessent de se comporter de manière prévisible et provoquent des erreurs. Par conséquent, nous avons un règlement sur la façon d'agir dans de telles situations.


Dans certains cas, vous devez faire Fichier-> invalider les caches et redémarrer après la restauration. Si vous mettez à jour le studio lui-même, il est préférable de sauvegarder les répertoires du studio et les répertoires des paramètres. Cela est vrai si votre projet contient , .



, , API, library-. . , , .


, . , .


Instant Run


. " ". . -.


, , . . , - , Instant Run.


Build, Execution, Deployment -> Instant Run Enable Instant Run.


Attach to Process


. , ( ) . .


, - Attach debugger to Android process.


Gradle build configs


, buildConfig flavour , release- (, crashlytics, annotation- gradle-)- debug . - , , .


, buildConfig, PNG crunching, - debug-. png . :


 android { buildTypes { myConfig { crunchPngs false } } } //   android plugin android{ aaptOptions { cruncherEnabled false } } 

WebP


minimum api level 18, WebP. , . . , - .



(, app-), Compile independent modules in parallel Settings->Build, Execution, Deployment -> Compiler. CPU . - heap size , , .


gradle.properties


org.gradle.parallel=true


Gradle daemon


- , .


jvm gradle . . - . gradle.properties


org.gradle.daemon=true


Offline-


Gradle web- , . . , - .


Build, Execution, Deployment -> Gradle Offline work.


heap size Android Studio IDEA


. xmx1280m ( , RAM ). GC , , .


heap size , Gradle.


Gradle gradle.properties


org.gradle.jvmargs=-Xms1024m -Xmx4096m


1 4 . , .


Android Studio IDEA Help -> Edit Custom VM Options JVM- .


JVM , - . java -X .


Plugins


, IDE. - . . .


- . Settings -> Plugins , , . , - .


Inspections


Settings -> Editor -> Inspections IDE. .


, . - , .


Power Save mode


File. (, , Spell Checking ..). . , , VS Code.


, .


Settings Repository


, . . .


codestyle- Git, copyright , codestyle .


, , .idea , - .


AVD


AVD . 3 , ( x86-).


, x86- Pie AVD . . , .


, HAXM 2 RAM .


, AVD CPU - , . , CPU - .


- . Settings -> Advanced . , . , Cold Boot. .


AVD


GPU , - GPU, . , . Cold Boot.


Résumé


, . .


- . , .

Source: https://habr.com/ru/post/fr433604/


All Articles