What sucks, who sucks and you suck

CyanogenMod: There and Back Again

CyanogenMod (CM) is an Android release based closely on the Android
Open Source Project (AOSP) source code from Google. It offers an
alternative to the stock Android experience on most vendor phones.

If none of that makes sense, stop here.

On my Samsung Galaxy S2 I9100, I migrated to CyanogenMod 10.1 in January
due to frustrations with the existing stock ICS firmware, and reverted
back to stock - with some regret - four months later due to the
availability of an updated JB-based release from Samsung and lack of
support for a key feature I required in CM. This post is a summary of what
I learnt from the experience with some hopefully useful advice for others
contemplating the same route. This is not a guide and you should probably
call your mother at the very least before proceeding. It might be the last
time you have a working phone for a start. Disclaimer: I am not
a developer or an Android expert.

Why would you use CyanogenMod?

Because you want a ‘native’ Android experience without vendor bloat,
reskinning or add-ons.

Because your phone has no official update based on recent Android releases
(i.e. the original manufacturer has abandoned it in favour of more recent
models), or you wait too long for vendor updates.

Because you’re the kind of person who can never settle for the default
and you’re not scared of a little instability or the risk of bricking your
phone.

Because you have an old(ish) Android phone lying around and you’re bored.

Why would you not use CyanogenMod?

Because you need your phone to Just Work (or some approximation
thereof), and you want to be able to call the people who sold it to you
if it stops working.

Because you know nothing about firmware, flashing, ROMs, RILs,
basebands, bricking or just how little your needs matter to the CM
developers.

Because some feature of your phone that is key to you is not supported
very well/at all by CM (see below).

Because you don’t want to devote a small but not negligible percentage
of your life to tracking nightly releases and issues. (Remember: it’s only
free if your time is cheap.)

Why did I switch to CM? Because I was fed up with Samsung’s poor ICS
release (4.0.3), particularly its spectacular lags and the bug that
meant you couldn’t disable and re-enable wifi without chewing up most of the
battery and then locking or crashing the phone. And mainly because there
seemed to be no sign of a followup release to fix these issues (I’ve since
learnt that you can flash a later international variant release instead
of waiting for your carrier to provide one).

So your first job is to check the state of play for CM on your device. To
be clear: there is currently no ‘stable’ or even ‘milestone’ release of CM
10.1 (for the Samsung Galaxy S2 at least), nor is there ever likely to be
for reasons explained further below. What you get are a succession of
‘nightly’ releases with varying. but hopefully trending upwards,
degrees of stability.

There used to be a ‘Known Issues’ wiki page for CM 10.1 on the Samsung
Galaxy S2, but it appears to have gone away. Perhaps that’s just as well,
because one of the issues it listed, just under “TV Out doesn’t work”, was
“some audio features not supported”, which was sufficiently vague to be
misleading. Specifically, auxiliary audio output
via the official Samsung car dock does not work (as you can discover
from the XDA forums). Had I known this in
advance, I would not have used CM, because one of the main uses of my
phone is listening to my music collection during my commute. (The official
car dock is probably the killer feature for the SGS2, because once
you’ve heard the audio from the auxiliary output, via the USB connector,
you won’t ever want to go back to the standard headphone jack. The latter
offers a much lower signal level and, presumably due to poor shielding,
exhibits bad interference from the engine.)

So, if you value TV Out or aux audio from your S2, don’t use CM. Why don’t
these features work? Because every Android release relies on something
called the HAL (Hardware Abstraction Layer), which is code that allows it
to interface with the specific hardware features of the device. For
previous ICS-based releases such as CM10, the CM developers relied on
integrating “binary blobs” from Samsung and hence were able to support the
features of the hardware. These no longer work for Jelly Bean-based
releases and, as
Samsung have not released the source code for them, the CM Team Hacksung
developers have had to hack together best-guess workalike substitutes.
While these appear to work tolerably well - far better than they ought in
the circumstances - the hardware support they offer is necessarily partial
and some of the lesser-used features (especially if not used personally by
any of the devs) are not supported. This affects:

Graphics: no Jelly Bean ‘Project Butter’ rendering due to limited GPU
support (although CM10.1 is still surprisingly smooth considering this).

GPS: could be less accurate than stock.

Camera: still new features and resolutions being added, overall quality
likely not as good as stock, several bugs along the way.

Audio: as above, and again output quality not as good as stock, plus
some corner cases like the CM DSP Manager not being supported by some
music players.

