New Features:

  • FIXED boot errors
  • FIXED governor profiles (see below), 23 included for reference
  • linux-stable upstream merged
  • KCAL, misc, and KSM tweaks from Franco Kernel

Continued Features:

  • Forked from CopperheadOS angler kernel
  • Flashed with AnyKernel2 by osm0sis
  • Open Source: kernel source; packaging (anykernel)
  • My personal init profiles as well as dozens from around the web.
  • Many parts and features from Flash Kernel and Franco Kenrel
  • fiops I/O scheduler
  • TCP alogrithms (for congestion control): bic, cubic, highspeed, h-tcp, hybia, illinois, lp, reno, scalable, vegas, veno, yeah, westwood (default)
  • touchboost disabled (in init profile)
  • removed secure boot and dm-verity checks
  • wakelock control: wireless driver wakelock and wakelock period
  • wakelock control: remove unecessary wakelock gestures
  • fixed possible bluetooth memory leak fix and driver bug
  • Faux Sound Control support
  • KCAL color control
  • Spectrum profile support

Download from Android File Host

News: Boot Issues

In my last release post, I published an update detailing boot issues dating as far back as the 201803 release. Effected, non-booting versions include:

  • 201803
  • 201804
  • 201805
  • 201806-sz-bal
  • 201806-sz-btr

201806-fk did boot, but init profiles / ramdisk changes were not being applied. The more “fixing” I did, the more breaking I did, so I completely reverted to the base AnyKernel2 by osm0sis which brought my kernel’s packaging up to speed with the master repository. I then took a closer look at some of the Spectrum profiling process (below).

News: Franco Kernel vs CopperheadOS

I started building this kernel as a fork of CopperheadOS in order to prize security. Technically I started as a fork of Flash Kernel, and moved to Copperhead after that kernel stopped development. At any rate, a quick look at GitHub reveals the following most recent commits to the respective kernels’ source code:

Franco Kernel 4 days ago
Linux Stable (angler) 14 days ago
CopperheadOS 9 months ago

9 monts?! That is frustrating when Nexus / Pixel lines are getting monthly security updates already – though it looks like some individual files have been updated more recently for CopperheadOS. There was a more recent branch in CopperheadOS’s GitHub (oreo-m3-release), though it seems their repositories have been redirected to AndroidHardening – as you’ll note if you clicked the link above. However, that oreo-m3-release branch has since been deleted.

As such, I’m considering moving to Franco Kernel as a base since it is much mor eactively maintained. That said, most of my work has taken place in the form of init profiles. The actual kernel code changes were mostly cherry picked from the likes of… you guessed it… Franco, Flash, Electron, and a few other well established kernels.

News: Spectrum Profiles

I dug in to learn more about how Specturm (profiles) work and learned several things.

First, any profiles that are applied in the source code are overridden by the selection made in the Spectrum app once the device reaches it’s userspace.

Second, I had never published instructions on how to contribute profiles my index. I have mentioned in previous posts that it’s been my experience that applying these at boot time is more efficient than using a third party kernel monitoring appy to constantly check and apply the settings. (instructions below)

Third, this effort to make kernel profiles scalable is somewhat overridden by the fact that Spectrum Injector is capable of loading profiles from your sdcard / internal storage. Much the same, a currently unreleased app by the Spectrum developer(s) to load profiles from the userspace is available for beta testing in Google Play. So, contributing more profiles to my source code may soon become futile.

Adding Profiles: I am very open to pull requests. However, you should know that the Spectrum app only reads the frist four presents. While the app names them “Balanced”, “Performance”, “Battery”, and “Gaming” you can of course name them whatever you’d like in the source code. In theory you can set the profile in file, however this does not seem to work as reliably as in previous versions.

If you’re still reading, then the benefit of doing this is that you don’t have to mess with “heavy” coding of the kernel and can simply add your tweaks by:

$ git clone
$ cd anykernel
$ git checkout angler-personal

From there, you can view ramdisk/ and change the numerical value on line 8 to the corresponding indexed profile you wish to use. For convenience, all of the profiles in init.spectrum.rc.

Next, add your settings to init.spectrum.rc. There are plenty of examples for you to learn to write the settings. You will also need the on property... value to match the value listed in the index of Again, remember, only the first four will be available to the app (e.g. can be switched in user space).

# commented name of you and your profile
on property:persist.spectrum.profile=0
  write /path/to/setting value

Finally, zip it up and flash it!

$ rm *.zip    # removes last version
$ zip -r9 * -x

NOTE: Profiles from Flash Kernel require the Flash governor which has not been implemented yet. The profiles exist for reference only.

Savagezen's Blog

A minimalist guide to my many projects.