The whole ‘does an Android smartphone need expandable storage’ debate has been raging for many years and it has been a real roller-coaster of a ride. One year Samsung’s flagships have microSD card slots, the next year they don’t, then support is back again. Up and down, up and down. Google never seems to want to include microSD card support in its Nexus line, but the individual OEMs who manufacture the Nexus devices do include support on other handsets they make!

If you do have a smartphone that does include a microSD card then one of the first questions you are likely to ask is this: What is the highest capacity microSD card that I can use on my phone? And it is a good question, but the answer may not be as simple as you were hoping. To get to the bottom of this we are going to need to look at the different microSD standards, the different file systems supported by Android and by desktop OSes like Windows & OS X, plus we will need to take a peek into the murky world of patents.

microSD cards and the SD Association

Let’s start with the basics. The standards for SD cards and microSD cards is defined by the SD Association. It was set up in 2000 by Panasonic, SanDisk and Toshiba to develop and promote memory card storage standards. Basically the SD Association makes sure all SD related technology (readers, cards etc) are compatible. At present there are three standards when it comes to the capacity of SD and microSD cards:

Type of cardMax CapacityFile SystemBackwards Compatibility
SD2GBFAT32SD
SDHC32GBFAT32SD, SDHC
SDXC2TBexFATSD, SDHC, SDXC

So basically the original SD card standard supported cards up to 2GB. Then came SDHC which extended the capacity to 32GB and then more recently the SDXC standard was released to boost the capacity to 2TB. All the standards are backwards compatible, which means that a device with a SDXC support can use all three types of SD card, but a device with a SDHC support can only read SDHC and SD, but not SDXC.

When it comes to handsets you may have noticed that some OEMs will says something like this, “expandable storage via microSD card up to 32GB.” what that probably means is that device has a SDHC compatible card reader. Technically any Android device which supports SDXC could advertise “expandable storage via microSD card up to 2TB.” But because 2TB microSD cards don’t exist (yet), most OEMs will say something like “expandable storage via microSD card up to 128GB” where the “128GB” bit could be a different capacity depending on when the device was released and what is the highest current microSD capacity that is commercially available.

FAT32, exFAT and Microsoft

As well as defining the physical characteristics of the memory cards, the SD Association also recommends how data is stored on the cards. If you imagine that the SD card is a block of storage space, any device that wants to read a file from that block needs to know where the file starts on the block and where it ends. It needs to be able to find that data from the file name (actually the full path name) and it also needs to know some information about the file’s permissions, etc. The way the files are organized on a storage device is controlled by the file system. There are lots of different file systems. On Windows you are probably using NTFS, on OS X it is HFS+ and on Linux most likely ext4.

Back in the late 1970s Microsoft produced its first version of a file system called FAT (File Allocation Table). It was originally developed for use on floppy disks, however over the years it has found its way onto hard disks, DVDs, USB flash drives and SD cards. It was the default file system for Windows until Windows XP. There have been several different variations of FAT (mainly based around the size of the table elements in the allocation table). These different variations are known by the number of bits that can be stored in each table location. The original FAT used 8 bit entries, and is today referred to as FAT8, then came FAT12, and with the inclusion of a hard disk in the IBM PC AT we got FAT16. For Windows 95 OSR2 Microsoft released FAT32.

The Extended File Allocation Table (exFAT) file system is another Microsoft design.

As you can see from the table above, FAT32 is the recommended file system for SD and SDHC cards. However FAT32 does have some limitations including a maximum file size of 4GB. While the idea of a 4GB file was probably unimaginable to people installing Windows 95 (from floppy or 650MB CDROM), today recording high quality video can easily create a 4GB file. To overcome these limitations a new filesystem was adopted, exFAT.

The Extended File Allocation Table (exFAT) file system is another Microsoft design, that was first introduced in 2006 as part of Windows CE 6.0. It allows for files that are larger that 4GB and it was adopted by the SD Card Association as the default file system for SDXC cards. For the testing section below I bought a 128GB microSD card from Kingston, and by default it was formatted using exFAT.

Since FAT32 and exFAT belong to Microsoft here we actually find how Microsoft is managing to make billions of dollars from Android. If an OEM wants to use FAT32 or exFAT it needs to pay a license fee to Microsoft. I am not one for conspiracy theories, but it is “interesting” how the SD Association used exFAT for SDXC. FAT32 is possibly understandable, it was the dominant industry standard, but exFAT was not used by anyone other than Microsoft, then all of a sudden every smartphone OEM, digital camera maker, media player manufacturer might need to pay Microsoft a royalty to support SDXC and exFAT… hmmm…

format-128GB-USB-Windows

Interestingly Windows won’t format SD cards bigger than 32GB using FAT32. However it is possible using third party tools. If you try to format a 64GB (or larger) USB flash drive or SD card under Windows you will have to choose between NTFS and exFAT.

Adoptable storage

Since we are talking about microSD cards, it is worth mentioning adoptable storage. Once a microSD has been inserted into a smartphone, the question arises, how should Android use it? The simplest way is for the extra storage to be used for media like photos, music or videos, and treated in a similar way to a USB flash drive on Windows. The phone isn’t dependent on the card in anyway and can operate with or without the card. This allows the user the freedom of taking out the card and using it on a PC, and then popping it back into the phone when needed.