Note: there are many Android Jelly Bean ROM variants (Jelly Bam, ReVolt,
etc.) and alternative kernels (Siyah, Dorimanx, …). If they’re based on
AOSP or CM, as nearly all of them are, they will have the same issues
above on Samsung Exynos-based devices.

For a glimpse of the HackSung team’s own private hell created by this situation,
see this post.
Or this post,
in which one of the main Samsung hackers pretty much renounces the company
and all their works. Moral: Samsung make great hardware but their
software is a shitpile and they are unrepentant about it.

You best bet to ascertain the current state of CM is to track the tail end
of the nightly discussion thread of the CM release for your device. Note
that some devices like the S2 can have many minor hardware variations and
model numbers; confirm that you are following the thread for your
specific model, e.g. I9100, I9100G, I9100T, etc. (Yes, I followed the
I9100G thread by mistake for too long.) This is visible in the thread
title. For example, here’s the [ROM][GT-I9100][JB][4.2.2] CyanogenMod 10.1 official nightlies // discussion thread.

Say you decide to go ahead anyway: what do you do?

Back your device up.

No really, back it up.

Read everything you can find about CM on your device, including the
wiki, the nightly thread, the recent changelog and at least 2-3 different
howto articles on installing the firmware. I used guides from
http://www.android.gs/ and http://www.ibtimes.co.uk/.

The guides I followed suggested first rooting the phone, which involves
finding a download of a hacked version of your current (stock) firmware
with a rooted
kernel and installing that using a Windows utility called Odin, with the
phone in Download Mode. This allows you to install the custom ClockWorkMod
Recovery bootloader, from which you can install a CM build. However, this
route is now deprecated in the CM wiki, which suggests simply installing
CWM Recovery via the Heimdall utility that talks to the Download Mode on
the I9100.

Once CWM Recovery is installed, use the backup option to create a
‘nandroid backup’ of your device. Boot the device and copy the output
archive off somewhere safe. This is your last resort, complete
backup/restore point.

Now you can copy the CM build files to the
phone storage (internal or external SD card), plus the matching Google
Apps archive (gapps), which is supplied separately because it isn’t open
source. Reboot into CWM and use that to install the ZIP archives.

Use the ‘Wipe disk cache’ option.

Important bit: if converting from firmware of a different release tree
(e.g. stock to CM or vice-versa), you must at this point use the ‘Wipe
data/factory reset’ option. This will remove all the apps and user
configuration from the device (though not your music or photos). For the
most part, this is not a concern as the apps can be redownloaded from the
Play Store and your data should be
sync’ed to Google’s cloud. However, you will need to re-enter all the
app-specific configuration later. This is the single biggest pain point in
moving between Android ROMs, especially if you tend to tweak the config of
everything you use. There are apps that can back up app configs,
such as Titanium Backup - but the CM guys have specifically cautioned against
them. At the very least, I suggest you install and use a password keeper
app that backs up to the cloud, then you can download that first and use
it to recover the login details for all your various cloud apps (Twitter,
Facebook, Pocket, etc.). Memo to Google: Android 5 needs to have a central,
generic cloud-based repository for application config.
Note that you don’t usually need to perform a factory reset if updating to a
release within the same stream (e.g. new CM nightly).

Potentially, update your modem firmware. The modem (radio) is the bit
that does mobile data (3G, etc.). Each Android release includes a RIL
(Radio Interface Layer) library that talks to the modem. The RIL and modem
versions need to match, otherwise you can experience odd signal drops and
increased battery usage. So if the latest CM10.1 nightly includes (say)
RIL XXLS6, you should be using modem firmware XXLS6. Install the GetRIL
app and use it to check your current RIL and modem versions. If they
match, sweet. Otherwise, you need to download the ZIP archive for the
modem version that matches your current RIL. (Don’t let GetRIL update the
RIL; i.e. you should match the modem to the current RIL rather than
vice-versa, since the RIL is matched to the ROM.) You can find various
download repositories of modem software in the CM threads. The version you
need may be specific to your region.
Like any other CM update, install the ZIP using CWM Recovery. (This is an
example of the pain you avoid by sticking to stock firmware.)

Keep following the CM nightly thread and changelog and occasionally
update to the latest nightly, either at weekly/monthly intervals or
whenever it looks like a sufficiently important or useful fix has gone in,
and the feedback from the forum is basically good.

(This is intentionally not a comprehensive guide and if it reads like
gibberish to you, Do Not Do This.)

