{"id":354953,"date":"2024-05-20T22:58:40","date_gmt":"2024-05-20T22:58:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=354953"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=354953","title":{"rendered":"<span>Flutter \u043d\u0430 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Flutter\u00a0\u2014 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u0442\u00a0Google \u0434\u043b\u044f\u00a0\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u043d\u0435\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044f \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. Flutter \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android, iOS, Linux, macOS, Windows, Web.<\/p>\n<p>\u041f\u043e\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442, \u043d\u0430\u0447\u0430\u0442\u044b\u0445 \u0432 2022\u00a0\u0433\u043e\u0434\u0443, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Flutter \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 <code>4.0.2.269<\/code>. \u0414\u043b\u044f\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d<\/a> Flutter SDK, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0441\u0438\u044e Flutter <code>3.3.10<\/code> \u0438 Dart <code>2.18.6<\/code>.<\/p>\n<h3>Flutter SDK<\/h3>\n<p>\u0412\u00a0\u0441\u043e\u0441\u0442\u0430\u0432 Flutter SDK \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter\/-\/tree\/aurora\/documentation\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043f\u043e\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 (\u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443) <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins\/-\/blob\/master\/README.md\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u0433\u0438\u043d\u044b<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins\/-\/tree\/master\/example\" rel=\"noopener noreferrer nofollow\">Flutter example packages<\/a>\u00bb, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/fluttery-todo\" rel=\"noopener noreferrer nofollow\">Fluttery ToDo<\/a>\u00bb \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>Flutter SDK \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043d\u0435\u00a0\u0432\u0445\u043e\u0434\u0438\u0442 \u0432 <code>upstream<\/code>, \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0410\u0432\u0440\u043e\u0440\u0430 \u043d\u0435\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 Flutter. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter\/-\/blob\/aurora\/documentation\/installation.md\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins\/-\/tree\/master\/example\" rel=\"noopener noreferrer nofollow\">Flutter example packages<\/a>\u00bb \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. \u0412\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430\u00a0\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442\u00a0\u0432\u0435\u0440\u0441\u0438\u0438 Flutter \u0438 Dart, \u0438 \u0438\u043c\u0435\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439, \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins#package-done\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/466\/d06\/6a2\/466d066a20eb3d93345dc0cbec4ab76d.png\" alt=\"Flutter example packages\" title=\"Flutter example packages\" width=\"500\" height=\"432\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/466\/d06\/6a2\/466d066a20eb3d93345dc0cbec4ab76d.png\"\/><\/p>\n<div><figcaption>Flutter example packages<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/fluttery-todo\" rel=\"noopener noreferrer nofollow\">Fluttery ToDo<\/a>\u00bb \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<br \/> (<a href=\"https:\/\/pub.dev\/packages\/path_provider\" rel=\"noopener noreferrer nofollow\">path_provider<\/a> \u0438 <a href=\"https:\/\/pub.dev\/packages\/sqflite\" rel=\"noopener noreferrer nofollow\">sqflite<\/a>),  \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb3\/628\/291\/cb3628291d8d20364db47b3bcc62aad7.png\" alt=\"Fluttery ToDo\" title=\"Fluttery ToDo\" width=\"500\" height=\"432\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb3\/628\/291\/cb3628291d8d20364db47b3bcc62aad7.png\"\/><\/p>\n<div><figcaption>Fluttery ToDo<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u00a0\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 <code>armv7hl<\/code>, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u043a\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430.<\/p>\n<\/blockquote>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Flutter SDK<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438:<\/p>\n<ol>\n<li>\n<p><a href=\"#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-flutter-sdk\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Flutter SDK<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-platform-sdk\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Platform SDK<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-Flutter\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flutter<\/a><\/p>\n<\/li>\n<\/ol>\n<h4> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flutter SDK<\/h4>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 Flutter SDK \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 \u043d\u0430\u00a0Linux \u0438 Windows, \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/wsl\/install\" rel=\"noopener noreferrer nofollow\">WSL2<\/a>.<\/p>\n<blockquote>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flutter SDK \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0442\u0430\u043a\u00a0\u0436\u0435 \u043a\u0430\u043a\u00a0\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Flutter.<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0434\u043b\u044f\u00a0Ubuntu 22.04.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u043e\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0curl, git \u0438 zip:<\/p>\n<pre><code>$ sudo apt-get install curl git git-lfs unzip bzip2<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Flutter SDK:<\/p>\n<pre><code>$ mkdir -p ~\/.local\/opt<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Flutter \u0441\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0432\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>alias<\/code>, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 Flutter SDK:<\/p>\n<pre><code>$ git clone https:\/\/gitlab.com\/omprussia\/flutter\/flutter.git ~\/.local\/opt\/flutter  $ echo \"alias flutter-aurora=$HOME\/.local\/opt\/flutter\/bin\/flutter\" >> ~\/.bashrc  $ exec bash  <\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043e Flutter SDK \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flutter:<\/p>\n<pre><code>$ flutter-aurora config --enable-aurora<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>doctor<\/code> \u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<pre><code>$ flutter-aurora doctor<\/code><\/pre>\n<h4> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Platform SDK<\/h4>\n<p>\u0414\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0Flutter \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Platform SDK. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 Platform SDK \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e <a href=\"https:\/\/developer.auroraos.ru\/doc\/software_development\/psdk\/setup\" rel=\"noopener noreferrer nofollow\">(\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438)<\/a>. \u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b Platform SDK \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u0440\u0430\u0432\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u0431\u043e\u0440\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <strong>\/etc\/sudoers.d<\/strong>, \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0Platform SDK \u0431\u0435\u0437\u00a0\u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<blockquote>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e <code>&lt;USERNAME><\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/blockquote>\n<p>\u0424\u0430\u0439\u043b <strong>\/etc\/sudoers.d\/mer-sdk-chroot<\/strong>:<\/p>\n<pre><code>&lt;USERNAME> ALL=(ALL) NOPASSWD: \/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/mer-sdk-chroot   Defaults!\/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/mer-sdk-chroot env_keep += \"SSH_AGENT_PID SSH_AUTH_SOCK\"  <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b <strong>\/etc\/sudoers.d\/sdk-chroot<\/strong>:<\/p>\n<pre><code>&lt;USERNAME> ALL=(ALL) NOPASSWD: \/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/sdk-chroot   Defaults!\/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/sdk-chroot env_keep += \"SSH_AGENT_PID SSH_AUTH_SOCK\"  <\/code><\/pre>\n<p>\u041b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Flutter SDK \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e <code>sudo<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u0441\u044f \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code>$ sudo echo 'Run doctor' &amp;&amp; flutter-aurora doctor<\/code><\/pre>\n<h4> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flutter<\/h4>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Flutter \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Platform SDK. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Flutter \u043f\u043e \u043f\u0443\u0442\u0438 <strong>&lt;flutter>\/bin\/cache\/artifacts\/aurora\/arm<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <code>armv7hl<\/code> \u0442\u0430\u0440\u0433\u0435\u0442\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code>$ aurora_psdk sdk-assistant list   AuroraOS-4.0.2.89-base   \u251c\u2500AuroraOS-4.0.2.89-base-aarch64   \u251c\u2500AuroraOS-4.0.2.89-base-armv7hl &lt;- &lt;TARGET>   \u2514\u2500AuroraOS-4.0.2.89-base-i486  <\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0430\u0440\u0433\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code>$ aurora_psdk sb2-config -d &lt;TARGET><\/code><\/pre>\n<p>\u0433\u0434\u0435 <code>&lt;TARGET><\/code> \u2014 \u043f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>AuroraOS-4.0.2.89-base-armv7hl<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u0440\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0435 \u0445\u0435\u0448\u0435\u0439 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u0432 (<code>i<\/code>):<\/p>\n<pre><code>$ cd ~\/.local\/opt\/flutter\/bin\/cache\/artifacts\/aurora\/arm     # \u0414\u043b\u044f \u0410\u0432\u0440\u043e\u0440\u0430 4.0.2 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438   $ aurora_psdk sb2 -t &lt;TARGET> -m sdk-install -R zypper in platform-sdk\/compatibility\/*.rpm    # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b   $ aurora_psdk sb2 -t &lt;TARGET> -m sdk-install -R zypper in platform-sdk\/*.rpm      # \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043a\u0438 armv7hl \u0442\u0430\u0440\u0433\u0435\u0442\u0430   $ aurora_psdk sdk-assistant target remove --snapshots-of &lt;TARGET>  <\/code><\/pre>\n<p>\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c Flutter SDK \u043f\u043e\u00a0\u043f\u0443\u0442\u0438 <strong>&lt;flutter>\/bin\/cache\/artifacts\/aurora\/arm\/device\/compatibility<\/strong>.<\/p>\n<p>\u0412\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044d\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u00a0\u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0451 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0430\u00a0\u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u00a0\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code>$ devel-su pkcon install-local *.rpm -y<\/code><\/pre>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Hello World<\/h3>\n<p>\u0414\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>app<\/code> \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p><code>plugin<\/code> \u2014 Platform Channel \u043f\u043b\u0430\u0433\u0438\u043d;<\/p>\n<\/li>\n<li>\n<p><code>plugin_ffi<\/code> \u2014 FFI \u043f\u043b\u0430\u0433\u0438\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0443\u043a\u0430\u0437\u0430\u0432 \u0448\u0430\u0431\u043b\u043e\u043d, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>$ flutter-aurora create --platforms=aurora --template=app --org=&lt;ORG_NAME> &lt;APPNAME><\/code><\/pre>\n<p>\u0433\u0434\u0435 <code>&lt;ORG_NAME><\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, <code>&lt;APPNAME><\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 Flutter \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code>\u251c\u2500\u2500 analysis_options.yaml \u251c\u2500\u2500 aurora \u2502   \u251c\u2500\u2500 CMakeLists.txt \u2502   \u251c\u2500\u2500 desktop \u2502   \u2502   \u2514\u2500\u2500 com.hello.world.desktop \u2502   \u251c\u2500\u2500 flutter \u2502   \u2502   \u251c\u2500\u2500 generated_plugin_registrant.cpp \u2502   \u2502   \u251c\u2500\u2500 generated_plugin_registrant.h \u2502   \u2502   \u2514\u2500\u2500 generated_plugins.cmake \u2502   \u251c\u2500\u2500 icons \u2502   \u2502   \u251c\u2500\u2500 108x108.png \u2502   \u2502   \u251c\u2500\u2500 128x128.png \u2502   \u2502   \u251c\u2500\u2500 172x172.png \u2502   \u2502   \u2514\u2500\u2500 86x86.png \u2502   \u251c\u2500\u2500 main.cpp \u2502   \u2514\u2500\u2500 rpm \u2502       \u2514\u2500\u2500 com.hello.world.spec \u251c\u2500\u2500 lib \u2502   \u2514\u2500\u2500 main.dart \u251c\u2500\u2500 pubspec.lock \u251c\u2500\u2500 pubspec.yaml \u251c\u2500\u2500 README.md \u2514\u2500\u2500 world.iml<\/code><\/pre>\n<ul>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>&lt;project>\/aurora\/rpm\/&lt;ORGNAME>.&lt;APPNAME>.spec<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0435\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>&lt;project>\/aurora\/desktop\/&lt;ORGNAME>.&lt;APPNAME>.desktop<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043a\u043e\u043d\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <strong>&lt;project>\/aurora\/icons<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0434\u043b\u044f Flutter \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.<\/p>\n<h3>\u041f\u0430\u043a\u0435\u0442\u044b Dart<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b Dart \u0434\u0435\u043b\u044f\u0442 \u043d\u0430\u00a0\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u0430:<\/p>\n<ul>\n<li>\n<p><strong>Dart package<\/strong>\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0Dart, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, package <code>path<\/code>. \u0422\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f\u00a0Flutter \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u00a0\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Flutter, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044f \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Flutter, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, package <code>fluro<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Plugin package<\/strong>\u00a0\u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 Dart, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 API, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0Dart, \u0432\u00a0\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u0430\u043a\u0435\u0442\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u043b\u044f\u00a0Android (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kotlin \u0438\u043b\u0438\u00a0Java), \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0421++), iOS (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Swift \u0438\u043b\u0438\u00a0Objective\u2011C), \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, macOS, Windows \u0438\u043b\u0438\u00a0Linux \u0438\u043b\u0438\u00a0\u043b\u044e\u0431\u043e\u0439 \u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>FFI Plugin package<\/strong>\u00a0\u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 Dart, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 API, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0Dart, \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c\u0438 <a href=\"https:\/\/dart.dev\/guides\/libraries\/c-interop\" rel=\"noopener noreferrer nofollow\">Dart FFI<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b Dart \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0430:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435<\/strong>\u00a0\u2014 \u041f\u0430\u043a\u0435\u0442\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u00a0Dart, \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u043e\u0434\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043d\u043e\u00a0\u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442\u00a0\u0432\u0435\u0440\u0441\u0438\u0438 Flutter \u0438 Dart, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435<\/strong>\u00a0\u2014 \u041f\u0430\u043a\u0435\u0442\u044b \u0441\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0438\u043b\u0438\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b. \u0422\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. <\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442 Dart \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437  \u0444\u0430\u0439\u043b\u0430 <strong>pubspec.yaml<\/strong>, \u043f\u0430\u043f\u043a\u0438 <strong>lib<\/strong> \u0441 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c\u00a0<strong>&lt;package-name>.dart<\/strong>. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code>$ flutter-aurora create --template=package &lt;package-name><\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u00abDart package\u00bb. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f <code>plugin<\/code> \u2014 Plugin package \u0438\u043b\u0438 <code>plugin_ffi<\/code> \u2014 FFI Plugin package:<\/p>\n<pre><code># Plugin package $ flutter-aurora create --template=plugin --platforms=aurora &lt;package-name>  # FFI Plugin package $ flutter-aurora create --template=plugin_ffi --platforms=aurora &lt;package-name><\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u044b\u043c \u0438\u0437 \u0442\u0440\u0451\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/demo-dart-packages\/-\/tree\/master\/flutter_device\" rel=\"noopener noreferrer nofollow\"><strong>flutter_device<\/strong><\/a>. \u041f\u0430\u043a\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e D-Bus \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0442\u0440\u0435\u043c\u044f \u0442\u0438\u043f\u0430\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 (Dart package, Plugin package, FFI Plugin package). \u0422\u0430\u043a\u0436\u0435 \u043f\u0430\u043a\u0435\u0442 <strong>flutter_device<\/strong> \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435.<\/p>\n<p>\u0412\u0441\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435, \u043d\u043e\u00a0\u0432\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437\u00a0\u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0432\u00a0\u043a\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u044c\u044e, \u0432\u0435\u0440\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <em>\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/em> \u0438 <em>\u043e\u0431\u0449\u0438\u0439-\u043f\u0430\u043a\u0435\u0442<\/em>, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432\u00a0\u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0432 <em>upstream<\/em> \u043f\u0430\u043a\u0435\u0442\u0430, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0430\u043a\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <em>\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/em> \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<blockquote>\n<p><strong>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u2011\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/strong>\u00a0\u2014 \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f\u00a0\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<\/blockquote>\n<blockquote>\n<p><strong>\u041e\u0431\u0449\u0438\u0439\u2011\u043f\u0430\u043a\u0435\u0442<\/strong>\u00a0\u2014 \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u0430. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u0440\u0438\u00a0\u0441\u0431\u043e\u0440\u043a\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<\/blockquote>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/demo-dart-packages\" rel=\"noopener noreferrer nofollow\"><strong>demo-flutter-packages<\/strong><\/a><\/p>\n<pre><code>\u251c\u2500\u2500 device_platform_interface \u251c\u2500\u2500 flutter_device \u251c\u2500\u2500 hello_world \u2514\u2500\u2500 packages     \u251c\u2500\u2500 android     \u2502   \u2514\u2500\u2500 plugin_device_android     \u2514\u2500\u2500 aurora         \u251c\u2500\u2500 dart_package_device         \u251c\u2500\u2500 ffi_plugin_device         \u2514\u2500\u2500 plugin_device<\/code><\/pre>\n<ul>\n<li>\n<p><strong>device_platform_interface<\/strong>\u00a0\u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0434\u043b\u044f\u00a0\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>flutter_device<\/strong>\u00a0\u2014 \u043e\u0431\u0449\u0438\u0439-\u043f\u0430\u043a\u0435\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>plugin_device_android<\/strong>\u00a0\u2014 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <a href=\"https:\/\/developer.android.com\/reference\/android\/os\/Build\" rel=\"noopener noreferrer nofollow\">Build<\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>dart_package_device<\/strong>\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442, \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pub.dev\/packages\/dbus\" rel=\"noopener noreferrer nofollow\">dbus<\/a>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>plugin_device<\/strong>\u00a0\u2014 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0439 <a href=\"https:\/\/doc.qt.io\/qt-5\/qtdbus-index.html\" rel=\"noopener noreferrer nofollow\">Qt D\u2011Bus<\/a> \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>hello_world<\/strong>\u00a0\u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Flutter \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u043d\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>ffi_plugin_device<\/strong>\u00a0\u2014 FFI\u2011\u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/dart.dev\/guides\/libraries\/c-interop\" rel=\"noopener noreferrer nofollow\">Dart FFI<\/a> \u0438 <a href=\"https:\/\/doc.qt.io\/qt-5\/qtdbus-index.html\" rel=\"noopener noreferrer nofollow\">Qt D\u2011Bus<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0439 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/demo-dart-packages\" rel=\"noopener noreferrer nofollow\">demo-flutter-packages<\/a>. \u0422\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h3>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (device_platform_interface)<\/h3>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u2011\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <strong>device_platform_interface<\/strong>\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442 \u0441\u00a0\u0442\u0438\u043f\u043e\u043c \u00abDart package\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <a href=\"https:\/\/pub.dev\/documentation\/plugin_platform_interface\/latest\/plugin_platform_interface\/PlatformInterface-class.html\" rel=\"noopener noreferrer nofollow\">PlatformInterface<\/a>. \u0417\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430\u00a0\u2014 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u00a0\u043e\u0431\u0449\u0435\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>device_platform_interface<\/strong><\/p>\n<pre><code>\u2514\u2500\u2500 device_platform_interface     \u251c\u2500\u2500 lib     \u2502   \u2514\u2500\u2500 device_platform_interface.dart     \u2514\u2500\u2500 pubspec.yaml<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b <strong>device_platform_interface\/lib\/device_platform_interface.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b abstract class DevicePlatform extends PlatformInterface {   \/\/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 PlatformInterface   DevicePlatform() : super(token: _token);    \/\/\/ \u0422\u043e\u043a\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e   static final Object _token = Object();    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430   static DevicePlatform? _instance;    \/\/\/ \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430   static DevicePlatform get instance => _instance!;    \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430   static set instance(DevicePlatform instance) {     PlatformInterface.verifyToken(instance, _token);     _instance = instance;   }    \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430   Future&lt;String?> get deviceName {     throw UnimplementedError('deviceName() has not been implemented.');   } }<\/code><\/pre>\n<h3>\u041e\u0431\u0449\u0438\u0439-\u043f\u0430\u043a\u0435\u0442 (flutter_device)<\/h3>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d <strong>flutter_device<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. Flutter \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u043a\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0438, \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043d\u0443\u0436\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u0440\u0438\u00a0\u0441\u0431\u043e\u0440\u043a\u0435.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430  <strong>flutter_device<\/strong>:<\/p>\n<pre><code>\u2514\u2500\u2500 flutter_device     \u251c\u2500\u2500 lib     \u2502   \u2514\u2500\u2500 flutter_device.dart     \u2514\u2500\u2500 pubspec.yaml<\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <strong>pubspec.yaml<\/strong> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435. \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android (plugin_device_android) \u0438 \u0442\u0440\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 (dart_package_device, ffi_plugin_device, plugin_device). \u0412\u0441\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0440\u0435\u043c\u044f \u0442\u0438\u043f\u0430\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 (Dart package, Plugin package, FFI Plugin package), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>default_package<\/code>.<\/p>\n<pre><code class=\"yaml\">flutter:   plugin:     platforms:       aurora:         default_package: dart_package_device # ffi_plugin_device \u0438\u043b\u0438 plugin_device       android:         default_package: plugin_device_android<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0449\u0438\u0439-\u043f\u0430\u043a\u0435\u0442 <strong>flutter_device<\/strong> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)\" rel=\"noopener noreferrer nofollow\">Singleton<\/a>).<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>flutter_device\/lib\/flutter_device.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">class FlutterDevice {    \/\/\/ \u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440   factory FlutterDevice() {     _singleton ??= FlutterDevice._();     return _singleton!;   }    \/\/\/ \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440   FlutterDevice._();    \/\/\/ \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430   static FlutterDevice? _singleton;    \/\/\/ \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 DevicePlatform   static DevicePlatform get _platform {     return DevicePlatform.instance;   }    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430   Future&lt;String?> get deviceName {     return _platform.deviceName;   } }<\/code><\/pre>\n<h3>\u041f\u0430\u043a\u0435\u0442 Android (plugin_device_android)<\/h3>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d Android \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u00a0\u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u00a0Android \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <strong>plugin_device_android<\/strong> \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e-\u043f\u0430\u043a\u0435\u0442\u0430 <strong>flutter_device<\/strong>.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>plugin_device_android<\/strong>:<\/p>\n<pre><code>\u2514\u2500\u2500 android     \u2514\u2500\u2500 plugin_device_android         \u251c\u2500\u2500 android         \u2502   \u251c\u2500\u2500 build.gradle         \u2502   \u251c\u2500\u2500 local.properties         \u2502   \u251c\u2500\u2500 plugin_device_android_android.iml         \u2502   \u251c\u2500\u2500 settings.gradle         \u2502   \u2514\u2500\u2500 src         \u2502       \u2514\u2500\u2500 main         \u2502           \u251c\u2500\u2500 AndroidManifest.xml         \u2502           \u2514\u2500\u2500 kotlin         \u2502               \u2514\u2500\u2500 ru         \u2502                   \u2514\u2500\u2500 auroraos         \u2502                       \u2514\u2500\u2500 plugin_device_android         \u2502                           \u2514\u2500\u2500 PluginDeviceAndroidPlugin.kt         \u251c\u2500\u2500 lib         \u2502   \u251c\u2500\u2500 plugin_device_android.dart         \u2502   \u2514\u2500\u2500 plugin_device_android_method_channel.dart         \u2514\u2500\u2500 pubspec.yaml<\/code><\/pre>\n<p>\u0412 <strong>pubspec.yaml<\/strong> \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Android \u0443\u043a\u0430\u0437\u0430\u043d\u044b <code>package<\/code>\u00a0\u2014 java\/kotlin \u043f\u0430\u043a\u0435\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0438 <code>pluginClass<\/code>\u00a0\u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/api.flutter.dev\/javadoc\/io\/flutter\/embedding\/engine\/plugins\/FlutterPlugin.html\" rel=\"noopener noreferrer nofollow\">FlutterPlugin<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Flutter \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u00a0\u0445\u043e\u0441\u0442\u2011\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/android\/plugin_device_android\/PluginDeviceAndroidPlugin.kt<\/strong>:<\/p>\n<pre><code class=\"kotlin\">class PluginDeviceAndroidPlugin : FlutterPlugin, MethodCallHandler {     \/**      * MethodChannel \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 Flutter \u0438 \u0440\u043e\u0434\u043d\u044b\u043c Android.      * \u042d\u0442\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 Flutter Engine      * \u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 Flutter Engine \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d \u043e\u0442 Activity.      *\/     private lateinit var channel: MethodChannel      \/**      * \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f [MethodChannel].      *\/     override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {         channel = MethodChannel(flutterPluginBinding.binaryMessenger, \"plugin_device_android\")         channel.setMethodCallHandler(this)     }      \/**      * \u041c\u0435\u0442\u043e\u0434 onMethodCall \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 MethodChannel \u0438\u0437 Dart-\u043f\u043b\u0430\u0433\u0438\u043d\u0430.      * \u041f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u0438\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.      *\/     override fun onMethodCall(call: MethodCall, result: Result) {         if (call.method == \"getDeviceName\") {             result.success(\"${android.os.Build.BRAND.capitalize()} ${android.os.Build.MODEL}\")         } else {             result.notImplemented()         }     }      \/**      * \u041c\u0435\u0442\u043e\u0434 onDetachedFromEngine \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 FlutterEngine,      * \u043b\u0438\u0431\u043e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 PluginRegistry.remove      *\/     override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {         channel.setMethodCallHandler(null)     } }<\/code><\/pre>\n<p>\u0412 <strong>pubspec.yaml<\/strong> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>dartPluginClass<\/code> \u2014 \u043a\u043b\u0430\u0441\u0441 Dart \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <strong>device_platform_interface<\/strong>.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/android\/plugin_device_android\/lib\/plugin_device_android.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">class PluginDeviceAndroid extends DevicePlatform {   \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   \/\/\/ \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d   static void registerWith() {     DevicePlatform.instance = MethodChannelPluginDeviceAndroid();   }    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 [DevicePlatform]   @override   Future&lt;String?> get deviceName => DevicePlatform.instance.deviceName; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>registerWith<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043a <code>dartPluginClass<\/code>. \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d <code>\u043e\u0431\u0449\u0435\u043c\u0443-\u043f\u0430\u043a\u0435\u0442\u0443<\/code> <strong>flutter_device<\/strong>. \u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <strong>plugin_device_android<\/strong> \u0441 \u0435\u0433\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/api.flutter.dev\/flutter\/services\/MethodChannel-class.html\" rel=\"noopener noreferrer nofollow\">MethodChannel<\/a> \u0441 \u043e\u0431\u0449\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 <code>plugin_device_android<\/code>, \u043e\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/android\/plugin_device_android\/lib\/plugin_device_android_method_channel.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f [PluginDevicePlatform], \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043d\u0430\u043b\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432. class MethodChannelPluginDeviceAndroid extends DevicePlatform {   \/\/\/ \u041a\u0430\u043d\u0430\u043b \u043c\u0435\u0442\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439.   @visibleForTesting   final methodChannel = const MethodChannel('plugin_device_android');    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430   \/\/\/ getDeviceName \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c   \/\/\/ \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430   @override   Future&lt;String?> get deviceName async {     return await methodChannel.invokeMethod&lt;String>('getDeviceName');   } }<\/code><\/pre>\n<h3>\u041f\u0430\u043a\u0435\u0442 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u00abDart package\u00bb (dart_package_device)<\/h3>\n<p>\u041d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/developer.auroraos.ru\/doc\/software_development\/reference\/device_info\" rel=\"noopener noreferrer nofollow\">Device Info API<\/a>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 <a href=\"https:\/\/www.freedesktop.org\/wiki\/Software\/dbus\/\" rel=\"noopener noreferrer nofollow\">D-Bus<\/a>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0430\u043a\u0435\u0442 Dart <a href=\"https:\/\/pub.dev\/packages\/dbus\" rel=\"noopener noreferrer nofollow\">dbus<\/a>. \u041f\u0430\u043a\u0435\u0442 <code>dbus<\/code> \u2014 \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f D-Bus \u0434\u043b\u044f Dart. \u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 Dart \u0434\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430, \u043d\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043d\u0430 C++.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>dart_package_device<\/strong>:<\/p>\n<pre><code>\u2514\u2500\u2500 aurora     \u2514\u2500\u2500 dart_package_device         \u251c\u2500\u2500 lib         \u2502   \u251c\u2500\u2500 dart_package_device.dart         \u2502   \u2514\u2500\u2500 ru_omp_device_info_features.dart         \u251c\u2500\u2500 ru.omp.deviceinfo.Features.xml         \u2514\u2500\u2500 pubspec.yaml<\/code><\/pre>\n<p>\u041f\u0430\u043a\u0435\u0442 <code>dbus<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 xml-\u0444\u0430\u0439\u043b\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 D-Bus \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Dart-\u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/dart_package_device\/ru.omp.deviceinfo.Features.xml<\/strong>:<\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE node PUBLIC \"-\/\/freedesktop\/\/DTD D-BUS Object Introspection 1.0\/\/EN\"         \"http:\/\/www.freedesktop.org\/standards\/dbus\/1.0\/introspect.dtd\"> &lt;node>     &lt;interface name=\"ru.omp.deviceinfo.Features\">         &lt;method name=\"getDeviceModel\">             &lt;arg type=\"s\" direction=\"out\"\/>         &lt;\/method>     &lt;\/interface> &lt;\/node><\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code>$ dart-dbus generate-remote-object .\/ru.omp.deviceinfo.Features.xml \\   -o lib\/ru_omp_device_info_features.dart<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 c \u0444\u0430\u0439\u043b\u0430 <strong>ru.omp.deviceinfo.Features.xml<\/strong> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/dart_package_device\/lib\/ru_omp_device_info_features.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">class RuOmpDeviceinfoFeatures extends DBusRemoteObject {   RuOmpDeviceinfoFeatures(       DBusClient client, String destination, DBusObjectPath path)       : super(client, name: destination, path: path);    \/\/\/ \u0412\u044b\u0437\u043e\u0432 ru.omp.deviceinfo.Features.getDeviceModel()   Future&lt;String> callGetDeviceModel(       {bool noAutoStart = false,       bool allowInteractiveAuthorization = false}) async {     var result = await callMethod(         'ru.omp.deviceinfo.Features', 'getDeviceModel', [],         replySignature: DBusSignature('s'),         noAutoStart: noAutoStart,         allowInteractiveAuthorization: allowInteractiveAuthorization);     return result.returnValues[0].asString();   } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <strong>device_platform_interface<\/strong> \u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>registerWith<\/code> \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <strong>dart_package_device<\/strong>, \u043a\u0430\u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/dart_package_device\/lib\/dart_package_device.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \/\/\/ \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d static void registerWith() {   DevicePlatform.instance = DartPackageDevice(); }  \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 [DevicePlatform] @override Future&lt;String?> get deviceName async {   \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 D-Bus   final client = DBusClient.session();    \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430   final features = RuOmpDeviceinfoFeatures(     client,     'ru.omp.deviceinfo',     DBusObjectPath('\/ru\/omp\/deviceinfo\/Features'),   );    \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430   final deviceName = await features.callGetDeviceModel();    \/\/ \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 D-Bus   await client.close();    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430   return deviceName == '' ? null : deviceName; }<\/code><\/pre>\n<p>\u0412 <strong>pubspec.yaml<\/strong> \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <strong>dart_package_device<\/strong> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>dartPluginClass<\/code> \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>registerWith<\/code> \u043f\u0440\u043e\u0448\u043b\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 \u043e\u0431\u0449\u0435\u043c-\u043f\u043b\u0430\u0433\u0438\u043d\u0435 <strong>flutter_device<\/strong> \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"yaml\">flutter:   plugin:     platforms:       aurora:         dartPluginClass: DartPackageDevice<\/code><\/pre>\n<h3>\u041f\u0430\u043a\u0435\u0442 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u00abPlugin package\u00bb (plugin_device)<\/h3>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Android. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0421++ \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Qt.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>plugin_device<\/strong>:<\/p>\n<pre><code>\u2514\u2500\u2500 aurora     \u2514\u2500\u2500 plugin_device         \u251c\u2500\u2500 aurora         \u2502   \u251c\u2500\u2500 CMakeLists.txt         \u2502   \u251c\u2500\u2500 include         \u2502   \u2502   \u2514\u2500\u2500 plugin_device         \u2502   \u2502       \u2514\u2500\u2500 plugin_device_plugin.h         \u2502   \u2514\u2500\u2500 plugin_device_plugin.cpp         \u251c\u2500\u2500 lib         \u2502   \u251c\u2500\u2500 plugin_device.dart         \u2502   \u2514\u2500\u2500 plugin_device_method_channel.dart         \u2514\u2500\u2500 pubspec.yaml<\/code><\/pre>\n<p>\u0412 <strong>pubspec.yaml<\/strong> \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <strong>plugin_device<\/strong> \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>pluginClass<\/code> \u0438 <code>dartPluginClass<\/code>.<\/p>\n<pre><code class=\"yaml\">flutter:   plugin:     platforms:       aurora:         pluginClass: PluginDevicePlugin         dartPluginClass: PluginDevice<\/code><\/pre>\n<p><code>PluginDevicePlugin<\/code> \u2014 C++ \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <code>PluginInterface<\/code> \u043f\u0430\u043a\u0435\u0442\u0430 <code>flutter-embedder<\/code>.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/plugin_device\/aurora\/include\/plugin_device\/plugin_device_plugin.h<\/strong>:<\/p>\n<pre><code class=\"cpp\">#include &lt;flutter\/plugin-interface.h> #include &lt;plugin_device\/globals.h>  class PLUGIN_EXPORT PluginDevicePlugin final : public PluginInterface { public:     void RegisterWithRegistrar(PluginRegistrar &amp;registrar) override;  private:     void onMethodCall(const MethodCall &amp;call);     void onGetDeviceName(const MethodCall &amp;call);     void unimplemented(const MethodCall &amp;call); };<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/plugin_device\/aurora\/plugin_device_plugin.cpp<\/strong>:<\/p>\n<pre><code class=\"cpp\">#include &lt;plugin_device\/plugin_device_plugin.h> #include &lt;flutter\/method-channel.h> #include &lt;QtDBus\/QtDBus>  \/**  * \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f [MethodChannel].  *\/ void PluginDevicePlugin::RegisterWithRegistrar(PluginRegistrar &amp;registrar) {     registrar.RegisterMethodChannel(\"plugin_device\",                                     MethodCodecType::Standard,                                     [this](const MethodCall &amp;call) { this->onMethodCall(call); }); }  \/**  * \u041c\u0435\u0442\u043e\u0434 onMethodCall \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 MethodChannel \u0438\u0437 Dart-\u043f\u043b\u0430\u0433\u0438\u043d\u0430.  * \u041f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u0438\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.  *\/ void PluginDevicePlugin::onMethodCall(const MethodCall &amp;call) {     const auto &amp;method = call.GetMethod();     if (method == \"getDeviceName\") {         onGetDeviceName(call);         return;     }     unimplemented(call); }  \/**  * \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430  *\/ void PluginDevicePlugin::onGetDeviceName(const MethodCall &amp;call) {     if (!QDBusConnection::sessionBus().isConnected()) {         call.SendSuccessResponse(nullptr);         return;     }     QDBusInterface iface(\"ru.omp.deviceinfo\",         \"\/ru\/omp\/deviceinfo\/Features\",         \"\",         QDBusConnection::sessionBus()     );     if (iface.isValid()) {         QDBusReply&lt;QString> reply = iface.call(\"getDeviceModel\");         if (reply.isValid()) {             call.SendSuccessResponse(reply.value().toStdString());             return;         }     }     call.SendSuccessResponse(nullptr); }  \/**  * \u041c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 [nullptr], \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d  *\/ void PluginDevicePlugin::unimplemented(const MethodCall &amp;call) {     call.SendSuccessResponse(nullptr); }<\/code><\/pre>\n<p><code>PluginDevice<\/code>\u00a0\u2014 Dart\u2011\u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <strong>device_platform_interface<\/strong> \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>registerWith<\/code> \u043d\u0443\u0436\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u043b\u044f\u00a0\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/plugin_device\/lib\/plugin_device.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">class PluginDevice extends DevicePlatform {   \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   \/\/\/ \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d   static void registerWith() {     DevicePlatform.instance = MethodChannelPluginDevice();   }    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 [DevicePlatform]   @override   Future&lt;String?> get deviceName => DevicePlatform.instance.deviceName; }<\/code><\/pre>\n<p><a href=\"https:\/\/api.flutter.dev\/flutter\/services\/MethodChannel-class.html\" rel=\"noopener noreferrer nofollow\">MethodChannel<\/a> \u043a\u043b\u0430\u0441\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f Android \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/plugin_device\/lib\/plugin_device_method_channel.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f [PluginDevicePlatform], \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043d\u0430\u043b\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 class MethodChannelPluginDevice extends DevicePlatform {   \/\/\/ \u041a\u0430\u043d\u0430\u043b \u043c\u0435\u0442\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439   @visibleForTesting   final methodChannel = const MethodChannel('plugin_device');    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430   \/\/\/ getDeviceName \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c   \/\/\/ \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430   @override   Future&lt;String?> get deviceName async {     return await methodChannel.invokeMethod&lt;String>('getDeviceName');   } }<\/code><\/pre>\n<h3>\u041f\u0430\u043a\u0435\u0442 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u00abFFI Plugin package\u00bb (ffi_plugin_device)<\/h3>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d <strong>FFI Plugin package<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/dart.dev\/guides\/libraries\/c-interop\" rel=\"noopener noreferrer nofollow\">Dart FFI<\/a>.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>ffi_plugin_device<\/strong>:<\/p>\n<pre><code>\u2514\u2500\u2500 aurora     \u2514\u2500\u2500 ffi_plugin_device         \u251c\u2500\u2500 aurora         \u2502   \u2514\u2500\u2500 CMakeLists.txt         \u251c\u2500\u2500 ffigen.yaml         \u251c\u2500\u2500 lib         \u2502   \u251c\u2500\u2500 ffi_plugin_device_bindings_generated.dart         \u2502   \u2514\u2500\u2500 ffi_plugin_device.dart         \u251c\u2500\u2500 pubspec.yaml         \u2514\u2500\u2500 src             \u251c\u2500\u2500 CMakeLists.txt             \u251c\u2500\u2500 ffi_plugin_device.cpp             \u2514\u2500\u2500 ffi_plugin_device.h<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043e\u043a FFI \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <code>ffigen<\/code>. \u041f\u0430\u043a\u0435\u0442, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043a\u043e\u0434\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>ffi<\/code>. \u0412\u00a0<strong>pubspec.yaml<\/strong> \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>ffiPlugin<\/code> \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<pre><code class=\"yaml\">dependencies:   ffi: ^2.0.2  dev_dependencies:   ffigen: ^7.2.7  flutter:   plugin:     platforms:       aurora:         ffiPlugin: true         dartPluginClass: FFIPluginDevice<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043e\u043a \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b <strong>ffigen.yaml<\/strong> \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u0430.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/ffi_plugin_device\/ffigen.yaml<\/strong>:<\/p>\n<pre><code class=\"yaml\">name: PluginDeviceBindings llvm-path:   - '\/usr\/lib\/llvm-14\/lib\/libclang.so' # Ubuntu 22.04   - '\/usr\/lib\/llvm-15\/lib\/libclang.so' # Ubuntu 23.04 description: |   Bindings for `src\/ffi_plugin_device.h`. output: 'lib\/ffi_plugin_device_bindings_generated.dart' headers:   entry-points:     - 'src\/ffi_plugin_device.h'   include-directives:     - 'src\/ffi_plugin_device.h' comments:   style: any   length: full<\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <strong>ffigen.yaml<\/strong> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0445\u0435\u0434\u0435\u0440\u044b \u043d\u0443\u0436\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 <strong>src<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>QtDBus<\/code>.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/ffi_plugin_device\/src\/ffi_plugin_device.h<\/strong>:<\/p>\n<pre><code class=\"cpp\">#ifdef __cplusplus extern \"C\" { #endif  char *getDeviceName();  #ifdef __cplusplus } #endif<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/ffi_plugin_device\/src\/ffi_plugin_device.cpp<\/strong>:<\/p>\n<pre><code class=\"cpp\">#include &lt;QStandardPaths> #include &lt;QtDBus\/QtDBus>  #include \"ffi_plugin_device.h\"  char *getDeviceName() {     QString deviceName = \"\";     if (QDBusConnection::sessionBus().isConnected()) {         QDBusInterface iface(\"ru.omp.deviceinfo\",             \"\/ru\/omp\/deviceinfo\/Features\",             \"\",             QDBusConnection::sessionBus()         );         if (iface.isValid()) {             QDBusReply&lt;QString> reply = iface.call(\"getDeviceModel\");             if (reply.isValid()) {                 deviceName = reply.value();             }         }     }     return deviceName.toUtf8().data(); }<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e FFI-\u043f\u0440\u0438\u0432\u044f\u0437\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0435\u0451 \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <strong>packages\/aurora\/ffi_plugin_device<\/strong>):<\/p>\n<pre><code>flutter-aurora pub run ffigen --config ffigen.yaml<\/code><\/pre>\n<p>\u0412 \u043f\u0430\u043f\u043a\u0435 <strong>lib<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0444\u0430\u0439\u043b <strong>ffi_plugin_device_bindings_generated.dart<\/strong>.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/ffi_plugin_device\/lib\/ffi_plugin_device_bindings_generated.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">import 'dart:ffi' as ffi;  \/\/\/ Bindings for `src\/ffi_plugin_device.h`. class PluginDeviceBindings {   \/\/\/ Holds the symbol lookup function.   final ffi.Pointer&lt;T> Function&lt;T extends ffi.NativeType>(String symbolName)       _lookup;    \/\/\/ The symbols are looked up in [dynamicLibrary].   PluginDeviceBindings(ffi.DynamicLibrary dynamicLibrary)       : _lookup = dynamicLibrary.lookup;    \/\/\/ The symbols are looked up with [lookup].   PluginDeviceBindings.fromLookup(       ffi.Pointer&lt;T> Function&lt;T extends ffi.NativeType>(String symbolName)           lookup)       : _lookup = lookup;    ffi.Pointer&lt;ffi.Char> getDeviceName() {     return _getDeviceName();   }    late final _getDeviceNamePtr =       _lookup&lt;ffi.NativeFunction&lt;ffi.Pointer&lt;ffi.Char> Function()>>(           'getDeviceName');   late final _getDeviceName =       _getDeviceNamePtr.asFunction&lt;ffi.Pointer&lt;ffi.Char> Function()>(); }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>FFIPluginDevice<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <strong>device_platform_interface<\/strong>.<\/p>\n<p>\u0424\u0430\u0439\u043b <strong>packages\/aurora\/ffi_plugin_device\/lib\/ffi_plugin_device.dart<\/strong>:<\/p>\n<pre><code class=\"dart\">class FFIPluginDevice extends DevicePlatform {   \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   \/\/\/ \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d   static void registerWith() {     DevicePlatform.instance = FFIPluginDevice();   }    \/\/\/ \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0432 [_dylib].   final PluginDeviceBindings _bindings = PluginDeviceBindings(     DynamicLibrary.open('libffi_plugin_device.so'),   );    \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 [DevicePlatform]   @override   Future&lt;String?> get deviceName async {     \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 deviceName     final deviceName = _bindings.getDeviceName().cast&lt;Utf8>().toDartString();     \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     return deviceName == '' ? null : deviceName;   } }<\/code><\/pre>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u00abHello World\u00bb<\/h3>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u043f\u0440\u0438 \u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c-\u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c <strong>&lt;project>\/example<\/strong> \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043a \u043d\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430. \u0422\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u0442\u044c \u0438 \u0432 \u043e\u0431\u0449\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 <strong>flutter_device<\/strong>, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0430\u043a\u0435\u0442\u0430. \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 (<code>--debug<\/code>, <code>--profile<\/code>, <code>--release<\/code>):<\/p>\n<pre><code>$ flutter-aurora build aurora --release  Building Aurora application...                                            \u250c\u2500 Result \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 .\/build\/aurora\/arm\/release\/RPMS\/ru.auroraos.flutter_device_example-0.1.0-1.armv7hl.rpm \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 RPM-\u043f\u0430\u043a\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 <a href=\"https:\/\/developer.auroraos.ru\/doc\/software_development\/guides\/package_signing\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c<\/a> \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438-\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0434\u0443\u0449\u0435\u043c \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"yaml\">dependencies:    flutter_device:   path: ..\/ # \u0417\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <strong>Hello World<\/strong> \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <strong>flutter_device<\/strong> \u0447\u0435\u0440\u0435\u0437 Git \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"yaml\">dependencies:   flutter_device:     git:       url: git@gitlab.com:omprussia\/demo-flutter-packages.git       ref: packages       path: flutter_device<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Flutter <a href=\"https:\/\/docs.flutter.dev\/packages-and-plugins\/using-packages\" rel=\"noopener noreferrer nofollow\">Using packages<\/a>.<\/p>\n<h3> \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>Flutter \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u0435\u043f\u0435\u0440\u044c \u0438 \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0435\u00a0\u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e Flutter \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u041c\u044b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0441\u044f \u043a\u00a0\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e Flutter \u0432\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430\u00a0\u2014 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/demo-dart-packages\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u00a0\u0432\u0438\u0434\u0435 Merge Request \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f. \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b40\/63d\/3a6\/b4063d3a6ce975c165f888648f5811ce.png\" width=\"1500\" height=\"862\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b40\/63d\/3a6\/b4063d3a6ce975c165f888648f5811ce.png\"\/><\/figure>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/761176\/\"> https:\/\/habr.com\/ru\/articles\/761176\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Flutter\u00a0\u2014 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u0442\u00a0Google \u0434\u043b\u044f\u00a0\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u043d\u0435\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044f \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. Flutter \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android, iOS, Linux, macOS, Windows, Web.<\/p>\n<p>\u041f\u043e\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442, \u043d\u0430\u0447\u0430\u0442\u044b\u0445 \u0432 2022\u00a0\u0433\u043e\u0434\u0443, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Flutter \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 <code>4.0.2.269<\/code>. \u0414\u043b\u044f\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d<\/a> Flutter SDK, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0441\u0438\u044e Flutter <code>3.3.10<\/code> \u0438 Dart <code>2.18.6<\/code>.<\/p>\n<h3>Flutter SDK<\/h3>\n<p>\u0412\u00a0\u0441\u043e\u0441\u0442\u0430\u0432 Flutter SDK \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter\/-\/tree\/aurora\/documentation\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043f\u043e\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 (\u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443) <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins\/-\/blob\/master\/README.md\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u0433\u0438\u043d\u044b<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins\/-\/tree\/master\/example\" rel=\"noopener noreferrer nofollow\">Flutter example packages<\/a>\u00bb, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/fluttery-todo\" rel=\"noopener noreferrer nofollow\">Fluttery ToDo<\/a>\u00bb \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>Flutter SDK \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043d\u0435\u00a0\u0432\u0445\u043e\u0434\u0438\u0442 \u0432 <code>upstream<\/code>, \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0410\u0432\u0440\u043e\u0440\u0430 \u043d\u0435\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 Flutter. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter\/-\/blob\/aurora\/documentation\/installation.md\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins\/-\/tree\/master\/example\" rel=\"noopener noreferrer nofollow\">Flutter example packages<\/a>\u00bb \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. \u0412\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430\u00a0\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442\u00a0\u0432\u0435\u0440\u0441\u0438\u0438 Flutter \u0438 Dart, \u0438 \u0438\u043c\u0435\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439, \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/flutter-plugins#package-done\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<figure class=\"\">\n<div><figcaption>Flutter example packages<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab<a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/fluttery-todo\" rel=\"noopener noreferrer nofollow\">Fluttery ToDo<\/a>\u00bb \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<br \/> (<a href=\"https:\/\/pub.dev\/packages\/path_provider\" rel=\"noopener noreferrer nofollow\">path_provider<\/a> \u0438 <a href=\"https:\/\/pub.dev\/packages\/sqflite\" rel=\"noopener noreferrer nofollow\">sqflite<\/a>),  \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<figure class=\"\">\n<div><figcaption>Fluttery ToDo<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u00a0\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 <code>armv7hl<\/code>, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u043a\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430.<\/p>\n<\/blockquote>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Flutter SDK<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438:<\/p>\n<ol>\n<li>\n<p><a href=\"#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-flutter-sdk\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Flutter SDK<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-platform-sdk\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Platform SDK<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-Flutter\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flutter<\/a><\/p>\n<\/li>\n<\/ol>\n<h4> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flutter SDK<\/h4>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 Flutter SDK \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 \u043d\u0430\u00a0Linux \u0438 Windows, \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/wsl\/install\" rel=\"noopener noreferrer nofollow\">WSL2<\/a>.<\/p>\n<blockquote>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flutter SDK \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0442\u0430\u043a\u00a0\u0436\u0435 \u043a\u0430\u043a\u00a0\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Flutter.<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0434\u043b\u044f\u00a0Ubuntu 22.04.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u043e\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0curl, git \u0438 zip:<\/p>\n<pre><code>$ sudo apt-get install curl git git-lfs unzip bzip2<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Flutter SDK:<\/p>\n<pre><code>$ mkdir -p ~\/.local\/opt<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Flutter \u0441\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0432\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>alias<\/code>, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 Flutter SDK:<\/p>\n<pre><code>$ git clone https:\/\/gitlab.com\/omprussia\/flutter\/flutter.git ~\/.local\/opt\/flutter  $ echo \"alias flutter-aurora=$HOME\/.local\/opt\/flutter\/bin\/flutter\" >> ~\/.bashrc  $ exec bash  <\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043e Flutter SDK \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flutter:<\/p>\n<pre><code>$ flutter-aurora config --enable-aurora<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>doctor<\/code> \u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<pre><code>$ flutter-aurora doctor<\/code><\/pre>\n<h4> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Platform SDK<\/h4>\n<p>\u0414\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0Flutter \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Platform SDK. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 Platform SDK \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e <a href=\"https:\/\/developer.auroraos.ru\/doc\/software_development\/psdk\/setup\" rel=\"noopener noreferrer nofollow\">(\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438)<\/a>. \u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b Platform SDK \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u0440\u0430\u0432\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u0431\u043e\u0440\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <strong>\/etc\/sudoers.d<\/strong>, \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0Platform SDK \u0431\u0435\u0437\u00a0\u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<blockquote>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e <code>&lt;USERNAME><\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/blockquote>\n<p>\u0424\u0430\u0439\u043b <strong>\/etc\/sudoers.d\/mer-sdk-chroot<\/strong>:<\/p>\n<pre><code>&lt;USERNAME> ALL=(ALL) NOPASSWD: \/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/mer-sdk-chroot   Defaults!\/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/mer-sdk-chroot env_keep += \"SSH_AGENT_PID SSH_AUTH_SOCK\"  <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b <strong>\/etc\/sudoers.d\/sdk-chroot<\/strong>:<\/p>\n<pre><code>&lt;USERNAME> ALL=(ALL) NOPASSWD: \/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/sdk-chroot   Defaults!\/home\/&lt;USERNAME>\/AuroraPlatformSDK\/sdks\/aurora_psdk\/sdk-chroot env_keep += \"SSH_AGENT_PID SSH_AUTH_SOCK\"  <\/code><\/pre>\n<p>\u041b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Flutter SDK \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e <code>sudo<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u0441\u044f \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code>$ sudo echo 'Run doctor' &amp;&amp; flutter-aurora doctor<\/code><\/pre>\n<h4> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flutter<\/h4>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Flutter \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Platform SDK. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Flutter \u043f\u043e \u043f\u0443\u0442\u0438 <strong>&lt;flutter>\/bin\/cache\/artifacts\/aurora\/arm<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <code>armv7hl<\/code> \u0442\u0430\u0440\u0433\u0435\u0442\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code>$ aurora_psdk sdk-assistant list   AuroraOS-4.0.2.89-base   \u251c\u2500AuroraOS-4.0.2.89-base-aarch64   \u251c\u2500AuroraOS-4.0.2.89-base-armv7hl &lt;- &lt;TARGET>   \u2514\u2500AuroraOS-4.0.2.89-base-i486  <\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0430\u0440\u0433\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code>$ aurora_psdk sb2-config -d &lt;TARGET><\/code><\/pre>\n<p>\u0433\u0434\u0435 <code>&lt;TARGET><\/code> \u2014 \u043f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>AuroraOS-4.0.2.89-base-armv7hl<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u0440\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0435 \u0445\u0435\u0448\u0435\u0439 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u0432 (<code>i<\/code>):<\/p>\n<pre><code>$ cd ~\/.local\/opt\/flutter\/bin\/cache\/artifacts\/aurora\/arm     # \u0414\u043b\u044f \u0410\u0432\u0440\u043e\u0440\u0430 4.0.2 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438   $ aurora_psdk sb2 -t &lt;TARGET> -m sdk-install -R zypper in platform-sdk\/compatibility\/*.rpm    # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b   $ aurora_psdk sb2 -t &lt;TARGET> -m sdk-install -R zypper in platform-sdk\/*.rpm      # \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043a\u0438 armv7hl \u0442\u0430\u0440\u0433\u0435\u0442\u0430   $ aurora_psdk sdk-assistant target remove --snapshots-of &lt;TARGET>  <\/code><\/pre>\n<p>\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c Flutter SDK \u043f\u043e\u00a0\u043f\u0443\u0442\u0438 <strong>&lt;flutter>\/bin\/cache\/artifacts\/aurora\/arm\/device\/compatibility<\/strong>.<\/p>\n<p>\u0412\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044d\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u00a0\u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0451 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0430\u00a0\u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u00a0\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code>$ devel-su pkcon install-local *.rpm -y<\/code><\/pre>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Hello World<\/h3>\n<p>\u0414\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>app<\/code> \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p><code>plugin<\/code> \u2014 Platform Channel \u043f\u043b\u0430\u0433\u0438\u043d;<\/p>\n<\/li>\n<li>\n<p><code>plugin_ffi<\/code> \u2014 FFI \u043f\u043b\u0430\u0433\u0438\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0443\u043a\u0430\u0437\u0430\u0432 \u0448\u0430\u0431\u043b\u043e\u043d, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>$ flutter-aurora create --platforms=aurora --template=app --org=&lt;ORG_NAME> &lt;APPNAME><\/code><\/pre>\n<p>\u0433\u0434\u0435 <code>&lt;ORG_NAME><\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, <code>&lt;APPNAME><\/code>\u00a0\u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 Flutter \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code>\u251c\u2500\u2500 analysis_options.yaml \u251c\u2500\u2500 aurora \u2502   \u251c\u2500\u2500 CMakeLists.txt \u2502   \u251c\u2500\u2500 desktop \u2502   \u2502   \u2514\u2500\u2500 com.hello.world.desktop \u2502   \u251c\u2500\u2500 flutter \u2502   \u2502   \u251c\u2500\u2500 generated_plugin_registrant.cpp \u2502   \u2502   \u251c\u2500\u2500 generated_plugin_registrant.h \u2502   \u2502   \u2514\u2500\u2500 generated_plugins.cmake \u2502   \u251c\u2500\u2500 icons \u2502   \u2502   \u251c\u2500\u2500 108x108.png \u2502   \u2502   \u251c\u2500\u2500 128x128.png \u2502   \u2502   \u251c\u2500\u2500 172x172.png \u2502   \u2502   \u2514\u2500\u2500 86x86.png \u2502   \u251c\u2500\u2500 main.cpp \u2502   \u2514\u2500\u2500 rpm \u2502       \u2514\u2500\u2500 com.hello.world.spec \u251c\u2500\u2500 lib \u2502   \u2514\u2500\u2500 main.dart \u251c\u2500\u2500 pubspec.lock \u251c\u2500\u2500 pubspec.yaml \u251c\u2500\u2500 README.md \u2514\u2500\u2500 world.iml<\/code><\/pre>\n<ul>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>&lt;project>\/aurora\/rpm\/&lt;ORGNAME>.&lt;APPNAME>.spec<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0435\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>&lt;project>\/aurora\/desktop\/&lt;ORGNAME>.&lt;APPNAME>.desktop<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043a\u043e\u043d\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <strong>&lt;project>\/aurora\/icons<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0434\u043b\u044f Flutter \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.<\/p>\n<h3>\u041f\u0430\u043a\u0435\u0442\u044b Dart<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b Dart \u0434\u0435\u043b\u044f\u0442 \u043d\u0430\u00a0\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u0430:<\/p>\n<ul>\n<li>\n<p><strong>Dart package<\/strong>\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0Dart, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, package <code>path<\/code>. \u0422\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f\u00a0Flutter \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u00a0\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Flutter, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044f \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Flutter, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, package <code>fluro<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Plugin package<\/strong>\u00a0\u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 Dart, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 API, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0Dart, \u0432\u00a0\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u0430\u043a\u0435\u0442\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u043b\u044f\u00a0Android (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kotlin \u0438\u043b\u0438\u00a0Java), \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0421++), iOS (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Swift \u0438\u043b\u0438\u00a0Objective\u2011C), \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, macOS, Windows \u0438\u043b\u0438\u00a0Linux \u0438\u043b\u0438\u00a0\u043b\u044e\u0431\u043e\u0439 \u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>FFI Plugin package<\/strong>\u00a0\u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 Dart, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 API, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0Dart, \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c\u0438 <a href=\"https:\/\/dart.dev\/guides\/libraries\/c-interop\" rel=\"noopener noreferrer nofollow\">Dart FFI<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b Dart \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0430:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435<\/strong>\u00a0\u2014 \u041f\u0430\u043a\u0435\u0442\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u00a0Dart, \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u043e\u0434\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043d\u043e\u00a0\u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442\u00a0\u0432\u0435\u0440\u0441\u0438\u0438 Flutter \u0438 Dart, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f\u00a0\u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435<\/strong>\u00a0\u2014 \u041f\u0430\u043a\u0435\u0442\u044b \u0441\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0438\u043b\u0438\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b. \u0422\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430. <\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442 Dart \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437  \u0444\u0430\u0439\u043b\u0430 <strong>pubspec.yaml<\/strong>, \u043f\u0430\u043f\u043a\u0438 <strong>lib<\/strong> \u0441 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c\u00a0<strong>&lt;package-name>.dart<\/strong>. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code>$ flutter-aurora create --template=package &lt;package-name><\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u00abDart package\u00bb. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f <code>plugin<\/code> \u2014 Plugin package \u0438\u043b\u0438 <code>plugin_ffi<\/code> \u2014 FFI Plugin package:<\/p>\n<pre><code># Plugin package $ flutter-aurora create --template=plugin --platforms=aurora &lt;package-name>  # FFI Plugin package $ flutter-aurora create --template=plugin_ffi --platforms=aurora &lt;package-name><\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u044b\u043c \u0438\u0437 \u0442\u0440\u0451\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 <a href=\"https:\/\/gitlab.com\/omprussia\/flutter\/demo-dart-packages\/-\/tree\/master\/flutter_device\" rel=\"noopener noreferrer nofollow\"><strong>flutter_device<\/strong><\/a>. \u041f\u0430\u043a\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u041e\u0421 \u0410\u0432\u0440\u043e\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e D-Bus \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0442\u0440\u0435\u043c\u044f \u0442\u0438\u043f\u0430\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 (Dart package, Plugin package, FFI Plugin package). \u0422\u0430\u043a\u0436\u0435 \u043f\u0430\u043a\u0435\u0442 <strong>flutter_device<\/strong> \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-354953","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=354953"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354953\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}