Google пишет и переписывает части Android на Rust, чтобы повысить безопасность ОС в целом по сравнению с C и C++. Читайте дальше, чтобы узнать больше!
Android как комплексное решение для ОС включает в себя множество движущихся частей. В широком смысле, этими частями являются экосистема приложений, а затем сама ОС. Как разработчик, выбор языка программирования зависит от того, над какой частью Android вы работаете. Для разработчиков приложений популярными вариантами являются Java и Kotlin. Для разработчиков, работающих над ОС и нижними ее уровнями, C и C++ до сих пор были популярным выбором. Сегодня Google добавляет третий вариант для разработчиков ОС, поскольку проект Android с открытым исходным кодом теперь поддерживает язык программирования Rust для разработки самой ОС.
Ограничения C и C++
Для более низких уровней ОС Android требуются языки системного программирования, такие как C и C++. Эти языки предоставляют разработчикам контроль и предсказуемость, что важно при доступе к низкоуровневым системным ресурсам и оборудованию.
К сожалению, C и C++ не обеспечивают гарантий безопасности памяти, что делает их склонными к ошибкам и уязвимостям безопасности. Разработчик отвечает за управление временем жизни памяти на этих языках, но в сложных и многопоточных кодовых базах это легче сказать, чем сделать.
C и C++ вместе составляют десятки миллионов строк кода на платформе Android. Эти ошибки безопасности памяти становятся наиболее трудно поддающимся устранению источником некорректности кода, составляя около 70% серьезных уязвимостей безопасности Android. Простого исправления этих ошибок становится недостаточно для решения проблемы, и лучшим подходом было бы в первую очередь предотвратить их.
Отсутствие гарантий безопасности памяти вынуждает разработчиков запускать процессы Android в жестко ограниченных и непривилегированных песочницах. Но песочницы требуют больших ресурсов, требуют дополнительных затрат и приводят к задержкам. Песочница также не устраняет полностью уязвимости кода, а ее эффективность снижается из-за высокой плотности ошибок, что дополнительно позволяет злоумышленникам объединять несколько уязвимостей в цепочку.
Другое ограничение, хотя и не уникальное для C и C++, но применимое ко всем проблемам безопасности памяти, заключается в том, что ошибочное состояние должно фактически запускаться в инструментированном коде, чтобы его можно было обнаружить. Таким образом, даже если ваш код прошел отличное тестирование, настоящая ошибка может остаться незамеченной. А когда ошибки обнаружены, их исправление — это еще одна задача, требующая длительного и дорогостоящего процесса, который не всегда может привести к правильному исправлению. Таким образом, обнаружение ошибок становится ненадежным, и в свете этих ограничений лучшим подходом является предотвращение ошибок.
Именно здесь на сцену выходит переход на безопасный для памяти язык, такой как Rust.
Ржавчина и ее преимущества
Rust обеспечивает гарантии безопасности памяти, используя комбинацию проверок во время компиляции для обеспечения соблюдения срока жизни и владения объекта, а также проверок во время выполнения, чтобы убедиться в правильности доступа к памяти. Эта безопасность достигается при обеспечении производительности, эквивалентной C и C++. Rust также снижает потребность в песочнице, предоставляя разработчикам больше места для внедрения новых функций, которые более безопасны и требуют меньше ресурсов.
Хотя у Rust действительно есть свои преимущества, невозможно в одночасье переключить всю ОС Android на Rust. И в этом может даже не быть необходимости, поскольку большинство ошибок памяти Android возникает в новом или недавно измененном коде, причем около 50% из них существуют менее года. Google считает, что ее усилия по созданию языков, безопасных для памяти, лучше всего сосредоточить на новых разработках, а не на переписывании зрелого кода C и C++.
Rust также фокусируется на предотвращении ошибок, а не на их обнаружении, что приводит к повышению корректности кода. Он имеет несколько ключевых функций, таких как безопасность памяти, параллелизм данных, более выразительные системы типов, неизменяемость. ссылки и переменные по умолчанию, более безопасная обработка целых чисел, лучшая обработка ошибок в стандартных библиотеках и многое другое. более.
Что означает переход на Rust для Android?
Google сообщает, что добавляет поддержку Rust в проект Android с открытым исходным кодом в течение последних 18 месяцев. Но добавление нового языка на платформу Android — это огромная задача. Некоторые цепочки инструментов и зависимости необходимо поддерживать, инфраструктуру тестирования и инструменты необходимо обновлять, а разработчиков необходимо обучать.
У Google есть несколько ранних проектов, о которых они поделятся в ближайшие месяцы. Но даже в этом случае становится ясно, что расширение поддержки Rust на большее количество ОС — это многолетний проект.
Судя по тому, что мы видим, Google уже использует Rust в нескольких местах. Новый стек Bluetooth в Android переписан под кодовым названием "Габельдорше" пишется на Rust. Работа над Gabeldorsche началась примерно во время выхода Android 11, но до сих пор не используется. Android Хранилище ключей 2.0 Модуль написан на Rust, как и часть пользовательского пространства связывателя, драйвера IPC для Android. Хотя это и не связано с Android, Фуксияновый стек сетей также пишется на Rust.
Для разработчиков приложений этот переход ничего не меняет в том, как вы, как разработчик приложений, пишете приложения или как работают API-интерфейсы платформы. Этот переключатель влияет только на то, как написана ОС. По словам члена команды по связям с разработчиками AndroidGoogle также не планирует в данный момент выпускать Rust NDK. Поддерживаемыми языками разработки приложений по-прежнему будут Kotlin, Java, C и C++.