Note that the CM threads on XDA are basically the Wild West and you will get
pretty short shrift for any hint of entitlement or poor attitude in
seeking help, particularly if it looks like you haven’t done the bare
minimum to solve any problems yourself first. Understand that the CM devs
are volunteers who do this for fun(?), and they don’t need outside
pressure. Also, the responses to any complaints about problems with
CM generally fall into one of three categories:

people who haven’t experienced the same problem;

people who have experienced the same problem and have a workaround that
won’t work for you;

people who tell you to try ROM x or kernel y because they’re, like, sooo
much better (but don’t really have anything to do with your problem).

This is not surprising, as there are sufficient variations of these
devices, each with their own quirks, being managed by a wide spread of
users with individual and widely varying usage patterns and ability.
Obviously, you’re going to get a variety of odd errors that aren’t
immediately replicable - and that the devs won’t care about anyway.
If the issue is yours though - well, sucks to be you.
(Similarly, the car dock audio problem remains unresolved because none of
the devs use a dock and none of the users with one - including me - have
sufficient time and skill to obtain the info that would make it
trivial to fix.)

As a rule of thumb, any issue that appears to hit every recent poster on
the forum is probably a real issue. Anything that only occurs to a small
number of isolated posters probably won’t affect you - but don’t assume it
definitely won’t.

What is CM like in use? If you like unvarnished Android, and most people
probably would if vendors gave them the chance, it’s really, really nice.
Sleek, minimalist, intuitive yet powerful. Lots of nice features,
like the quick settings access. Reasonably smooth, although I found on
the S2 that it was often slow to notice touchscreen taps or sometimes
misinterpreted them (so that instead of your tap activating something, it
merely moved it). Samsung’s ICS release was horribly laggy, usually taking
a second or two to respond to any interaction, but CM generally displayed
much less resistance. The Holo theming throughout and the lack of any
vendor-supplied bloatware were welcome.

Why then did I abandon it? Mainly due to the aforementioned missing car
audio, which clearly wasn’t going to be fixed any time soon (I don’t
begrudge the developers this and wish I could have assisted). Also, I
recently experienced random wifi dropouts and connection failures, while
users were reporting crashes with more recent nightlies. This coincided
with the availability of an official Jelly Bean stock firmware
release from my local carrier (after nine months of waiting). Gritting my
teeth, I reflashed back to stock and went through the tedious business of
reconfiguring all my apps (note to self: take screenshots of your home
screens so you can remember how they were organised before doing this).
Samsung’s Touchwiz UI isn’t any prettier, but adding a third party
launcher such as Apex and a widget utility like AntTek makes the phone
work bearably most of the time. It is at least less laggy than the
previous ICS release, and Samsung have even fixed the battery leak in the
most recent Nordic release (XWLSN), although not apparently some of the
random hangs and reboots. In-car audio, needless to say, is
larvely - how I’ve missed it. (How can I ever use a phone without a
dedicated dock or aux output now? But how can I ever put up with Samsung
again??)

Would I go back to CM if the audio issue was fixed? Possibly - rather have
a new phone without all this hassle though.

How do CyanogenMod and stock compare?

Speaking only for the Samsung SGS2:

CyanogenMod is based on JB 4.2.2, whereas stock is currently JB 4.1.2;
in practice, the differences between the base releases are minor.

CM generally has better battery life, probably because it’s
more efficient and has less crapware included.

Stock is smoother, but that isn’t to say CM feels rough by comparison.
Subjectively, stock is more responsive once in an app, while CM switches
between them quicker. CM’s touch responsiveness is slightly poorer.

Audio and graphics are better in stock; quelle surprise.

CM’s interface is much, much nicer. Vendors reskin Android for many
reasons (of which creating a better design standard than Google isn’t
one), none of which ultimately benefit the consumer.

Featurewise, I’d say they’re pretty even if not directly comparable.

If you’re capable of flashing it, don’t want specific features that CM
doesn’t support and can find a reasonably stable nightly release without any
bugs that concern you, CM is the better firmware overall.

There’s more chance of the CM team addressing overall stability and
performance issues in a timely manner than Samsung. Neither of them are
guaranteed to address your specific bug at all - but at least someone on
the XDA forums will take the time to tell you they’re not interested.

Almost certainly, neither of them are going to support Android 5 on
this device.

Update, 2013-06-12: If you want the stock firmware experience but
without the bloat, you could also try
NeatROM Lite.
This is the way I would go if I could face the rigmarole of
wipe/reconfigure again.