It's because it doesn't contain anything. You can't even see any UI, let alone emails without being connected to the internet.
EDIT: just realized the app is a web view. Sigh
So now I just add a 150 megabyte dummy file at everyone else’s expense
I’m sure there is a lot of that going on given how long some job roles were open, I have to imagine that every mobile developer on the market may have passed through and made the same conclusion!
This judges the prospective employer more than it judges the candidate, doesn't it?
This is actually nothing new. Back when I was at uni some students claimed to do the same, adding code that served no purpose to inflate the resulting program executable size.
And if my memory serves me well, at this time when windows was still young and software was swapped around on floppies, software sizes started to skyrocket and I've heard then that the secret reason for this lack of care was that size was the easiest way to impress users and the tech press (all while making piracy more inconvenient).
Easy to say, rhetorically suggesting that its revealing a toxic mangement environment, but no, not really. My experience has been overwhelmingly positive with great teammates and great managers, and a hiring decision maker that was otherwise completely hands off of what I was doing for the rest of the project. A hiring decision maker that probably left within 3 - 6 months of me joining, or who was randomly called to do an interview last minute and had arbitrary evaluation metrics. Maybe that is what you mean, but it had nothing to do with the day to day experience, once on board I found every place to be very similar with the mobile team pretty much on autopilot, which is the desired experience. Even quicker paths to leadership roles and higher compensation.
They all have interesting-enough projects at the time, or fulfilled some other interest of mine, or money without being a bad environment. Interview gaffs really don't carry as much weight as people think, it requires a special kind of privilege to think it matters that not all of us have or had.
In a rather successful business I had, I had a product of a few 100kb which installed easily on servers; just ./install.sh. Someone told me that this was really not smart. The script downloaded it’s dependencies (just rpm install; nothing proprietary) and then it copied the binary to /use/local/bin. I figured I could fix 2 issues at once; people running other distros complained that it did (obviously) not work; in our target audience, well over 90% ran rpm based distros, mostly centos. This was before Docker etc so I changed the install to apt-get and included a zipped chrooted Debian with everything already installed in it. Suddenly install.sh was over 100s of mbs and worked on any x86 Linux. It indeed made sales jump with people saying in forums that ours was bigger than even the largest competitor install download so it must be better. It is lame but true; especially when people pay for stuff, they want to get bang for their buck.
Their server returns results instantly but found that if they showed a loading animation (even fancy ones like an animated svg or gif of a cartoon passenger in an airplane) that people trusted the results more
Not to mention the billions of devices in the world which are running old OS versions with scant memory capacity.
are not the rich or loose-walleted people that app sellers and advertisers care about.
But for most employers they just need presence, almost nobody was breaking even on apps they just needed the presence on the app stores. Big waste of money for most, and for most projects I was pitched
No one can tell me that our species can write 1K ZX Chess (https://en.wikipedia.org/wiki/1K_ZX_Chess) – an entire chess game with intelligent opponents which only takes up 672 bytes – and yet we can't write an email client which isn't a million times that size.
But a lot of these webview kind of apps just download the whole thing anyways, so it's literally just a matter of if the bytes are classified under "application size" or "cache" by the OS.
(Precisely so they have the whole thing available for when you need to use it offline)
When it comes to the code, the reason that they are bigger is how apps are distributed and have isolated runtimes. There are several commonly used sdks and libraries but because of how mobile app distribution works, these common libraries have to be bundled with each app and are not installed as a reusable library (like you can do with Linux, for example).
The issue is that the Gmail app isn’t just an email client, it does way more than that. That doesn’t excuse the abusive behavior, but it does explain it.
All of that isn't needed on regular accounts, I guess, but it's probably easier for them to ship it as one app because people might get confused/are able to switch between their workspace and regular accounts in the app. Gmail is also supposed to be the "hub" to workspace on their new Desktop UI.
What annoys me much more than that is that Docs, Sheets and Presentations all are multi-hundred megabyte standalone apps, of which I'm guessing 80%-90% of the code is identical/pulled in from some non-shared library.
You don't want a situation where someone updates App A, it updates a lib, then App B breaks because it hasn't been checked against the new library. I know you are a good developer who would check that, use major / minor library versions correctly etc. but there are lots of developers on the App Store. Or the fun case of updating App A, it updates a lib and then magical new features appear in App B that Apple doesn't like.
You'd probably have to use some sort of strict library versioning system where every app version is tied to a very specific library version. Are developers in general going to be disciplined enough to actually keep their apps all in sync on a specific version so older versions of the libraries can be removed? Or does this just mean every app from a developer will end up having its own slightly different revision of the lib tied to them? If it's the latter its probably not worth Apple's time adding all the complexity to manage the libraries to the App Store system.
[Not really, Nix integrates a build system into the process, and there was prior work I can’t remember that was binary-only and so closer, but the essence of the idea is very similar.]
If you don't mind explaining what splitting a package and de duplicating the download is, and how it prevents the issue I mention that would make me learn something :)
Start with a setup where you're packaging all dependencies with your binary, dynamically linked.
Then, instead of a single zip file, put each dependency in its own zip, or even each file in its own zip. But each release is still a full set of specific files. You never refer to a dependency by name or version. That's too clever and fragile.
If two releases of two separate programs happen to share the same exact file, then you only need to download it once.
Words like "compatible" and "semver" have no meaning to this system, because you only deduplicate the exact same file. You save space if a developer reuses code correctly, but otherwise there are no visible side effects and no bugs.
The iPhone 11 Pro Max, a $1100 phone from late 2019, still had 64gb as base storage...
My own view is they burnt people out install allo, hangouts etc, and people DO install gmail / have gmail accounts -> so they are going to try to leverage that for distribution a bit more.
Picking a default handler for a given scheme seems like a problem best solved at the OS level, and I don't even know how an app developer would be able to fix that.
Coincidentally, the methods used for this today in macOS (in apps that prompt to set themselves as the defaults, or populate a drop-down) are deprecated.
You do if it is also your video chat app. If not, decline permissions.
They do exactly the same thing on Android - Gmail has it all by default, if you want them separate, you can get them from the play store.
[0] Fastmail: smallest of the apps but still could have room for improvement, could save almost 20% of the app size by optimizing their audio files. 71% of the app is the binary. Check out the X-ray here: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
[1] Gmail: looks like most of their bloat is coming from localizations. Only 60% of the app is binary, while 24% is localization files. Check out the X-ray here: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
[2] Outlook: could be stripping binary symbols to save significant space. 65% of the app is binary, while 14% is localizations. Check out the X-ray here: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
[3] Hey: could save about 15% of the size of the app just by removing duplicates and optimizing their images. 45% of the app is binary, 27% of the app is assets, this is definitely higher than it should be. Check out the X-ray here: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
[4] Protonmail: could save almost 30% just from image optimization and duplicate removal. 58% of the app is binary, 14% is assets, and 7% is localizations. Check out the X-ray here: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
Unfortunately this is a very common problem as many teams don't have any monitoring in place. Here's another example of a popular email app Spark, automated insights show over 100 MB of easy savings: https://www.emergetools.com/app/example/spark?buildContent=i...
For pretty much every app here, Emerge's insights found at least 20% in easy size reduction. FYI, in the X-ray visualizations, red indicates duplicates and we can breakdown apps even further using builds with dSYMS!
Those seem to be the biggest consumer of storage for me.
Yelp also has a large exports section for the main app binary, that's usually a sign of a problem because the main binary doesn't need to export any symbols, only frameworks do that.
Twitter has a handful of 4MB images, much bigger than images you'd expect in an app. I took a look at a few of these and they are just gradient background images that could have been drawn with something like core graphics to completely eliminate the need for an image.
Twitter: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
Yelp: https://emergeassets.s3.us-west-1.amazonaws.com/Screen+Shot+...
Most people just see text, and not the complexity that supporting all of that text requires. Most computers from 20 years ago could barely handle it, and you can forget about doing it on the computers from 40 years ago.
There are plenty of other features that have invisible complexity too.
The article we’re all discussing talks about the symbols as if they are completely unnecessary, but that may not entirely be true. They are certainly unnecessary to _run_ the app, but it is probable that all of the error reporting and logging done by the app uses those symbols to explain where the errors and log messages came from. This makes it possible for the developers to actually fix problems. Granted, they could strip those symbols from the distributed app while still keeping them available to developers, but unfortunately that’s easier said than done.
One of the few ways that developing on Windows is better than on other platforms is that MSVC makes it very, very easy to build a symbol server that collects all of the symbols from all of the applications you have released. If you get a minidump from one of your programs crashing, it will automatically load the correct symbols from the symbol server, as well as the correct version of the source code. It will even download symbols for Windows itself, to make those dump files as easy to debug as possible. Linux is only very gradually gaining similar features. and I have no idea about Android or ios.
When I was programming for DOS, if I wanted to write to the screen in color I had a few options. I could use Borland's conio.h, I could invoke INT 21h and rely on ANSI.SYS to render my color, I could use INT 10h to write a character at a time in the color I want, or I could write directly to screen memory. Writing directly was really the only way to get the performance I needed, but it added complexity, since I needed knowledge of the hardware I was running on (not all video adapters map character cells to segment B800h).
Today, for a similar "text mode" application, I can use ncurses, or I can write CSI codes directly to the terminal. I can write in C or Python or even Javascript. There are more moving parts, but it would be less work to dust off my old 386SX than it would be to get those moving parts out of the way.
No matter what, I'm always going to do the minimal amount of work I need to get the desired result. If someone comes up with a way to do less work and get better performance, that's the ticket to high speed.
When I was a Windows user, a video player install of more than 80MB would be slightly bloated.
Today my OpenBSD install uses less than 3GB and it has far more stuff than a phone install.
Golang binaries are like 5-15x the size of a dinamically linked C binary, yes, but at least they provide everything and run everywhere.
Actually, over time I’ve split out a lot of code into libraries, so the app itself is down to ~70kLOC. Which is a normal amount of complexity for something like this. It has to handle notifications, chat formatting, avatar parsing and display, a ton of different UIs for configuring all the different options, etc.
· ~15kLOC bouncer internal protocol code
· ~1kLOC local caching + persistence
· ~40kLOC state handling and UI
· ~13kLOC fixing android bugs and compatibility with older versions
With the split, that moves 24kLOC into the internal protocol lib. Another ~100kLOC are now generated at build time through ksp (a type of macro preprocessor for kotlin).
Further breakdown of the UI part:
· ~7kLOC XML layouts
· ~7kLOC included default settings
· ~7kLOC Chat UI Code
· ~5kLOC Settings UI Code
· ~3kLOC Setup and initial configuration wizard
· ~10kLOC background processes, notifications, protocol handlers, etc
That said, what assets does an email client need beyond what I use as well?
Go makes both processes more user friendly. Statically linking with musl is simple in C (musl-gcc), but cross compiling is a bit of a pain the ass to set up (building your toolchain from the ground up). Not too bad, and if you're messing with building portable executable this kind of knowledge is assumed.
I once ported a shoddily written (by me) Python script to Go. About 400 LOC in Go. The compiled executable size was a whopping 7 mb!
This was more than I expected.
It turns out there's a reason for large executable sizes in Go [1], and apparently it can be made smaller.
[1] https://go.dev/doc/faq#Why_is_my_trivial_program_such_a_larg...
I wonder why the Gmail app is almost 4x the size on iOS.
https://mobilityarena.com/ios-apps-are-larger-than-android-a...
It supports your claim that iOS app sizes are 3-10x bigger than Android.
I wonder why. The article makes some guesses but still, the magnitude difference is significant.
Even Fastmail, which has the smallest iOS email app, is still 2x bigger on iOS (20MB) vs Android (10MB).
https://play.google.com/store/apps/details?id=com.fastmail.a...
- Gmail (397MB) [1]
- Outlook (328MB) [2]
- Hey (69MB) [3]
- Protonmail (128MB) [4]
[0] https://apps.apple.com/us/app/fastmail-email-calendar/id9313...
[1] https://apps.apple.com/us/app/gmail-email-by-google/id422689...
[2] https://apps.apple.com/us/app/microsoft-outlook/id951937596
[3] https://apps.apple.com/us/app/hey-email/id1506603805
[4] https://apps.apple.com/us/app/protonmail-encrypted-email/id9...