The lack of expandable storage in Nexus devices becomes one of the hottest and most controversial topics every time Google does a refresh and we find out that the next generation lacks SD cards entirely yet again. Couple that with the decision to limit onboard storage options to 16GB max, which is the case with the Nexus 4 at the moment and was the case with the Nexus 7 for a while, and you've got a full-blown revolt.

You may have read one explanation of Google's aversion to SD cards, which was brought up by Android engineer Dan Morrill last year: it's confusing to users to have multiple storage points, the insecure "free-for-all" area was not meant for private app data but rather for media, and essentially SD cards are the sources of all evil. Google's chief of Android user experience Matias Duarte reiterated the same points today. Whether you think the reasons are legitimate or bogus (in consumers' eyes), this is Google's stance on the matter.

Now, with Android 4.2, there's yet another reason, one I hadn't thought of before, but one that makes sense - multiuser support. It's already relevant for the Nexus 10. At the moment, the Nexus 4 still lacks multiuser capabilities - some say due to a possible patent issue - but when Google (or enterprising hackers in the first few hours of 4.2 release) is ready to turn them on, it will become relevant.

There are two separate parts here, actually:

  1. The lack of proper filesystem permissions. Because SD cards are generally formatted using the FAT file system due to high compatibility with multiple operating systems, they lack the concept of file ownership entirely. If Google wants to be taken seriously when it comes to security, there should be no weak links like that. Imagine a modern PC where an unprivileged user could access every file in the file system - sounds pretty crazy when you think of it that way.
  2. Adding the complexity of multiple users to something as portable as an SD card would undoubtedly create an array of problems. What happens when two users are using the same app that stores some of its data on the SD card? What happens when you move your SD card to another device with a different multiuser configuration (or lack of the concept of users entirely)?

Up until now Android didn't have a concept of multiple users. Think back to Windows 98 that had a single My Documents directory and proper multiuser support only arriving with Windows 2000 and its Documents and Settings folder. I could draw so many parallels here.

The key point remains that unlike the migration path between Windows 98 to 2000 and having an internal hard drive vs an easily removable SD card, there is a certain expectation Android users have - seamless OTA updates and backwards compatibility. The /sdcard partition and paths on it have been mistreated so much in the past few years (just look at your card and see how many apps don't store data according to guidelines). If Google were to resolve the path issue and repartition the card upon upgrade to something like /sdcard/user1, /sdcard/user2, etc, it would suddenly become incompatible with other devices. Plus there's still no proper permission support.

It's kind of a mess.

And I don't even want to think of the ways other manufacturers are going to try to handle multiuser support. Google chose a simple path for its own devices. Now what happens when an OEM decides it wants to stick in an SD card slot and enable multiple users? Ugly hacks come to mind, and if there's one thing I hate as a programmer, it's ugly hacks.

Here is my take on the whole situation:

  1. Google needs to start offering more storage options. Not everyone is a power user, but we do exist, and we want our space. I, for one, am out of space with 64GB. I don't want to be. I will pay more to have more storage, but I can't. A few large games and apps, some music, a bunch of nandroid backups, some videos - hey, look, I'm already out.
  2. Google needs to solve the SD card situation properly so that both Nexus and non-Nexus devices can easily utilize them. Dan Morrill said Google would like to do it right, but I'm not sure they want to badly enough. SD storage is cheap. I want to use it. I want to have an option to use it. I want to have an option to pop up an SD card and move it elsewhere, whether just migrating devices or trying to rescue files off a phone that no longer powers on after taking a dive into my dog's water bowl.

In conclusion, let me quote chief Android framework engineer, walking Android encyclopedia, and fearless feline leader Dianne Hackborn who dropped some wisdom yesterday on G+ and put these thoughts in my head in the first place:

Robert Mahon: Another thought about this sd-card stuff, might it have caused issues with the multi-user side of things in 4.2? Most apps aren't following guidelines on where to save their data, so it gets sprayed willynilly on the SD-Card.  Now there's more than one person using the system, and possibly overwriting that data/corruption, I can see why Nexus devices, to stop this being a problem before it starts (or at least reducing it to less apps) is not using the sd-cards.

Stewart Gateley: With each user having their own apps and data, SD card makes even more sense. Keep the profiles local while storing large media files on ext storage. Either external files can be shared with all users, or set file permissions. No need to partition space out for each user or something. For a multi-user HD media consumption device, the Nexus 10 is seriously lacking storage. But I thought we were talking about the 4 here.

Dianne Hackborn:

    +Robert Mahon This is certainly an issue, we aren't supporting multi-user with the old school FAT partition for external storage (whether that is on an SD card like the original G1 or a separate internal partition like the Nexus S).

    +Stewart Gateley SD cards must be formatted with FAT (to inter-operate with desktop computers), which doesn't support file permissions.  Not to mention that all you are going to end up with is a mess if you try to set file system permissions (based on uids) on an SD card and then move that to another device.