Kivyред Android рдФрд░ рдХреЛрдИ рдЬрд╛рджреВ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдБ


рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрд▓ рдХреЗ рдкрд╛рдпрдерди рд▓реЗрдЦ рдореЗрдВ , рдЬрд┐рд╕рдореЗрдВ рдХреАрд╡реАрдПрдордбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдХрд┐рд╡реА рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдбрд┐рдЬрд╛рдЗрди-рд╢реИрд▓реА рд╡рд┐рдЧреЗрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдЧрдИ рдереА, рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬрд╛рджреБрдИ shamanism рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдХреБрдЫ рдмрдиреА рд╣реБрдИ рд╣реИ рдФрд░ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЬрд╛рджреВрдЧрд░ рдФрд░ рдЬрд╛рджреВрдЧрд░ рд╣реВрдВ ...



рдмреЗрд╢рдХ рд╡рд╣ рдХрд░ рд╕рдХрддрд╛ рдерд╛! рддреЛ, рдЖрдкрдиреЗ рдкрд╛рдпрдерди рдФрд░ рдХрд┐рд╡реА рдореЗрдВ рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦрд╛ред рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ? KivyMD рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрди рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдкреАрдХреЗ рдкреИрдХреЗрдЬ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ:

  1. рдбрд╛рдЙрдирд▓реЛрдб XUbuntu 18.04

рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЙрдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ XUbuntu рдЗрдореЗрдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдИ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛рдПрдВ
XUbuntu рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рдХрд░реЗрдВ, рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

wget https://github.com/HeaTTheatR/KivyMD-data/raw/master/install-kivy-buildozer-dependencies.sh 

 chmod +x install-kivy-buildozer-dependencies.sh 

 ./install-kivy-buildozer-dependencies.sh 

рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреАрд╡реА рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдкреАрдХреЗ рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╣реИ! рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рдЪрд▓реЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдЦрд╛рд▓реА main.py рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ TestKivyMD рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдПрдБ:


рдЗрд╕рдХреЗ рдмрд╛рдж, рдореЗрдирдлреНрд░реЗрдо рдлрд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдЯреЗрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдЬреЛ рдХрд┐ рдХрд┐рд╡рдбреАрдПрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:

 from kivy.lang import Builder from kivymd.app import MDApp KV = """ Screen: MDToolbar: title: "My firt app" elevation: 10 md_bg_color: app.theme_cls.primary_color left_action_items: [["menu", lambda x: x]] pos_hint: {"top": 1} MDRaisedButton: text: "Hello World" pos_hint: {"center_x": .5, "center_y": .5} """ class HelloWorld(MDApp): def build(self): return Builder.load_string(KV) HelloWorld().run() 

рд╕рд╣реЗрдЬреЗрдВ, рдореЗрдирдлреНрд░реЗрдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ KivyMD рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 sudo pip3 install kivymd 

рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдЖрдк рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 python3 main.py 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЯреВрд▓рдмрд╛рд░ рдФрд░ рдПрдХ рдмрдЯрди "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░реАрди рд╣реЛрдЧрд╛:


рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ buildozer.spec рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:


рдпрджрд┐ рдЖрдкрдиреЗ рдЯрд░реНрдорд┐рдирд▓ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдпрджрд┐ рдЯрд░реНрдорд┐рдирд▓ рдмрдВрдж рдерд╛, рддреЛ TestKivyMD рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЦреЛрд▓реЗрдВ), рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░реЗрдВ:

 buildozer init 

рдпрд╣ рдХрдорд╛рдВрдб рдПрдХ рдбрд┐рдлреЙрд▓реНрдЯ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдЧреАред рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 [app] # (str) Title of your application title = KivyMDTest # (str) Package name package.name = kivymd_test # (str) Package domain (needed for android/ios packaging) package.domain = com.heattheatr # (str) Source code where the main.py live source.dir = . # (list) Source files to include (let empty to include all the files) source.include_exts = py,png,jpg,jpeg,ttf # (list) Application version version = 0.0.1 # (list) Application requirements # comma separated eg requirements = sqlite3,kivy requirements = python3,kivy==1.11.1,kivymd # (str) Supported orientation (one of landscape, sensorLandscape, portrait or all) orientation = portrait # (bool) Indicate if the application should be fullscreen or not fullscreen = 1 # (list) Permissions android.permissions = INTERNET,WRITE_EXTERNAL_STORAGE # (int) Target Android API, should be as high as possible. android.api = 28 # (int) Minimum API your APK will support. android.minapi = 21 # (str) Android NDK version to use android.ndk = 17c # (bool) If True, then skip trying to update the Android sdk # This can be useful to avoid excess Internet downloads or save time # when an update is due and you just want to test/build your package android.skip_update = False # (bool) If True, then automatically accept SDK license # agreements. This is intended for automation only. If set to False, # the default, you will be shown the license when first running # buildozer. android.accept_sdk_license = True # (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64 android.arch = armeabi-v7a [buildozer] # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) log_level = 2 # (int) Display warning if buildozer is run as root (0 = False, 1 = True) warn_on_root = 0 # (str) Path to build artifact storage, absolute or relative to spec file build_dir = ./.buildozer # (str) Path to build output (ie .apk, .ipa) storage bin_dir = ./bin 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗрдВ, рдЗрд╕рдореЗрдВ рдЖрдк рдЖрдЗрдХрди рдХреЛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдлреНрд▓реИрд╢ рдХрд░реЗрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд╡рд╣реА рдЫреЛрдбрд╝рд╛ рдЬреЛ рд╣рдореЗрдВ рдЕрдм рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 buildozer android debug 

рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд░рд╕реЛрдИ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЙрдлреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдмрд╛рдж рдХреА рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдореЗрдВ 10-20 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред

рдХреЙрдлреА рдирд╢реЗ рдореЗрдВ рд╣реИ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:


рджреЗрдЦрд╛! рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИ! рдЖрдкрдХреЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдЗрд╕реЗ рдЧрд┐рд░рд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:


рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред

рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭрд╕реЗ рднреА рдкреВрдЫрд╛:


рдХрд┐рд╡реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рдорд╛рд░реНрдХрдЕрдк рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкрд░ рди рддреЛ рд╕реНрдкрдВрджрди рдФрд░ рди рд╣реА рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд▓рд╛рдЗрд╡ рд▓реЗрдЖрдЙрдЯ рдФрд░ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдпреВрдЖрдИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдХреГрддрд┐ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдмреАрдорд╛рд░ рд╡реНрдпрдХреНрддрд┐ рд╣реА рдРрд╕рд╛ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛ред рдирд┐рд░рд╛рдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдлрд╝реНрд▓рдЯрд░ рдХреЛрдб рдФрд░ рдХрд┐рд╡реА рдХреЛрдб рдХреЛ рдПрдХ рд╣реА рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рджреЗрдЦреЗрдВ ... рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


рдиреАрдЪреЗ рдореИрдВ рдлрд╝реНрд▓рдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ , рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдореВрд▓ рдмрд╛рддреЗрдВ :

 import 'package:flutter/widgets.dart'; main() => runApp( Directionality( textDirection: TextDirection.ltr, child: Container( color: Color(0xFFFFFFFF), child: App(), ), ), ); class App extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: GestureDetector( //     onTap: () { //    GestureDetector //    ,      print('You pressed me'); }, child: Container( //     decoration: BoxDecoration( //   shape: BoxShape.circle, //     color: Color(0xFF17A2B8), //      ), width: 80.0, height: 80.0, ), ), ); } } class Counter extends StatefulWidget { //      ,     , //   createState() @override State<Counter> createState() => _CounterState(); //        State, //   State<> } class _CounterState extends State<Counter> { //    -    , //      . //   ,     int counter = 0; //     ,       //   ,      Stateless . @override Widget build(BuildContext context) { //          , //     тАФ  : return Center( child: GestureDetector( onTap: () { //  ,   ,    //  counter. setState(() { // setState()   ,    //      ,    ++counter; }); }, child: Container( decoration: BoxDecoration( shape: BoxShape.circle, color: Color(0xFF17A2B8), ), width: 80.0, child: Center( child: Text( //    counter '$counter', //      style: TextStyle(fontSize: 30.0), ), ), ), ), ); } } 

рдФрд░ рдпрд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди Kivy рдФрд░ KivyMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

 from kivy.lang import Builder from kivymd.app import MDApp KV = """ #:import get_color_from_hex kivy.utils.get_color_from_hex Screen: MDCard: MDLabel: value: 0 text: str(self.value) halign: "center" on_touch_down: self.value += 1 canvas.before: Color: rgba: get_color_from_hex("#4eaabe") Ellipse: pos: self.center[0] - dp(25), self.center[1] - dp(25) size: dp(50), dp(50) """ class HelloWorld(MDApp): def build(self): return Builder.load_string(KV) HelloWorld().run() 

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдирд┐рд╖реНрдХрд░реНрд╖ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ...

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛ред рдореИрдВ "рдЖрдк Android рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рдерд╛" рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБред

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


All Articles