[HN Gopher] How Uber Deals with Large iOS App Size ___________________________________________________________________ How Uber Deals with Large iOS App Size Author : rakingleaves Score : 133 points Date : 2021-02-26 17:42 UTC (5 hours ago) (HTM) web link (eng.uber.com) (TXT) w3m dump (eng.uber.com) | danpalmer wrote: | I'd like to see Apple expose more control over their app thinning | technologies. | | Currently they only deliver the binary for the device's CPU, and | only the assets for the device's asset class. There's then some | tech targeted at game devs for on-demand assets for things like | game levels that you don't need all of on device at one time. | | I suspect the limitations of this are around the binary not being | subject to this, but maybe it could be. I can see a couple of | options, one is some way of extending the asset classes to code | features, so that the App Store doesn't have to download iPad | screens for iPhones, etc. Perhaps this could be extended with | either App Store account region or locale so that, Uber in this | example could not include the Venmo SDK outside of the US where | no one has heard of Venmo. | | Or perhaps Apple could extend the on-demand assets to allow for | some sort of plugin system, perhaps backed by Swift Packages, | such that apps can on-demand decide they need the Venmo SDK | because they're in the US, and download just that. I don't think | we want a generalised package manager here, I don't envision that | SDK coming from Venmo directly, but allowing an app author to | upload all their separate packages if they want to. | | With feature heavy, international apps such as Uber I'd expect | this to dramatically improve things. I'm not sure whether this | benefit would translate to that much demand across the whole App | Store though as I think this matters more to a very few big apps. | Apple is at that optimisation point in the iOS lifecycle though | so perhaps it's worth it to them. | novok wrote: | Well since on demand resources were made for games (lua is | specifically called out as 'ok'), I could imagine many games | also making their initial size far smaller if they used binary | code to make new levels or regions. Games are very large chunk | of the app store and it's revenue. | dmitriid wrote: | Complementary: This thread on Uber's transition to Swift that | almost broke them | https://twitter.com/StanTwinB/status/1336890442768547845 | | Includes, among other things: forcing Apple to increase cellular | download limits, 45 seconds for letters to appear in XCode, 12 | seconds to call main, rewriting the linker and so on. | satya71 wrote: | Good read. Good to know that Uber engineering culture was as | much of a dumpster fire (despite the brilliant moves) as their | product. | whoisburbansky wrote: | > _While power law and fractal patterns have revealed themselves | in several physical, biological, and man-made phenomena, to our | knowledge we are the first to identify their presence in machine- | code sequences in computer executable code. Presumably, machine | code is a human expression of instructions to a computer and it | is well established that all human languages show a power-law in | the frequency of the words._ | | Made me chuckle. Maybe the authors should look at getting an ACM | subscription. | | [https://dl.acm.org/doi/pdf/10.1145/1391984.1391986] | speedgoose wrote: | It's maybe a naive question, but from my point of view I don't | understand why it's even a problem. Why is the Uber app so big ? | donarb wrote: | This article is bogus. They spend a whole bunch of time | benchmarking build sizes, nothing about why they need so much | code in an iOS app to begin with. | | Apple has dropped limits for large app downloads on cellular. | They now put up a dialog to tell the user how big the download | is and if they wish to defer to a WiFi download. | | I checked the size of the Uber app and it's about 300MB. Uber | Driver is 232MB and Uber Eats is 228MB. | thegeomaster wrote: | It has... _a few million_... lines of code? | | What? | | Linux has 30 million of C! | | I'm speechless. I cannot fathom how & why. | edoceo wrote: | Cannot fathom why LOC is a metric? Me neither. Lots of stuff | has millions of lines of code in various languages with wide | ranging feature-sets and functionality. LOC has near zero | meaning across the language/project boundary. | [deleted] | dntrkv wrote: | How? 1000 engineers x 1000 LoC/each = 1M LoC | | Why? If you have 100+ engineers at any given time, shipping | features over a period of a few years, you'll hit 1M in no | time. | | It sounds like a lot, but it really isn't when you consider the | amount of people working on it. | | Now whether or not you can build the same thing with less LoC, | probably. But it's not like it was built from the ground up | with every piece of functionality planned out from day 1, so | there will be inefficiencies. | | Comparing it to Linux is pointless. Platforms should be | relatively stable, products are ever changing and the shelf- | life of the code is sometimes measured in weeks/months. | travisgriggs wrote: | I've observed that lines of code are measured differently based | on whether the writer is trying to convince the audience that | the subject matter is big and complicated and the reader should | respect the magnitude of dealing with this particular piece of | software OR whether the author wants you to appreciate the | brevity/simplicity/approachability of the software in question. | The first decision made in this decision tree is whether you | just use wc _, or whether you filter out empty lines. Next goes | the comments. Next goes syntactically less significant lines | (just a closing brace that_ could* go on the previous line). | Wash rinse repeat. | | It's a variant of the "I didn't have time to write you a short | ____ so I wrote a long one instead" adage. | | I would guess (but only guess) that this article erred on the | side overstating size. | bhupy wrote: | An old (but fantastic) comment from the previous discussion about | Uber's app size that addresses why the Uber app is so big: | https://news.ycombinator.com/item?id=25376346 | jedberg wrote: | The summary of that comment is "we have to include a ton of | stuff that will never be relevant to most users like payments | APIs that only work in India." | | This is why some global apps have different apps for different | countries. It's a trade off. Would you rather have a single fat | Uber app, or have to download Uber India when you arrive there? | bhupy wrote: | > This is why some global apps have different apps for | different countries | | Do you have some examples? Genuinely curious. To my | knowledge, most of the major FAANG apps are single-binary. | sond813 wrote: | Starbucks has a separate China app. I suspect a part of | this is due to app size because there are regions specific | SDKs. Another is likely security. Regulations in some | countries require data to be shared with the government and | they don't want SDKs that collect this data to be included | in more privacy focused regions. | mkipper wrote: | Dedicated apps for fast food chains are one example. A | quick search gave me "Burger King India", "PizzaHut Egypt" | and "KFC UAE". | | Why? I have no idea. | owenversteeg wrote: | Totally different requirements. Some countries' fast food | apps are for mobile ordering and delivery, some are a | giant collection of coupons, and some are only for | nutritional information. And some are just for | promotional activities (only used for various promotional | calendars.) After seeing all the different APKs I tried | out a few for different countries out of curiosity and at | least for Burger King they were entirely different | applications with completely different use cases. To cram | them all into one global app would be an enormous mess. | jdminhbg wrote: | I think fast food chains are generally not actually owned | by the same parent company. A company in India is | licensing the Burger King branding and presumably some of | the recipes from Burger King USA, rather than being a | subsidiary thereof. | jedberg wrote: | Probably payment APIs, just like Uber. Or they are | developed by different local app shops. | jedberg wrote: | eBay is one that comes to mind right away (unless they | changed it recently). | | Google Pay is another one. They have a dedicate app in | Singapore. | | It seems like a lot of them went to single apps when they | realized they could download data packs within the app. | Stuff like Rick Steves guided tour apps used to be separate | per city, but now it's a single app where you download the | data for a certain city. | | But I think you're right that all the major FAANG apps are | single-binary. | paulvorobyev wrote: | >Do you have some examples? Genuinely curious. To my | knowledge, most of the major FAANG apps are single-binary. | | Worked on iOS app size at a FAANG for a couple of years -- | this is untrue. At the very least there are different | binaries for watch vs iPhone architectures. | Scoundreller wrote: | Personally? A single fat app. Less fumbling around when I | land somewhere to get their localized app, which will | presumably only be available from that country's App Store | that's inaccessible before I land there. | | If I have to deal with the airport's wifi... I don't want to | depend on downloading a 100mb binary over it. | | Maybe they could have a local and global version available, | but that's already making it more complicated. | 908B64B197 wrote: | > If I have to deal with the airport's wifi... I don't want | to depend on downloading a 100mb binary over it. | | That pretty much doomed all these "local Uber competitors". | Nobody would start looking for a local competitor, set up | an account, get 2FA, register their payment method and then | have the privilege of getting a "starting up" screen | telling them how and where they can get a ride. Instead | they just open Uber and get where they want. | dangwu wrote: | The downside is trying to download Uber for the first time | when arriving at an airport. However, I think Uber is so | ubiquitous now that it's the likely to already be | installed. | Farbklex wrote: | The Google Play Store solved this problem with dynamic | feature modules. Either at install time or later on, you can | let users download only certain parts of the app. All with a | single app store entry and app bundle. | | We use this for devices which don't have NFC. If the device | doesn't support it, then there is no reason to download the | module for identification via passport NFC scans. | megablast wrote: | Which sucks. I arrive in a new country, and need to find | internet access??? | PudgePacket wrote: | Mate.. how are you going to get your uber anyway without | internet? | viraptor wrote: | If you want to use Uber afterwards... yes, you already | established you'll rely on internet access. | deadbunny wrote: | How are you ordering an Uber without internet access? | piannucci wrote: | Interesting. I have had bad cell connectivity in unfamiliar | airports, though, where I could barely keep a connection to | e.g. the Lyft servers. What if I can't download the module | when I need it? I don't think requiring the user to | download it in advance of their flight is viable, either. | If we lived in a world of universal, homogeneous, | inexpensive connectivity, I'd be satisfied with the | solution you mention. I guess if they had location/policy | micro-modules small enough to fit in a single MTU, then | anybody who could connect to Uber at all could be served. | | It still boggles my mind that there could be ~100M | meaningful instructions in a program. | fractionalhare wrote: | No, it's also substantially different between certain cities | and regions in the CONUS. Otherwise that might be viable. | spoonjim wrote: | I love that it's one app. I remember landing in Delhi from | San Francisco and the Uber app worked perfectly and I was so | astonished. Effectively nothing else translates seamlessly | like that. Combined with the incredible quality control on | the vehicles side (every car I got in India had a seatbelt, | where close to 0 taxis you'd get on the street would), I knew | it was a very high functioning company to execute like this. | Borlands wrote: | Exactly same experience, from San Fran to Singapore and in | between. Never really realised how good we have it, such a | good point | gcbirzan wrote: | > every car I got in India had a seatbelt | | That sounds so weird to me... What do you mean cars don't | have seat belts?! | jscholes wrote: | > That sounds so weird to me... What do you mean cars | don't have seat belts?! | | I can confirm the OP's experience albeit in a different | country (Mexico). In some regions, I haven't been in a | single street taxi with working seat belts. Indeed, I've | been in some private cars without them as well, or with | more physical space for passengers than there were seat | belts available. | | Uber vehicles, though, have always provided those safety | features. Some drivers work as both street taxi and Uber | drivers (as they frequently cross into or live in regions | without Uber but drive people to places that have it), so | that quality assurance can trickle down in some cases. It | honestly goes beyond seat belts though; a Uber car is | more likely to have AC, electric windows, etc. than your | average taxi, even in ridiculously hot parts of the | country. | onemiketwelve wrote: | 75% of Ubers in Egypt didn't have seat belts. It's just | tucked away and not culturally the norm | pradn wrote: | People have even chuckled when I reached to put a | seatbelt on in India. :) | ameen wrote: | Not sure what to make of this. I'm Indian and the last | time I was in India, there was strict execution of the | seatbelt law and offenders were made to wait and fined | heavily. Most drivers were wearing seatbelts. | | Maybe because it was in Chennai, a southern state and not | in Mumbai or Delhi. | dliff wrote: | While I had a positive experience with the Uber app | software-wise (app functioned seamlessly landing in Mumbai | from U.S.A.), Uber as a service was not really comparable | to what it is like in the U.S. and developed W. European | countries. I got the sense that it was more of a strictly | ride hailing / request service, not much accountability | required from the driver. Often had > 3 drivers cancel | after 10-15 minutes waiting before actually getting a ride. | That being said, it was still a hugely valuable service to | have in India as a foreigner. | ForHackernews wrote: | This is such a non-feature for 99% of users. | | The fact that Uber devotes engineering resources to serving | the tiny 1% slice of users who care about having an app | that works seamlessly across dozens of countries, at the | expense of the much larger number of users with limited | space on their outdated devices, is really emblematic of | the Valley's out-of-whack priorities. | spoonjim wrote: | That 1% of users represents a lot more than 1% of profit, | and engineering an application that is that robust across | scenarios has benefits to the stationary users transiting | through multiple scenarios as well (surge pricing to | normal, credit card to Apple Pay, car ride to scooter | ride, etc). | Cederfjard wrote: | Why are you assuming that splitting it into multiple apps | would require less engineering resources than keeping | just one? | ssdspoimdsjvv wrote: | I don't have any numbers, but I would guess that a good | part of Uber's user base consists of people that travel | often. Not having to download a new app or update every | time you go to a different country is a huge advantage. | manigandham wrote: | It's much more complicated than just countries. If you | read the linked comment then you'll learn that it's | includes many regional customizations, even down to | specific cities and airports. | | An app for travel should absolutely prioritize UX and | ease of use _as you travel_ , however far away your | destination is. | minhazm wrote: | It's not even just per country. If you fly to certain | airports in certain states they have different rules that | affect what the Uber app can do. Do they maintain a | separate app for Washington and for New York? It gets | pretty messy pretty quickly. Not only do you have to | maintain these different edge cases, but you also need to | maintain separate applications and all of the problems | associated with that like keeping libraries and API's in | sync between them. | corin_ wrote: | I'm probably missing something obvious as I'm tired, but | why does the Uber app need stuff like specific airport | rules stored in it rather than pulled from their servers | when needed? | | Map apps let you look at any city in the world without | needing all of that data inside the core app, and if you | have enough data to use the Uber app wouldn't you almost | certainly also be fine to have it download in the | background the required info (coordinates of where pickup | is or isn't allowed, specific instructions message to | display, etc.) the same as it receives information about | local pricing, location of available cars nearby and so | on? | ameen wrote: | Connectivity at airports is not the best - if you're on | an expensive data plan those extra MBs cost a pretty | penny which might put off the customer. | | You need to think about the larger picture. | viraptor wrote: | Give the streaming of location data for cars in the area, | I don't think they care much about those extra MBs. If | they did, you'd get a "N cars within X km of you", not a | live-ish map. | | A quick summary like "extra fee for airport pickup: X, | pickup location restricted to: Y, etc." should be pretty | comparable. | corin_ wrote: | Wouldn't it be significantly less than a MB for all the | info about "how does Uber work at this airport" info to | come in json or whatever? It could surely survive without | downloading special airport-specific media like logos, do | the airport rules require complicated heavy code on the | phone? | | Thinking of my experience with Uber at airports, it's | generally stuff like "pickups from this terminal are only | available at the west exit" (show on map - so needs | coordinates and message text), or "There is a PS10 | airport pickup fee for all private hire vehicles here | which will be added to your bill", or whatever along | those lines. | | But perhaps your point still stands even if it's KBs | rather than MBs. | MattGaiser wrote: | > This is such a non-feature for 99% of users. | | I would imagine that travellers are an outsized | percentage of high spenders, even if they are a small | portion of users. | ljf wrote: | Totally this. It isn't uncommon for a whales (usually 1 | to 2 percent of an apps users) to account for 30 to 50 | percent of their profit. So it is very worth thinking of | those customers first. | | Not all customers are equal. And if you build your app or | site without knowing that you may well chase the wrong | features. | StreamBright wrote: | As a frequent traveller, I would be much more inclined to | either pick the airports that are going to be relevant to | me ever or pick the destination airport when I am at the | source airport which Uber can easily detect. I am | visiting ~10-15 airports most of the time. I would be | happy to spend some time to set this up on my phone so i | not need to waste a huge amount of space and bandwidth | every time that I update Uber. For Uber it would be a win | too, reducing the size of the app significantly. Maybe it | is only me. | bobbylarrybobby wrote: | Don't app updates only push deltas anyway? It's only the | initial install that's large. | Bjartr wrote: | A willingness to put in some time up front to tailor a | technology experience to yourself is one thing that | separates the average HN user from the population at | large. | | For a significant majority of users, if it doesn't work | well out of the gate, it's broken. | MattGaiser wrote: | Even as an avid Hacker News user, I wouldn't tailor an | app download to save bandwidth/space. Both of those are | abundant. | ChrisKingWebDev wrote: | I would agree with this. At home I walk, ride my bike, | get on transit, rent a carshare etc. When I'm travelling, | I'm walking or calling an Uber/Lyft. I'll take a train or | bus only if it's super easy to navigate. | MattGaiser wrote: | I spent a lot of 2018/2019 travelling around North | America. It was wonderful to never have to consider a | taxi. | rsj_hn wrote: | Same here. In my local area I understand the transit. I | have a transit card. But when I am in a foreign city that | speaks a different language these are not realistic | options unless I spend effort on figuring that out and | deal with local municipal transit authorities, which is | not the vacation experience I am looking for. | NikolaNovak wrote: | Interesting assumption/perspective - The _only_ people in | my circle of friends and co-workers who use Uber, are | travelers. And _nobody_ I know has a clue of their phone | storage or has hit it due to apps (as opposed to videos | /photos). | | For some, Taxi works well enough and is (perceived as) | licensed/trusted/reliable so they don't have a need to | use Uber. Others are bit of Luddites, or mistrustful. But | I guess friction of Taxi / benefits of Uber just aren't | high enough :-/ | | (Personally, I've only ever used Uber on specific | travels; for 99% of my transactions, Taxi has been | easier/more reliable. Don't get me wrong, I think Taxi | licensing/medalion model is outdated, the drivers have | worked incentives, and cars aren't as maintained as well | as they could be. But I _still_ normally don 't find a | benefit in Ubering). | | Finally, FWIW, even traveling within country, I've | noticed significantly different screens/features/options | in, say, Ottawa or Toronto airports and vicinity. So I | think overall a lot more people benefit from this | monolithic model than may be immediately apparent. | ghaff wrote: | I'm in the same boat. To a first approximation, I never | use Uber in my local metro area. To a second | approximation, I don't use it much traveling either. I'll | often grab a cab if it's convenient rather than waiting | for an Uber/Lyft to show up. Or if there's a good public | transit option to my hotel I'll use that. In spite of | (normally) 100+ days of travel per year I maybe use Uber | a dozen times a year. (I do use a private car service to | take me to the airport, but again Uber wouldn't be very | good for that purpose.) | wdb wrote: | Personally, I would download whatever the dominating | hailing app is in the country. Most of the time its cheaper | than Uber like Grab in parts of Asia | reader_mode wrote: | If you're landing in Asia from the US you're probably not | going to care about the price (there are exceptions), and | Uber has been reliable for me travelling, if that costs a | few % more than the local version I'd be happy to pay for | convenience. | ProAm wrote: | > Uber has been reliable for me travelling | | Unless India? [1] | | [1] | https://www.theguardian.com/technology/2017/jun/08/uber- | exec... | tobmlt wrote: | Also, this was an entertaining retrospective recently posted: | | https://mobile.twitter.com/stantwinb/status/1336890442768547... | | I can't seem to find the old link, but I'm pretty sure it was | on hacker news and somebody posted a nice collation of the | posts. | jtsiskin wrote: | And it applies to not only Uber, but tons of other apps. | Unfortunately incentives are not aligned to make rarely used | features load on-demand. I wonder what the average user percent | of application binary actually executed is. | jandrese wrote: | It strikes me that this would be the perfect use case for | loadable modules. The Uber app could download the payment | module you need on the first use and leave the dozens of other | APIs off your device. This could also significantly cut down on | the number of updates (300MB downloads each time!) that the app | needs, since NA or European users won't have to re-download the | app because some Indian payment API changed. | | Unfortunately the way Apple and Google set up their walled | gardens makes this impossible. I guess Apple would prefer if | the Uber app dropped all of that and just made everybody use | ApplePay instead. | megablast wrote: | Another person who think the internet is available | everywhere. | deadbunny wrote: | How are all you people without internet access ordering | Ubers? | user5994461 wrote: | >>> The Uber app could download the payment module you need | on the first use | | When I'm opening Uber at 1am in the cold to get a ride home, | this is not the time to download a payment SDK update. | jandrese wrote: | It's like 5MB and you have to be connected to the Internet | to use Uber in the first place. | true_religion wrote: | This is anecdotal but... | | I recently was traveling. I landed at a new destination | and checked the internet speed. Mobile via my tablet just | outside the airport was _theoretically_ as 50KB /second | via Google speed check. However actually downloading a | file from US servers was 5-15KB/second because of the | latency (3000ms+) being so high that packets were | constantly being dropped. | | That's at best, 75 seconds waiting for a download. At | worst it's 16 minutes. | | On the other hand, I was able to get Uber on my phone and | though it was painfully slow, it found a driver in under | 30 seconds. | vlovich123 wrote: | This keeps getting repeated in this thread & I keep not | understanding it. If I downloaded Uber & set it up with the | payment method that I need, why would that payment method | suddenly change at 1am in India? | | The way this should work is when you set up payment option | X, it downloads the relevant payment info & then you're set | from then on without any other modules unless you add a new | payment option. Likely pre-bundle the generally "global" | options (Apple Pay/Android Pay since those are platform- | native & credit cards since those are likely small | implementations). | | The real reason is that you will always have drop-off | because the download phase is split in two (on the other | hand you'll have increase in installs because the app size | is smaller). That would need App Store integration with the | loadable modules so that you could say "Install these | payment features of the app". This may not be a win because | again, it requires the user to do more work. Simple for | everyday users will often win the day even if inefficient | vs more optimal options that achieve that optimality by | pushing complication to the user. | gregoriol wrote: | Or when you just landed on the other side of the planet and | don't have a good internet access (or it costs $$/Mb): the | app is still expected to work, because you need your ride | right now | colinmhayes wrote: | Uber doesn't work without decent internet access though. | Maybe you can make he argument for $$/Mb, but there's no | point in uber creating the app so that you can get to the | pay screen without internet when you need the internet to | use uber. | novok wrote: | Actually google has recently added that feature with android | app bundles. Apple has something similar with on demand | resources, but specifically prohibits binary code in them. | Hopefully with android having the feature, it would induce | apple to allow binary dynamic libraries in on demand | resources too. | sond813 wrote: | Google encourages this with feature modules and app bundles. | Apple doesn't allow it because they've always been against | downloading executable code that doesn't go through app | review. Same reason they don't like game streaming or | downloading react native at runtime. | | I'd like to see them open up this possibility in a controlled | way one day. Something like a review process for feature | modules that could be updated in a similar process to full | apps. | abductee_hg wrote: | ...as a demoscener who has released multiple 64k/4k intros I | hereby formally say: LOL. | rockmeamedee wrote: | There's apparently a bananas crunch/backstory to this, where they | committed to Swift before realizing they would hit its limits, | and had to come up with a bunch of this optimization madness on | the fly. I guess this is the cleaned up version and the more | final, stable optimizations for the company blog: | | https://twitter.com/StanTwinB/status/1336890442768547845 | alien_ wrote: | Wouldn't UPX give similar results in deduplicating binary code? | ketralnis wrote: | Can someone help me understand this? They blame the source of the | large bundle size on: | | > The choice of Swift as our primary programming language, our | fast-paced development environment and feature additions, layered | software and its dependencies, and statically linked platform | libraries result in large app binaries | | but can somebody familiar with iOS development explain what makes | app bundles so big? Actual CPU instructions or config can't | contribute this significantly. The entire Bible is about 4.5mb. | If you're writing an app by yourself you almost certainly didn't | write that much text in the source code. A sibling comment links | to https://news.ycombinator.com/item?id=25376346 which says that | they have a lot of screens but even something like "PayTM (15+ | screens)" is still just textual source code and config that I | don't follow how it gets beyond kilobytes. The App Store places | them at 309mb, so ~68 bibles. | | I understand when games are large because they typically ship | with images and videos included in the binary for game assets. | But for a normal application where does the size come from? | | Is it dependencies? (And how did _they_ get so big?) That weird | intro video they have on the loading screen? Are they shipping | bitmaps of the cities they have markets in? | novok wrote: | The same equivalent code in objective-c is significantly | smaller than the same code with swift. Swift has a lot of | implicit specializing templates which really bloats code size, | like it would in C++. If you compare binary sizes of apps from | the pre-swift era, you'll notice many are far smaller. Like I | remember tweetbot being 4.5mb in the pre ios 6 days. | bhupy wrote: | I'd say this is the most comprehensive breakdown: | https://news.ycombinator.com/item?id=25376346 | ketralnis wrote: | Let's say there are a hundred screens in the app and the app | is 300mb. Does it really take 3mb of source code, about 3/4 | of a bible, to render one screen? | | (I do understand that source code isn't what ships in the | binary, but for the sake argument let's say they're 1:1 in | size.) | johncolanduoni wrote: | The argument you'll have by saying that for its sake will | be pretty useless, because source code and machine code are | nowhere near 1:1 in size. | bhupy wrote: | Considering that Uber's binary size (330MB) is comparable | to similar apps such as Google Maps (224MB), Lyft (435MB), | and Didi (332MB), it might just be par for the course for | iOS apps. | | Yelp, for example, is what you might call a | "straightforward CRUD app" (to Yelp engineers, I know it's | probably legit complicated and hard), and that is 292MB on | the App Store. | | It's probably to do with how the framework handles | lifecycle management and combining static assets like text | and image with business logic that lives in Controllers. | saagarjha wrote: | This is par for the course for large companies with many | engineers working on writing code without spending enough | time on keeping app sizes low. | dangwu wrote: | It must be mostly the dependencies and assets they're | pulling in for each screen, and not simply the source code. | They _could_ be using a different SDK for each type of | payment they take, which is a lot. If the app has 250 | features, and each feature includes 4MB of assets (images, | icons, sounds, etc.), that 's already a gig right there. I | also suspect that there's a lot of reinventing the wheel | going on, since there's 40+ feature teams all working on | the app at the same time. | liuliu wrote: | "Reinventing wheels" are represented by the machine-code | outlining :) | | These are code. Swift is a safe language with more | runtime checks than other "zero-abstraction" languages. | It also support "value" semantics and can deploy | monomorphization for generics (although no guarantee). | All these means you can have functions with slightly | different view models duplicated many times throughout | the binary. | | Not to mention the language itself need to generate a lot | of retain / releases for refcounting purpose (the blog | post also pointed this out). | | All in all, Swift as a language is not particularly | optimized for small binary sizes, and there are a lot of | trade-offs made to improve the usability rather than | binary size. That has been said, there can be more | opportunities exploited (and right now not) to reduce the | binary size from compiler side. | [deleted] | mandelbrotwurst wrote: | I'm not very familiar with iOS dev, but I'd suspect a lot of | dependencies, yes. | | Also, the Uber app has a LOT more features than you would | expect at a glance, due to extensive customization of the | experience (i.e. feature flagging) along many vectors, and so | it wouldn't surprise me at all if this ends up adding to a lot | of code. | | Edit: Linked post from sibling commenter bhupy outlines this in | detail. | sond813 wrote: | Uber's article focuses on binary size, but the App Store 309mb | number is app bundle size. 120mb of this is not coming from the | binary. I have a breakdown of this here: | https://news.ycombinator.com/item?id=25380198 | | App size can be measured in many ways like download size, | install size, binary size, thinned size. I wrote about the most | important ones here: https://docs.emergetools.com/docs/what-is- | app-size | BigBalli wrote: | 328.9 MB I'm sure it could easily be 1/10 of that while keeping | all features important to the user. | jamestenglish wrote: | Important to a user in 1 region/country. | | https://news.ycombinator.com/item?id=25376346 | | Uber is a global app, so the other 9/10s of the code is for all | the features and functionality you'll never see outside your | region since there is currently no way to split up binaries by | region. | jbverschoor wrote: | 328 mb more than a complete OS. No doubt they can EASILY trim | 30-60%. Asset optimization, stripping SDK libraries and | you're done. | | It's like graffiti.. the app is so big already, that the devs | don't give a damn about optimizing.. why bother if they are | just A/B-feature tests? 30mb for some unoptimized screens for | example | jakub_g wrote: | If you click the link OP posted and read the previous | thread you will see they can "easily" do _ass_. They | already spent millions in engineering time to cut the app | size as the company existence literally depended on it when | Apple 's bundle size limit was 150 MB. | | If your app is serving hundreds of cities with specific | per-city customizations and all code and assets are in a | single binary, life gets tough. | jbverschoor wrote: | If you open up the IPA, you'll see that basically they've | recreated some anroid-xml compatible rendering engine. | | The localization files (50MB) -> All the strings files | are double the size (unpacked), because of useless | comments. There's 25MB already. | | In the assets catalog -> half an MB for an upscaled (!) | visa card. Other images where jpgs of heif are a better | choice. probably in total 10-20 mb. | | Strip all ICC/Gamma from the PNGS -> another 10mb. | | pngcrush the images -> about 40% | | And then of course the binary itself which is probably | full of unused information. | alien_ wrote: | I would like Apple to be doing some of these against all | the apps. | | Few app developers have the time/bandwidth to do these | things and it would be a very inefficient use of | resources to have everyone do it over and over again. | jakub_g wrote: | Nice check. I guess they relaxed a bit since Apple raised | the app size limits :) (sorry for the snark in the | previous post) | ohiovr wrote: | I'd take a sledge hammer to it. The app doesn't have to be an app | at all. It could simply be a stream with an os interactive | overlay that intercepts touches. Like a thin client for phones. | km3r wrote: | A stream may also make it harder for the app to work in areas | with poor connection. Which, given Uber's use case, is probably | a likely scenario and one that could lose a lot of customers to | competitors. | ohiovr wrote: | From some simple experiences with recording my desktop to a | mp4 file I've found the delta compression to be extremely | efficient when there is only a little motion. Perhaps still a | deal killer, true. | adrr wrote: | Pull it on first run and cache it. If you're in place with a | poor internet connection, you aren't going to be able to | download the app from app store any way. I am going to assume | 80% of the code packaged in the app in the app is never used | by a majority of their customer base. Like all the business | features where a company give their employees allowances. | doggodaddo78 wrote: | That's called a web browser and a web app. | | And then there wouldn't be anything to hog-up 1/3 of a GiB on | every customer's phone, and it would always be up-to-date. Just | don't ever lose internet access. | ohiovr wrote: | Especially getting lost in a cell dead zone. | | Its not exactly a web app but it could be made that way with | WebRTC. | amelius wrote: | How do you expect to hail a taxi when you don't have internet | access in the first place? | | Does the app use SMS when the internet connection is lost? | lxe wrote: | That could trigger the App Store review block. But this is | Uber, so I'm guessing there's special treatment :) | ohiovr wrote: | Interesting. I've not looked at the long rule list in a | while. | pgp001 wrote: | wow, all that code and it's still absolutely terrible to use. | Imagine | elpakal wrote: | I was quite surprised by the increase in build times: | | > Overall, 5 rounds of outlining builds in 66 minutes -- a | 45-minutes addition to the baseline. | saagarjha wrote: | This is certainly an great read, and working on it must have very | interesting. That being said, in my experience things like these | are invariably technical band-aids over social problems. Whenever | I see things like this, often paired with statements like | "there's so many screens and feature flags", usually the problem | is not there but actually in many other processes: for example, | the design team adds assets in a way that is not enforced by the | usual tooling that checks binary size, or the build process adds | duplicate files into the bundle that nobody notices. Sometimes | the underlying issue is hard to fix, like if it's code size | explosion due to a custom templating engine, but they really | should get addressed at some point. Changes like these don't | actually solve the underlying issues, which can be a benefit for | a while, but eventually they become so complex that it is hard to | maintain them and they start impacting productivity in harder to | measure ways by doing things like increasing build times and | reducing the quality of debugging information. | draw_down wrote: | > usually the problem is | | Usually, sure. But sometimes there is a lot to do, and if I | may, Uber is not your usual app. At the point where you're | being very choosy about the access modifiers on your classes, | you probably thought about icon assets already. | | Someone elsewhere in thread linked to a partial list of | concerns the app needs to cover, many of which are location- | specific. You might say "well split the app by geography", but | that just trades one set of problems for another, and that new | set of problems could well be worse for the business overall. | Paying a team of people to do this junk may be a whole lot | cheaper than suffering a reduction in customer engagement when | they fly to a new country and don't have the right app anymore. | superkuh wrote: | Uber is just a scam to launder saudi blood money through | softbank. There is zero chance that human driven cars will go | away. And self-driving cars cannot drive on roads with human | drivers. Uber is in the later stages of the scam now and have | "sold" (actually, they gave 400 million USD to the company they | "sold" the division too) their self driving setup. They've | admitted the only business model that would make them profitable | is impossible. It's over. They're just trying to take the money | and run now. | | That their "app" is large is irrelevant to the scam. | viscanti wrote: | According to their public investor reports, they've been EBIDTA | profitable on Rides for years. They're also profitable in more | rationalized Eats markets (markets where there aren't other VC | funded companies burning hundreds of millions of dollars on | subsidies). What do they need self driving for? | superkuh wrote: | To still be profitable after they stop breaking local laws | and regulation catches up with them. | https://horanaviation.com/publications-uber | tomaskafka wrote: | This seems like a case of sloppy product management saved (or | rather having its consequences delayed) by person-years of | ingenious engineering. | | Build times in tens of minutes seem terrible. | Spivak wrote: | Oh I would kill for a sub half hour build time at $dayjob. | StreamBright wrote: | It is still amazing to me how Uber cannot narrow down the use | cases enough. To me it was a done product in 2014, no need to | additional features. I think the software industry as a whole | does not have the concept of 1.0. We are trying to ship one more | thing all the time. | sond813 wrote: | I'm the founder of a YC company in the current batch focused on | solving this exact problem! https://www.emergetools.com | | We parse Obj-C and Swift runtime metadata to determine size | contributions of individual types and functions in your app. We | use this analysis to post PR comments with granular size diffs to | help devs write smaller, better code. | | I tried it out on the Uber app and immediately noticed a | disproportionate impact from their code-gen dependency injection | framework, Needle. The codegen is responsible for over 30k | classes in the app binary, and contributes over 10mb! In general | codegen is a common problem with Swift binary sizes, and the | fewer reference types generated the better, it even helps with | startup time! | | We've written a blog post with case studies about how 7 of the | most popular iOS apps could reduce their size: | https://medium.com/swlh/how-7-ios-apps-could-save-you-500mb-... | dang wrote: | Discussed here: | | _Launch HN: Emerge (YC W21) - Monitor and reduce iOS app size_ | - https://news.ycombinator.com/item?id=26014180 - Feb 2021 (44 | comments) | rememberlenny wrote: | "The Lyft app has hundreds of duplicate files, the largest | consumer of space is a single asset catalog copied 73 times in | separate bundles. Another asset catalog that is virtually | identical except for the timestamp at which it was created is | copied 67 times. Each of these contain nothing but 482 colors | (colors can be stored in asset catalogs to simplify management | of dark mode). With each one taking ~250kb these quickly eat up | 35mb." | | I read this as: Lyft installed Dark mode for 35mb. I can only | imagine what my JavaScript modules are doing behind the scenes. | trevor-e wrote: | My biggest complaint with iOS development is how confusing | Xcode's build system is. Extracting code out to shared | frameworks is a confusing process and I can understand how so | many of the top apps get it wrong. Also, it's clearly not a | priority for Apple because they don't provide easy inspection | tools. Best case for them is the user buys a new phone with | more storage. | rememberlenny wrote: | I'm curious - does React Native/Expo do any better job at | this, with tree-shaking and package building? | sond813 wrote: | Yep this is exactly the problem I'm trying to solve! A lot | of large app companies have switched from Xcode to third | party build systems like Buck or Bazel. This can make | things faster but even more confusing. I've found analyzing | the actual build products to be the best solution to make | sure nothing unintended is happening. | [deleted] | etaioinshrdlu wrote: | Machine-code outlining sounds kind of like the opposite of | function inlining. Right down to the name! I am amazed I've never | heard of this optimization technique being used in compilers | before -- it sounds like it could improve performance in many | cases by making code smaller (or hurt performance for the same | reason that inlining can help performance)... | viktorcode wrote: | > The app has a couple of millions of lines of code | | I wonder if Uber is planning to do anything about that? The | technique described in the article (whole program instructions | outlining optimisation) is a band aid style solution, merely | delaying the inevitable: the code produced by numerous teams | independent of each other will inevitably cross first the | download size limit threshold, and later maintainability | threshold. | layoutIfNeeded wrote: | They are already waaaay beyond the maintainability threshold. | alien_ wrote: | I also find it unbelievable to have so much code for a single | app, this is approaching the level of magnitude of OS code | bases: if you think that the entire Linux kernel is around 28M | lines so roughly 15x the Uber app. | | The binary size is also from the same ballpark as the entire | Windows 98 needed for installation. | | I'm glad Uber is doing something about this, but in my opinion | Apple should tackle this across their entire ecosystem at the | toolchain level, devices with less than 64GB of storage can | quickly run out of space with just a handful of applications | installed. | | Unfortunately it's in Apple's interest that people buy devices | with more storage, so I don't expect them to invest much effort | in this. | tenacious_tuna wrote: | For both technical and UX reasons it's in Apple's interest to | make app updates lightweight, and those likely far outweigh | any driving force they might have to encourage people to move | to higher storage sizes. | | (1) if it takes a long time for people to update their apps, | that's a crap experience that people are having on Apple | devices, which goes directly against the grain of Apple's | whole value proposition ("use our stuff and your life will be | great!") | | (2) For technical reasons, it's in Apple's interest to reduce | app image sizes; less strain on infrastructure, easier to | scale, etc. (300MB * 1.2M (# of app store reviews) = 360 | terabytes transiting their networks whenever Uber pushes an | update. All that has to be load balanced, CDN'd, etc.) ___________________________________________________________________ (page generated 2021-02-26 23:00 UTC)