Is Native App Development Really Native?

A few years back, a colleague of mine was talking about React Native (when it is the shiz) and he was trying to explain to me, that it React Native creates Native Applications. While this sounds good, I had to try and help him understand, this is not true. Not in the way he and many other believe, at least. Let's talk about Native Mobile Apps and why they aren't what the average App Dev thinks they are.

A little about React Native.

Ok, react native had this huge surge of popularity, and it seems to be a well supported, and nifty "stack" to develop a mobile application with. However, it is wildly misleading to huge amounts of developers using it. On their homepage, claiming "Native Development for Everyone" While this sounds good, it is an outright lie.

Not "Truly Native" as they claim.

In the previous image from their site, you will see "React Native lets you create truly native apps..." Wow, this sounds amazing! You get to create "Truly Native" apps without writing messy C or C++ code, managing memory, or compiling to machine code.

😮 Oh, wait what was that? Not compiling to Machine Code.

So how is this possible? How can it be a "Native App", but it not compiled into "Native" Machine Code. In fact if you don't believe me, here is a screenshot a little lower on the same page.

Even on the very same page, they say the exact opposite. Saying "No more waiting for native builds..."

I guess what they mean is, your app will be an App Package or Bundle 😐! but Not Compiled to Machine Code as they seem to imply.

How can this be Truly Native, but not compile?

💡 Okay, First I think Facebook and the ReactNative Community as well as Web Developers and Mobile Application Developers don't mean Native, when they say Native.

To me this is a problem, maybe people think it doesn't matter so muck "tomato", "tomauto" WHATEVER!! However, the semantics are important. What is language if not a series of writing and sounds, with a mutually understood and agreed meaning to facilitate communication. It is paramount that we use the same language to describe technology, applications, stacks, and frameworks.

What are the Types of Mobile Applications?

  • HTML/JS/CSS (Website, WebFrame)
  • Interpreted Local Application (React Native, Lua Apps, etc)
  • VM Interpreted Java (Android JIT | SDK, iOS Interpreted or AoC)
  • Native Code (C, C++, Pascal, Swift, Objective-C, Go, etc.)

🤦‍♂️ The confusion really comes in that in most Mobile App developer minds, they incorrectly think that anything lower level than a "WebFrame" App (which is simpley a website loaded into a super simple browser) is called native. But, they are just plain wrong!

If React Native is not Native, what is it?

Well, here is the sad truth. React Native is Interpreted JavaScript (not battery friendly at all) but instead of using HTML and CSS for the UI layer, it converts your UI code, into calls to the Native UI Library.

Your UI is in fact rendered by the Phone's Native UI Library 😁, this is a Huge advantage over the HTML and CSS UI, but does not make your App "Truly Native"

Your application logic written in Javascript is still just Javascript. On Android, it is JIT-compiled as best it can be (JS is not easy to compile) However, on iOS it must be Interpreted, as iOS does not allow JIT Compiling on the device. All iOS Apps are Static Linked, and either Compiled or Interpreted, nothing in-between.

Before you go on a rant saying I am an idiot. Here it is in their own documentation. https://www.reactnative.guide/3-react-native-internals/3.1-react-native-internals.html

Please all you web developers, wanting to make "Native" Mobile Apps, please RTFM and don't go starting flame-wars 🔥 about how your apps are native. Just because Native is in the name of your "Tech Stack"

Do you want a Native Application?

If you are looking for a Truly Native application, without the constant Compile Side-Load process during development, and you are not looking for an interpreted App on iOS, then you only have one choice.

Dart/Flutter - is the only language and stack that I have seen, using a modern garbage collected language which is actually compiled, but also has a VM (Interpreter) for Development.

When you build a "Release" of your application, it will actually compile to the Target Machine Code. 👍

Let's stop incorrectly calling Interpreted applications "Native Apps", they are local, but a far cry from Native. Even Java Apps on Android are not Native.