However it would also be nice to have the option to use the extra storage as if it was internal storage and install apps on to it, plus store app data on it. This has been possible in the past with the various “move to SD” mechanisms, however it has one major pitfall, security. If I move an app over to the SD card and start storing my personal private data on that card then I open myself up to data theft. If someone removes the SD card from your smartphone they only need to plug the card into a SD card reader on a PC or laptop to get access to your unencrypted data.

Android 6.0 Marshmallow introduced the idea of adopting external storage so that it acts like internal storage. When a microSD card is adopted, it is formatted and encrypted to only work with that device. Now you can safely store both apps and private data on the card. One interesting feature of adoptable storage is that it isn’t limited to 2TB like SDXC, but can actually use media up to 9 Zettabytes… Now, where did I put that 9 Zettabyte microSD card, I know it is here somewhere!!!

Flash drives and USB OTG

Although we have been talking about SD cards, it is interesting to note that much of our discussion also applies to USB flash drives. Many Android devices can connect to USB flash drives via a microUSB to USB OTG adapter. Like SD cards, USB flash drives can be formatted as either (but not limited to) FAT32 or as exFAT. Also the restrictions about file size etc apply equally to FAT32 formatted USB flash drives.

lexar-128GB-USB-flash-drive-16x9

As I mentioned earlier, Windows won’t format large USB drives as FAT32, you need to pick exFAT, rather than NTFS, if you want to have any chance of the drive working with Android. Having said all that, my 128GB USB flash drive (from Lexar) came pre-formatted as FAT32, which means it wasn’t formatted using the built-in Windows format tool!

Testing some devices

To test the support for FAT32, exFAT, and SDXC I got hold of a 128GB microSD card and a 128GB USB flash drive. Then I tried to use them on a variety of different devices from the Raspberry Pi to a Sony TV along with lots of Android devices. This is what I found out:

USB flash drive formatted exFAT

For this test and the next one, I took my 128GB USB flash drive, copied some files onto it and connected it to a selection of devices, using a OTG adapter when necessary (i.e. for the Android phones).

Let’s start with what didn’t work. The Raspberry Pi running Linux won’t read exFAT files and neither does a laptop running Linux. This is due to the licensing issues around exFAT, it belongs to Microsoft and while there are some open source exFAT drivers they aren’t in the mainstream for legal reasons. However the exFAT formatted USB drive is recognized by Chrome OS running on my ARM based Samsung Chromebook. As you would expect Google and Microsoft have a wide ranging set of patent and cross licensing deals (which probably cover FAT32 and exFAT). They even recently agreed to stop complaining to the regulators about each other.

There were two other devices which I tried which didn’t work with exFAT. One was my Sony Bravia (non-Android) TV and the other was a Motorola Moto G (2015) running CM 12. All the other devices I tested work fine including the Samsung Galaxy S7, Kindle Fire, Samsung Galaxy Note Edge (AKA Note 4 Edge), Asus Zenfone 2,  OPPO F1 Plus, and Huawei Mate 8.

USB flash drive formatted FAT32

I reformatted the USB drive as FAT32 (using a third party tool, as Windows won’t do it) and tried it again on the devices that had problems with exFAT. The good news is that the Raspberry Pi and my laptop running Ubuntu were able to read the USB drive without any problem. Which is to be expected really. Also my Sony TV had no trouble with the FAT32 formatted USB drive. I did a quick couple of tests to make sure that some of the Android devices could still read the flash drive using an OTG cable, and they could. The only device that still didn’t want to read the drive was the Moto G running CM 12.

microSD card formatted exFAT

For the next two tests I used a 128GB SDXC microSD card. For the first test it was formatted as exFAT. I copied over some files and then tested the card in a range of different devices. Starting with what didn’t work, the SD card wasn’t recognized by the Xiaomi RedMi Note 2, the ZTE Star 2 nor the Elephone P6000. The latter two are running Android 4.4. KitKat.

128GB-microsd-card-16x9

However the card worked perfectly on a bunch of other Android devices including the Huawei P9, the Samsung Galaxy S7, the Huawei Mate 8, the Galaxy Note Edge, the Moto G (2015) running CM 12, the ASUS Zenfone 2, the OPPO F1 Plus, Samsung Galaxy S3 Neo, and my Samsung Chromebook.

microSD card formatted FAT32

I changed the format of the microSD to FAT32 and tried the devices that didn’t previously recognize the card and the good news is that they worked! The Xiaomi RedMi Note 2, ZTE Star 2, and the Elephone P6000 all mounted the card and where able to read the files on it. As a side test, I reformatted the card again as exFAT an put it back into the Xiaomi RedMi Note 2. As before the card wasn’t recognized, however there was a option to reformat it. When I did the RedMi Note 2 reformatted it as FAT32 and it worked!

redmi-note-2-with-128-microsd-16x9

I tried the FAT32 formatted card on a Raspberry Pi 3. The Pi was able to boot and install Raspbian (via NOOBS) from the card without any problems.

Wrap-up

So what does all this mean? Basically it seems that support for exFAT is the stumbling block for some devices. For a device to officially support large SDXC cards it must be capable of reading and writing to exFAT formatted media. During my tests I found several devices that don’t support exFAT and so don’t officially support SDXC cards over 32GB. However in every case where a device couldn’t access the 128GB card with exFAT, I was able to reformat the card as FAT32 and it worked, even in phones that were 2 years old and running Android 4.4 KitKat.

Bottom line, if you have a microSD card slot in your phone it will probably work with large (>32GB) SDXC cards and if it doesn’t then a quick reformat of the card to FAT32 will likely solve your problems. As for 2TB cards, when they do eventually come out, your phone should support those as well!