- SWAP в смартфонах: правда или вымысел?
- Что такое SWAP?
- Что если не SWAP?
- Итоги
- Hot swapping code in Android
- The example code
- Виртуальные гигабайты оперативной памяти для Android. Что такое файл подкачки
- Что такое SWAP и почему в Android его не используют по умолчанию
- Альтернатива SWAP как файлу подкачки — zRam
- В каких случаях SWAP может быть полезен
- Как создать файл подкачки на Android
- В некоторых оболочках уже существуют встроенные решения по созданию файла подкачки
SWAP в смартфонах: правда или вымысел?
Статья, посвященная файлу подкачки в современных смартфонах.
Нехватка оперативной памяти была и остается одной из ведущих проблем у пользователей смартфонов. В настоящее время ее дефицит ощущается менее остро с приходом на рынок телефонов с огромными объемами ОЗУ — есть модели с 8 и даже 12 ГБ оперативной памяти. Но что происходит внутри системы, если оперативная память заполнена?
Что такое SWAP?
Начнем с общеизвестного факта — операционная система Android основана на ядре Linux. В этой системе реализован файл/раздел подкачки с собирательным термином SWAP. Он расположен на жестком диске и, если система ощущает нехватку оперативной памяти, часть данных с ОЗУ выгружается в указанный раздел. Это происходит с компонентами программы, которая не задействована в данный момент. Переключившись к ней вновь, система проверяет наличие процесса в SWAP и загружает его обратно в оперативную память.
При этом состояние программы остается неизменным. К примеру, если вы свернули игру на моменте перестрелки, заняв систему другим процессом, по возвращении из «свопа» та не перезагрузится и не вылетит в меню — геймплей будет продолжен с той самой перестрелки. Казалось бы, идеальное решение для смартфонов с любым количеством ОЗУ, но не всё так просто.
В смартфонах используются накопители с ограниченным количеством циклов чтения и записи. Поскольку SWAP требует записывать данные выгруженных приложений очень часто, то и внутренняя память исчерпает свой лимит раньше положенного срока. Именно по этой причине «свопинг» не рекомендуют использовать на SSD-дисках.
Всё это приводит к тому факту, что SWAP в устройствах под управлением Android отсутствует. В интернете есть масса статей относительно создания файла подкачки на смартфоне вручную. Но насколько эти действия оправданы, если знать теорию? Разработчики iOS также опровергли слухи относительно использования «свопа» в их операционной системе.
Что если не SWAP?
В последних версиях Android можно наблюдать работу модуля zRam. Он увеличивает производительность за счёт сжатия фоновых приложений внутри оперативной памяти. Если сжатие достигает своего пика, то программа автоматически закрывается, освобождая ресурсы для более важных операций.
Особенность этого метода заключается в том, что все действия происходят внутри ОЗУ. Как известно, скорость обмена информацией с оперативной памятью значительно выше, чем с внутренними накопителями любых видов.
Итоги
Файл подкачки остается прерогативой персональных компьютеров, поскольку его использование на смартфонах приведет к ускоренному износу флеш-памяти. Вместо привычного «своппинга» через файл подкачки производители мобильных телефонов используют модуль zRam, сжимающий файлы внутри оперативной памяти.
Спасибо за информацию ! Выходит, — можно работать без большого размера оперативной памяти, иначе смартфон будет «тормозить» ? Каков объём «оптимальной» оперативной памяти ? Часто читаю уведомление : «закрыто … приложений, освобождено ….Мб оперативной памяти» Это работа модуля zRAM ? Спасибо !
Источник
Hot swapping code in Android
I’ve recently been looking into ways to update parts of a running Android application silently.
One option I found is loading byte code at run time using a ClassLoader. It actually wasn’t too difficult and I am going to share with you a simple way to do this.
On the Android platform there is a specific class loader we can utilize for loading compiled Dalvik bytecode, DexClassLoader.
You can load compiled Dalvik bytecode using this class. Give it the path to a dex file and call loadClass to retrieve your implementations at runtime.
The example code
One problem we will have when loading code dynamically, is how do we reference it in our main application’s code?
I recommend programming to common interfaces.
In the example I have created a simple interface for a class with one method that returns a String. The implementation of that interface can then be determined at run time.
I’ve created a new Android application, and two Android library modules in my project. All three of those modules contain that interface in their source code.
Important note, the main Android application does not contain references to either of the libraries in it’s build.gradle. So neither of those modules are compiled into the main Application’s bytecode.
In the main Application I’ve created a class for loading implementations of that interface.
This ModuleLoader class takes the path to dex file containing dex bytecode, and loads it’s implementation of the IDynamicModule interface.
Update: I noticed my original implementation worked on newer devices, but crashed with a null pointer on older devices. DexClassLoader documentation says cache dir is no longer needed, but it will crash on older SDKs if you pass null for the cache dir.
Note; this file can’t be Java bytecode it must be Dalvik bytecode. You can create a dex file easily from a Java jar using the following dx command:
Each of the library projects contain implementations of IDynamicModule. To build these libraries into Dalvik bytecode I used the following work flow;
- I clicked on the module in the Android view of the project tab in AndroidStudio and chose the option Build -> Make Module from the file menu.
This results in an aar file being created in the folder build/outputs/aar/
Sadly that aar file does not contain Dalvik bytecode. The classes.jar file contained with in it is Java bytecode. Further processing is needed to get the dex file you need.
Unzip the aar file, and locate file classes.jar. Run the dx command on the jar file to obtain a dx file. Learn Cordova online with the best Cordova tutorials to work more efficiently in android development.
Note: the dx command can be found in your build tools folder at
/build-tools/ /
To simplify this process for myself, I’ve added build tasks to the build.gradle for each of the dynamicmodules that do this and copy resulting dex file to the app module’s asset folder.
Running ./gradlew dynamicmodule:copyDexToApp will build and dex the first dynamicmodule and copy it to the assets folder of the app module.
In a true hot swap situation you’d instead be downloading the dex file from your server.
This is a custom task I’ve added to buildSrc which makes it available to all the build.gradle files in my project.
Loading the modules from the assets folder then is simply done in the example MainActivity:
The dex files need to be copied from assets first into the data directory for the application, then that file path can be used with ModuleLoader.
- Security: If you are downloading the dex file from a server, make sure you include a checksum so that not any dex file can be loaded into your app, and only accept code from a trusted source.
- Memory & Efficiency: Make sure you take care to dereference on all threads references to your ClassLoader when you are done with an implementation or are upgrading to a new version. The dynamically loaded classes will be garbage collected when the DexClassLoader you instantiate goes out of scope and has no references to it.
- Architecture: Keep your wrapping interface simple with very simple single entry points to make implementations more flexible.
- Android resources: Because what you are loading is just Dalvik bytecode take note that you can not include any string, layout or similar assets in your dynamic module, and will have to use alternative methods for dynamically loading that kind of data.
Источник
Виртуальные гигабайты оперативной памяти для Android. Что такое файл подкачки
В начале 2010-х годов были очень популярны приложения для так называемого «увеличения» объёма оперативной памяти в Android-смартфонах. Связано это было с тем, что устройства того времени обладали очень скромными техническими характеристиками, особенно если говорить об оперативной памяти — в лучшем случае на бюджетном аппарате пользователь получал 512 МБ ОЗУ. Происходило это увеличение при помощи SWAP. О том, что это такое, почему пользователю приходилось активировать его самостоятельно, и, самое главное, даст ли такой способ увеличения оперативной памяти пользу сейчас — далее в статье.
Что такое SWAP и почему в Android его не используют по умолчанию
SWAP в Android выполняет функцию виртуальной оперативной памяти — такой памяти, которая хранится в виде файла на накопителе устройства, но при этом используется в качестве оперативной. Такая память действительно работает и может быть полезной, если нужно одновременно работать с большим количество программ, но у неё есть и минусы: ухудшается отзывчивость системы и расходуется ресурс записи накопителя.
👨💻 Если углубиться в технические детали
Для начала стоит вспомнить, что Android — операционная система, которая основана на ядре Linux. При установке Linux на ПК, пользователю предлагается создать специальный раздел для SWAP, который служит как файл подкачки, аналогичный подобному в Windows, а также как место, в которое операционная система может выгрузить неиспользуемые в настоящий момент данные из оперативной памяти. Конкретно в Android SWAP является именно файлом и выполняет только второй сценарий — хранит в себе данные из оперативной памяти и отдаёт их, когда они внезапно оказываются нужны. Первый сценарий, очевидно, не используется по причине того, что в Android не существует режима гибернации (то есть глубокого сна при котором устройство выключается) как такового.
Помимо ядра Linux также стоит помнить и то, что Android в большинстве своём работает на устройствах, которые используют флеш-накопители памяти. А они, в свою очередь, обладают ограниченным ресурсом записи, чем накопители на жёстких магнитных дисках. По этой причине SWAP практически никогда не используется Android-устройствами по умолчанию, так как, из-за постоянных циклов перезаписи, накопители этих устройств могут выйти из строя намного быстрее, чем задумывалось. Конечно, это не значит, что смартфон не сможет выдержать и полгода при использовании SWAP, более того — большинство старичков, на которых использовался SWAP, живы до сих пор и отлично работают. Однако, производители решили перестраховаться и использовать zRam.
Альтернатива SWAP как файлу подкачки — zRam
zRam — специальный модуль ядра Linux, который, если говорить как можно проще, прямо в оперативной памяти сжимает неиспользуемые данные, когда они не нужны, и, соответственно, «разжимает», когда их нужно использовать вновь. Такой подход позволяет не расходовать ресурс флеш-накопителя на хранение там неиспользуемых данных и экономить оперативную память. В частности, именно с помощью zRam в Android реализована работа приложений в фоне. Если сжатие данных для какой-либо программы достигает пика (то есть ей долго никто не пользуется), то программа закрывается и ресурсы освобождаются.
Такое решение также работает более эффективно из-за того, что все операции с данными происходят непосредственно в ОЗУ. А, как известно, практически всегда ОЗУ работает намного быстрее даже встроенных флеш-накопителей, не говоря о SD-картах.
В каких случаях SWAP может быть полезен
Очевидно, больше всего SWAP будет полезен при использовании на устройствах с малым объёмом оперативной памяти — в современных реалиях таковой составляет 2-3 ГБ. В таком случае стоит создать SWAP размером от половины до полного одного объёма оперативной памяти смартфона.
Чем больше объём ОЗУ Android-устройства — тем меньше смысла использовать SWAP. На ПК при больших объёмах оперативной памяти SWAP обычно используется для режима гибернации, в смартфонах же его можно использовать в случае, если вы часто пользуетесь ресурсоёмкими приложениями и хотите, чтобы они как можно дольше оставались доступными из свёрнутого режима. Скорее всего, для такой задачи хватит половины от одного объёма ОЗУ вашего смартфона.
Если вы продвинутый пользователь и вам будет не лень экспериментировать, можно побаловаться со значением «vm.swappiness», который регулирует алгоритм использования SWAP (значение по умолчанию — 60). Он задаёт процент свободной оперативной памяти, при котором начинается использование файла подкачки. Чем больше значение — тем больше данных будет брать на себя SWAP, и, соответственно, тем дольше приложения будут оставаться в фоне, но слишком большие значения не самым приятным образом скажутся на отзывчивости системы и её быстродействии. Чтобы определить нужное значение, нужно поэкспериментировать, опираясь на свои приоритеты.
Как создать файл подкачки на Android
С годами в смартфонах становилось всё больше и больше оперативной памяти, что свело на нет нужду большей части пользователей использовать SWAP. Я уже рассказал о том, как файл подкачки может пригодиться в наше время — значит, нужно узнать, как его создать и использовать. Для этого есть специальные программы. Чтобы файл подкачки действительно работал, а не просто создался и лежал в памяти смартфона без дела, этим программам нужен ROOT-доступ. Сейчас в Google Play мне удалось найти только две программы, внушающие доверия:
Ранее существовало множество подобных приложений — я уверен, многим знакомо название «SWAPit! RAM EXPANDER», так как это одно из самых популярных приложений того времени. К сожалению, ровно как и большинство остальных таких программ, Ram Expander перестал получать обновления и сейчас, скорее всего, не работает на последних версиях Android.
В некоторых оболочках уже существуют встроенные решения по созданию файла подкачки
С недавних пор начали появляться новости о том, что производители начинают встраивать в свои оболочки функцию увеличения объёма оперативной памяти. Например, так поступила vivo, которая вместе с выпуском смартфонов X60 серии представила это нововведение для своей оболочки FuntouchOS 11. Помимо этого, такую функцию уже получила OriginOS и скорее всего получит MIUI 13.
Источник