[HN Gopher] Bare-metal Rust in Android
       ___________________________________________________________________
        
       Bare-metal Rust in Android
        
       Author : iamd3vil
       Score  : 193 points
       Date   : 2023-10-09 18:13 UTC (4 hours ago)
        
 (HTM) web link (security.googleblog.com)
 (TXT) w3m dump (security.googleblog.com)
        
       | ireallywantthat wrote:
       | Ok, now enable us to let create Android Applications entirely in
       | Rust (including the GUI). Let's get rid of Kotlin/Java monopoly
       | in Android App development. Shall we?
        
         | grishka wrote:
         | You can technically create an Android app without any Java
         | code. There are native APIs for graphics and input. However, as
         | these are intended for games, you get a window into which you
         | can draw... something. With OpenGL, for example. You don't get
         | access to Android's regular UI framework. You will also have to
         | go through the Java layer to do many things you might want to
         | do -- like requesting permissions or launching other apps'
         | activities.
         | 
         | Here's all the APIs you get:
         | https://developer.android.com/ndk/reference?hl=en
        
           | flohofwoe wrote:
           | You can call into any Android Java API from native code using
           | JNI. It's not exactly convenient, but you are not limited to
           | the C APIs exposed by the NDK.
        
             | grishka wrote:
             | Many Android APIs expect you to extend classes and
             | implement interfaces for things like callbacks. You can't
             | do that with JNI alone, you will have to have a .dex of
             | your own anyway.
        
           | izacus wrote:
           | That's not really what's going on. Those "native" APIs you
           | mention in most cases just call back to Java APIs under the
           | hood. For better or worse, most of what Android is is written
           | in Java. There's no hidden "C++" layer of Android to access.
        
           | nologic01 wrote:
           | You can also "outsource" the Java based interaction with
           | Android to somebody else, Qt style?
           | https://doc.qt.io/qt-6/android-getting-started.html
        
         | rohandhruva wrote:
         | Tell me you've never done any Android development, without
         | telling me...
         | 
         | This is such a low-effort "take" without any effort to justify
         | _why_ you'd want something like this. There's a high amount of
         | impedance mismatch trying to write GUIs in a non-GC language
         | like Rust which _has_ to run on what's essentially a Java VM
         | (ART).
         | 
         | At least with a language like Go, it somewhat makes sense, and
         | has been attempted: https://gioui.org/
         | 
         | All this Java/Kotlin bashing is getting really old, especially
         | for a forum like this one.
        
           | lcfcjs wrote:
           | [dead]
        
           | jeroenhd wrote:
           | There's a reason Chrome is mostly written in C++. Android's
           | JVM system is a collection of Java wrappers around C++
           | libraries. There's some overhead in that translation layer,
           | and it's unfortunate that you can't skip it. Even Google's
           | own Flutter uses a C++ engine to run Dart applications.
           | 
           | Kotlin (and Java) is fast enough for many applications, but
           | even with the recent advancements in ART, does have overhead
           | compared to pure native code. I can't think of a reason why
           | the API interaction overhead would pose a problem, but if
           | Google themselves can find use cases for almost JVM-less
           | apps, I'm sure there are reasons to give a Rust version a
           | try.
        
             | izacus wrote:
             | > Android's JVM system is a collection of Java wrappers
             | around C++ libraries.
             | 
             | This isn't even remotely true and it's obvious if you'd
             | ever looked closely at Android. This take is as bizarre as
             | saying that whole web/JS/React ecosystem is "just" wrappers
             | on top of Skia.
        
           | ForkMeOnTinder wrote:
           | > At least with a language like Go, it somewhat makes sense,
           | and has been attempted: https://gioui.org/
           | 
           | Gio UI is an immediate-mode UI, and immediate-mode UIs map
           | very nicely to Rust. egui is quite expressive and easy to
           | use. https://www.egui.rs/
           | 
           | If you had pointed at something like GTK, then yes, there is
           | a big impedance mismatch there.
        
           | ireallywantthat wrote:
           | I didn't bash Java/Kotlin. In fact, I have written few
           | android apps in Kotlin, Java and I also have fiddled with
           | Jetpack compose, JNI and NDK (I have also played with mpv's
           | Opengl/Vulkan's rendering on Android if that matters to you).
           | I don't want to share the projects of mine because i don't
           | want to reveal my identity.
           | 
           | > https://gioui.org/
           | 
           | I know that tailscale's android application is written in it
           | but i don't think gioui is great for android apps.
           | 
           | > Tell me you've never done any Android development, without
           | telling me...All this Java/Kotlin bashing is getting really
           | old, especially for a forum like this one.
           | 
           | Ok, this one hurts. Why are you attacking me instead of
           | defending your stance. All are allowed to have opinions and I
           | am allowed to have one(It's sad to explain this to someone on
           | forum like this one). I dream of Linux-desktop kinda
           | situation where you can program in any language you want,
           | where you are not hindered by any platform/framework, where
           | you have complete freedom and where you don't want to be
           | bothered/(vendor locked-in) by Bigcorps(looking at you Google
           | services framework).
           | 
           | > write GUIs in a non-GC language like Rust which _has_ to
           | run on what's essentially a Java VM (ART).
           | 
           | Haha, non-GC languages power the GUIs on Android fyi. Jetpack
           | compose is powered by Skia. Chromium is powered by Skia. Skia
           | is C++.
           | 
           | Please do your own research before commenting low-effort
           | replies.
        
             | izacus wrote:
             | He's attacking you because you're spewing things that are
             | fundamentally misguided without even seeming to try to look
             | at basic structure of how Android is put together.
             | 
             | Show some basic ability if you want people to engage with
             | your takes, there's already too much ignorant opinions
             | spewed out with assumed authority on this site.
        
           | voxl wrote:
           | What does a GC have anything to do with it? You can reference
           | count all the pointers if you want, you can expose JVM
           | pointers in Rust where Rust doesn't manage the heap memory.
           | There are plenty of easy solutions to work with the JVM
        
             | ncruces wrote:
             | If you're willing to work with the JVM (i.e. through JNI),
             | there's really nothing stopping you.
             | 
             | You can 100% make entire apps using nothing but C, C++, or
             | whatever, as long as you're willing interface with the JVM
             | that's created for you to access Android APIs.
             | 
             | But the Android API is a JVM API. There's no getting around
             | that. At this point, it's another OS (i.e. not Android) if
             | it doesn't have Java in it.
        
         | azemetre wrote:
         | Isn't this what Tauri wants to achieve? At least it's on the
         | roadmap I mean.
         | 
         | https://tauri.app/
         | 
         | Does anyone have any experience creating production apps with
         | Tauri? Seems like a sane alternative to Electron, especially if
         | they can target all major platforms and keep the promise of
         | smaller footprints.
        
           | asrael_io wrote:
           | Not quite production, but I was on a paid contract on a PoC.
           | I would say back at 1.0, mobile was pretty painful and
           | signing of any binary dependencies was up to you. It looks
           | like they addressed signing in 1.5 and I haven't picked it
           | back up to check out the mobile experience.
        
           | flohofwoe wrote:
           | The traditional alternative to Electron on mobile platforms
           | is Capacitor (which uses the system webview, so in that sense
           | it's closer to Tauri):
           | 
           | https://capacitorjs.com/
           | 
           | (fka Apache Cordova, fka PhoneGap)
        
         | Vt71fcAqt7 wrote:
         | You can already. The ndk allows any language to be compiled to
         | android. For rust see
         | 
         | https://github.com/rust-mobile/ndk
         | 
         | Which has the tools to do this.
        
         | wredue wrote:
         | What would rust achieve aside from just enabling another,
         | entirely distinct from the existing workflow, language?
         | 
         | Haven't android apps been compiled to native code since like
         | 2012? (I actually don't know, I left android a while ago and
         | stopped caring what they do)
        
           | rstat1 wrote:
           | Not having to use Java or any of its weird derivatives.
        
             | smith7018 wrote:
             | I implore you to try Kotlin; it's a fantastic language and
             | is a wonder to code in
        
               | TheDesolate0 wrote:
               | [dead]
        
           | cogman10 wrote:
           | I don't think it's a good idea, mainly because android is
           | multiplatform and rust, by it's nature, is only available for
           | what it's built for. Unless you are giving google your rust
           | code to compile, your app will be limited on it's reach.
           | 
           | All that said.
           | 
           | Rust doesn't have a GC so it'd (likely) have a lower memory
           | consumption and could possibly be lighter on the CPU.
           | 
           | Native compilation helps mainly with startup time and memory
           | consumption. It's not exactly great for runtime performance
           | as it takes away some key optimizations.
           | 
           | Another benefit of rust assuming you are distributing
           | binaries is you'll be able to use the latest version of Rust
           | rather than being pinned to older versions of the SDK with
           | partial support based on the whims of google.
        
             | galangalalgol wrote:
             | VM warmup isn't consistently a thing, in fact for over a
             | decade there has been plenty of observation of the reverse,
             | that runtime optimization often slows performance. Systems
             | languages (c/c++/rust) consistently outperform warmed up
             | managed languages. And that is ok, it doesn't mean we
             | shouldn't have managed languages, but they are slower.
        
               | pjmlp wrote:
               | Managed languages also exist in AOT with PGO data.
        
             | flohofwoe wrote:
             | > Unless you are giving google your rust code to compile,
             | your app will be limited on it's reach.
             | 
             | Android has supported native code in apps for a long time
             | via the Android NDK, mainly to enable game development. The
             | Android team seems to hate the NDK, but the alternative is
             | to have no games on the platform, so they can't simply kill
             | it.
             | 
             | > ...[native] ... It's not exactly great for runtime
             | performance as it takes away some key optimizations.
             | 
             | In _theory_ a JIT might produce better runtime performance
             | than AOT compiled code, but in practice that usually turns
             | out as wishful thinking.
        
               | pjmlp wrote:
               | Thankfully ART not only uses JIT, it also has an AOT
               | compiler with PGO data shared across all devices in the
               | ecosystem via the Play Store.
               | 
               | In practice, people should learn how Android actually
               | works.
        
             | shopvaccer wrote:
             | >mainly because android is multiplatform and rust, by it's
             | nature, is only available for what it's built for
             | 
             | Android is one platform: android. I thought rust worked
             | across multiple operating systems.
             | 
             | >Rust doesn't have a GC so it'd (likely) have a lower
             | memory consumption and could possibly be lighter on the
             | CPU.
             | 
             | So what? I have never used G.C.
             | 
             | >Native compilation helps mainly with startup time and
             | memory consumption. It's not exactly great for runtime
             | performance as it takes away some key optimizations.
             | 
             | That is fair I suppose
             | 
             | I think the main benefit of rust/c++/ndk on android is that
             | I can just port desktop programs and I don't have to learn
             | android's java/kotlin and sdk.
        
               | wiseowise wrote:
               | > Android is one platform: android. I thought rust worked
               | across multiple operating systems.
               | 
               | Operating systems, not architectures. You'd have to
               | cross-compile your application 4 times if you want to
               | support all arms and x86s.
               | 
               | > I think the main benefit of rust/c++/ndk on android is
               | that I can just port desktop programs and I don't have to
               | learn android's java/kotlin and sdk.
               | 
               | It's not "just" port desktop programs. Android doesn't
               | even use glibc.
        
         | [deleted]
        
         | wiseowise wrote:
         | Why?
        
       | 1f60c wrote:
       | Ideally, Android wouldn't have any security vulnerabilities, but
       | that's not realistic. Rust won't prevent every bug (and it's even
       | possible to cause segmentation faults in an ostensibly safe
       | language like Python), but "better" is still a huge leap forward.
        
         | kupopuffs wrote:
         | just.... no more buffers overflown
        
       | jiripospisil wrote:
       | Is there similar effort from Apple?
        
         | monocasa wrote:
         | I don't believe Apple has embraced Rust the same way Google
         | has. Particularly their firmware is still very based on C.
        
           | dagmx wrote:
           | Specifically a dialect called Firebloom (supposedly anyway)
           | 
           | https://saaramar.github.io/iBoot_firebloom/
        
             | jonpalmisc wrote:
             | Firebloom is more of a custom compiler/toolchain than a
             | dialect of C--apart from annotations to relate
             | pointer+length parameters, etc., it is still just C.
        
               | jd3 wrote:
               | Reminds me of this blurb from djb's qmail security
               | guarantee [0]:
               | 
               | > I've mostly given up on the standard C library. Many of
               | its facilities, particularly stdio, seem designed to
               | encourage bugs. A big chunk of qmail is stolen from a
               | basic C library that I've been developing for several
               | years for a variety of applications. The stralloc concept
               | and getln() make it very easy to avoid buffer overruns,
               | memory leaks, and artificial line length limits.
               | 
               | [0]: http://cr.yp.to/qmail/guarantee.html
        
             | mrpippy wrote:
             | Possible related to the '-fbounds-safety' feature they've
             | proposed for Clang
             | 
             | https://discourse.llvm.org/t/rfc-enforcing-bounds-safety-
             | in-...
        
               | jonpalmisc wrote:
               | Firebloom == `-fbounds-safety`
        
           | jonpalmisc wrote:
           | The other commenter mentioning Firebloom is correct that some
           | firmware (iBoot family) has been using C w/ Firebloom
           | extensions for a while. Parts of SEPOS also use Swift, which
           | would make more sense as a non-C language than Rust, from
           | Apple's perspective at least.
        
         | pjmlp wrote:
         | Apparently people keep forgetting Swift exists.
         | 
         | "CppNow 2023:Introducing a Memory-Safe Successor Language in
         | Large C++ Code Bases"
         | 
         | https://www.youtube.com/watch?v=lgivCGdmFrw
        
         | candiddevmike wrote:
         | What benefit would Apple get from this? They want you all in on
         | an ecosystem they control.
         | 
         | EDIT: Thought OP was talking about writing iOS apps using Rust.
        
           | steveklabnik wrote:
           | Apple does use Rust, though from job postings, we can infer
           | it's more like network services than firmware.
           | 
           | Regardless though, I don't see how the implementation
           | language of your firmware is locking you into a specific
           | ecosystem, so this criticism seems misguided to me.
        
       | SuaveSteve wrote:
       | The Doom of programming languages? Rust must be run everywhere
       | with no irony.
        
         | asrael_io wrote:
         | Yeah but does Doom run on rust-analyzer?
        
           | gpm wrote:
           | Rust analzyer type checks rust and type checking is turing
           | complete... it's only a matter of time.
        
         | [deleted]
        
       | theusus wrote:
       | I found adoption of Rust being slow, but it has started to grow.
        
       | az09mugen wrote:
       | I may have wrong assumptions, but I find it funny they didn't use
       | Golang. Is it not capable of doing the same thing ? Anyway, happy
       | to see rust being adopted for that usage.
        
         | izacus wrote:
         | No, Go isn't appropriate for these things. Use the best tool
         | for the job
        
           | digdugdirk wrote:
           | Can you please explain why Go isn't appropriate here?
        
             | sangnoir wrote:
             | Binary size, for one. The blog mentions a binary file grew
             | from 220kb (C) to over 400kb (Rust).
             | 
             | I also doubt a garbage-collected language work very well
             | for drivers that require precise timing (MMIO) and/or
             | control over memory allocation.
        
             | izacus wrote:
             | The non-JVM code used in mentioned context will run in
             | environments where yet another GC fighting the JVM GC isn't
             | desired or have to be a shared library talking to existing
             | JVM code. While you can use Go to build libraries with C
             | calling convention, it's not the most supported use case
             | and it shows in ergonomics. This also includes standard Go
             | types and standard library which don't fit nicely into a
             | model where code needs to talk a lot with JVM world.
             | 
             | It's possible... But it feels like screwing screws with a
             | knife. It's doable, but noone from the language designers,
             | stl designers and library developers are really thinking
             | about that use case.
             | 
             | Rust on the other hand fits very well into the model where
             | it needs to be just a piece of a bigger whole - it's been
             | built that way ("system" programming language) and it
             | doesn't come with GC that will fight with JVM or Binder
             | lifetimes, compatible type system and plenty of libraries
             | that help develop libraries on an embedded platform. When
             | building the language, Rust designers consider this as one
             | of the main use cases of the language and it shows with how
             | much less hassle it is to work with.
             | 
             | The fact that it easily fits into existing C/C++ codebases
             | helps too.
        
             | pix128 wrote:
             | Go is garage collected
        
       ___________________________________________________________________
       (page generated 2023-10-09 23:01 UTC)