Building Nile SODP Kernels

Recently I decided to do some personal kernel work on my discovery, aka Sony Xperia XA2 Ultra, which is part of the “nile” family of devices. I use the Sony Open Device Project trees and kernel, because regardless of what they think of me, I think they do exceptionally great work.

Unfortunately, the SODP build instructions for kernel building are just a little out of date, as Google has depreciated using GCC in favor of Clang. If you built your kernel for a nile device with clang, it will actually have issues with the camera, as you can read about in the issue tracker for SODP.

So, since I walked through it, I decided I would write down what I did in case anyone else needs a little help with this. I’m writing it in the same order the SODP instructions use, so it will be very clear when reviewing with the written instructions on their website.

Step 1: Unlock the boot loader per the SODP instructions.

Step 2: Download a cross compiler.

This is the part where things go awry. If you follow the instructions, you get the version of GCC tool-chain that Google removed half of it’s contents, causing it not to work, since they are depreciating it. You need to download this version: because it is the last version to have all of the tools in it.

Also, while you are only compiling a 64 bit kernel, if you don’t have the 32 bit tool-chain, you will have to trick the compiler when compiling stand alone (e.g., outside of Android source code). So, I recommend you also download this 32 bit tool-chain to keep GCC and the scripts from trying to use your system one:

Both of these should be extracted into their respective folder. In my case I made the 64 bit one called android, and the 32 bit one called android32. You can name the folder anything you want.

Step 3: Export the cross compiler.

Again, this would work, except that as stated, the scripts will call for a 32 bit tool-chain version, so if you follow the steps exactly, you will be left unable to build until you either edit the arch/arm64/Makefile on line 83, or declare one from the get-go. I recommend the latter.

$ export CROSS_COMPILE_ARM32=/mnt/719a5453-f8d5-4282-b4d9-f73a127316da/SonyXA2ultraKernel/android32/bin/arm-linux-androideabi-
$ export CROSS_COMPILE=/mnt/719a5453-f8d5-4282-b4d9-f73a127316da/SonyXA2ultraKernel/android/bin/aarch64-linux-android-

Make sure you use your folder names and locations.

Steps 4 through 10 can be done per the SODP instructions.

Overall, it’s only 2 small steps that need a little tweaking, but it’s very difficult to get through it if you don’t know what to do. Hopefully this will help the next guy, and I hope the SODP will keep up their great work!

Linux – keep it simple.

Fix a Nabi Big 20 HD Tablet that cannot connect to FUHU servers!

I recently got a Nabi Big 20 HD tablet to use as a camera viewer in a nursery at our church. The only problem was, when I turned it on, it kept giving me an error, stating that I had to hook up to the wifi, and that the FUHU servers had a problem. Essentially, since Fuhu went out of business, you can’t connect to the fuhu servers.

Since you can’t connect to the servers, setup can’t be completed, and this 20″ tablet became a 20″ paperweight. Obviously, that would not do, so I figured out how to use fastboot mode, TWRP, and the advanced file manager to delete the unneeded junk to make the tablet functional again. Below are my instructions, performed from a Linux computer. You could do this from Windows as well, if you download the right tools.

Before you begin, you will need the TWRP recovery image, which you can get from here: or from

  1. Power off the tablet.
  2. Hold the volume up and power on buttons, and release them when you see the menu options.
    NOTE: This is actually fastboot mode!
  3. Perform an OEM unlock
alaskalinuxuser@alaskalinuxuser-OptiPlex-7010:~$ fastboot oem unlock
(bootloader) Showing Options on Display.
(bootloader) Use device keys for selection.
(bootloader) erasing userdata...
(bootloader) erasing userdata done
(bootloader) erasing cache...
(bootloader) erasing cache done
(bootloader) unlocking...
(bootloader) Bootloader is unlocked now.
OKAY [ 13.625s]
finished. total time: 13.625s
  1. After this it reboots and starts up again, so power off the tablet.
  2. Hold the volume up and power on buttons again, release them when you see the menu options.
    NOTE: Once again, this is actually fastboot mode!
  3. Flash the recovery image.
alaskalinuxuser@alaskalinuxuser-OptiPlex-7010:~/Downloads$ fastboot flash recovery recovery.img
target reported max download size of 643825664 bytes
sending 'recovery' (8646 KB)...
OKAY [  0.313s]
writing 'recovery'...
OKAY [  0.314s]
finished. total time: 0.627s
  1. From the still open menu, use the volume keys to scroll down to “recovery mode” and press the power button once to choose it. NOTE: it will show the NABI screen, then reboot into TWRP. Unfortunately, ADB does not work in this version of TWRP.
  2. Go to “Mount” and check “System” and then click to disable MTP.
  3. Press the home key or back key to get back to the main menu.
  4. Click “Advanced”.
  5. Click “file manager”.
  6. Scroll to “priv-app” and select it.
    Click on each of these items and choose to delete them:
    –Personally, I just deleted all “fuhu” apps in this folder, but I think you only need those ones.
    Then in the “app” folder, delete all the fuhu apps. Yes, I’m pretty sure you need to delete all of these ones.
  7. Select the home or back button to get to the main TWRP screen.
  8. Reboot to system.
  9. Enjoy!
    NOTE: It should start up, and may go through the Google setup (if you never started it before), and then will drop you off in “parent mode”.

At this point, I recommend installing a regular launcher, such as Trebuchet, Apex launcher, Nova launcher, etc. I used Apex launcher personally, because you can “hide” unwanted apps, and I use it to hide the unwanted Nabi apps. You should be able to see the Chrome browser in the parent mode window, use that to download the apk for the launcher you want (or use the Google account if you set up an account).

Once a launcher is installed, press the home key, and choose to always use the launcher you installed. You can now use this tablet as a regular Android tablet.

TWRP does have the option to install SuperSU and root the device. That’s completely up to you. Kingo Root also works incredibly well on this tablet. It will be stuck on Android 4.4.2, so it is a little outdated, but seems to work rather well. It was designed for gaming, so it is pretty powerful for as old as it is.

Linux – keep it simple.

Putting LineageOS on a Samsung Galaxy S9 (SM-G960F/DS)

LineageOS on the Samsung Galaxy S9

Recently, a friend of mine wanted to get away from the stock software of their phone, and asked for my help to install LineageOS. There were several write-ups about how to do this, so I’m just sharing my experience of making this process work, in case it is useful to someone else.

First things first, LineageOS says that you need to be on the latest Android 10 firmware for this to work. So, after getting the phone, I turned on automatic updates under software update and had to go through 4 rounds of downloading and installing the updates. This took a while on a 10 Mbps internet connection, about 3 hours. But finally, it was up to date from Android 9 to now be Android 10 with the latest firmware.

During this time, I also downloaded the latest LineageOS nightly and recovery for the S9. As seen from their site.

Now with the latest firmware, I enabled developer options by clicking on about phone, and multiple taps of the build number to enable developer options. I looked in the developer options for the OEM unlock option, but it was no-where to be found. Interesting…. But, a quick search of XDA revealed that you have to wait 7 days after enabling the developer options before you can see the OEM unlock option. However, a user, named altai1963 had a neat post about disabling automatic time updates and changing the date to be a month ago and tricking the phone that more than 7 days had passed. So, I used it, and sure enough, it worked like a charm.

I did notice though, that I didn’t need to follow all of the steps they had done. All I did was uncheck auto date/time, and set the date back one month. Then the OEM unlock option became available under developer options. After I clicked on it, it asks if you want to wipe all of your data and proceed, to which I said yes. The phone rebooted to the Samsung logo for a while with a blue flashing notification light. After about 4 minutes, it said “Android wirt restarten” and then rebooted in (I believe) German.

Fortunately, Australian English was an option from the drop-down, as was Canadian English, so I went with my old friends the Aussies and clicked through the startup screens, choosing to skip setup of anything, since I was about to wipe it anyways to install LineageOS.

Now the fun begins….

I powered off the phone from the menu, and then held Volume down, the Bixby button, and Power button to power it on. Within a second, the screen was green with a download icon and lots of text, so I released all of the buttons, and per the on screen instructions, pressed volume up to allow changes.

Per LineageOS’s instructions, I tested that Heimdall (which was already installed on my Linux computer) was working and compatible with the phone:

$ heimdall print-pit
Heimdall v1.4.1

Copyright (c) 2010-2014 Benjamin Dobell, Glass Echidna

This software is provided free of charge. Copying and redistribution is

If you appreciate this software and you would like to support future
development please consider donating:

Initialising connection...
Detecting device...
Claiming interface...
Setting up interface...

Initialising protocol...
Protocol initialisation successful.

Beginning session...

Some devices may take up to 2 minutes to respond.
Please be patient!

Session begun.

Downloading device's PIT file...
PIT file download successful.

Entry Count: 32
Unknown 1: 1598902083
Unknown 2: 844251476
Unknown 3: 21324
Unknown 4: 14665
Unknown 5: 12600
Unknown 6: 48
Unknown 7: 5
Unknown 8: 0

--- Entry #0 ---
Binary Type: 0 (AP)
Device Type: 8 (Unknown)
Identifier: 80
Attributes: 2 (STL Read-Only)
Update Attributes: 1 (FOTA)
Partition Block Size/Offset: 0
Partition Block Count: 1024
File Offset (Obsolete): 1
File Size (Obsolete): 0
Partition Name: BOOTLOADER
Flash Filename: sboot.bin
FOTA Filename: 
----- Edited for breivety ------
--- Entry #31 ---
Binary Type: 0 (AP)
Device Type: 8 (Unknown)
Identifier: 25
Attributes: 5 (Read/Write)
Update Attributes: 5 (FOTA)
Partition Block Size/Offset: 1697152
Partition Block Count: 0
File Offset (Obsolete): 0
File Size (Obsolete): 0
Partition Name: USERDATA
Flash Filename: userdata.img
FOTA Filename: remained

Ending session...
Rebooting device...
Releasing device interface...

And then the phone rebooted. So I shut down the phone again, and again went into download mode by pressing Volume down, the Bixby button, and Power button to power it on. Again, the screen was green with a download icon and lots of text, so I released all of the buttons, and per the on screen instructions, pressed volume up to allow changes.

Now from my computer terminal, I typed:

$ heimdall flash --RECOVERY ./lineage-17.1-20200615-recovery-starlte.img --no-reboot
Heimdall v1.4.1

Copyright (c) 2010-2014 Benjamin Dobell, Glass Echidna

This software is provided free of charge. Copying and redistribution is

If you appreciate this software and you would like to support future
development please consider donating:

Initialising connection...
Detecting device...
Claiming interface...
Setting up interface...

Initialising protocol...
Protocol initialisation successful.

Beginning session...

Some devices may take up to 2 minutes to respond.
Please be patient!

Session begun.

Downloading device's PIT file...
PIT file download successful.

Uploading RECOVERY
RECOVERY upload successful

Ending session...
Releasing device interface...

Now the phone showed a load bar across the screen. It was finished as soon as I saw it, so it was pretty fast. Then, I unplugged the USB cable, and per the instructions on the screen, held Volume Down and the Power button for 7 seconds to get out of download mode. As soon as it switched off, I held the Volume Up button with the Bixby button, and the Power button to go into recovery mode. This is important, because if you let it boot all the way into the stock ROM, it will wipe the recovery you just loaded. After a second or two, I could see the pink LineageOS recovery screen, and I plugged back in the USB cable to the computer.

On the phone, I used the volume keys and power button to select “Apply update” and “ADB sideload”. Then, on the computer terminal, I typed:

$ adb sideload ./
serving: ‘./’ (~17%)

To which it proceeded to 47%, and the phone screen had small white text at the bottom with status, eventually stating “script succeeded: result was [1.000000]” and giving me a prompt back on the phone screen and computer terminal.

At this point, I could install Magisk or Gapps, but in this case the owner of the phone wanted to install only LineageOS. So, I pressed the back arrow at the top of the phone screen, and tapped “Reboot System Now”. The phone rebooted and immediately showed me the LineageOS boot logo, and then a pop up asking me to wipe all encrypted data. I said yes, the phone rebooted to wipe the data, then rebooted back to LineageOS. Success!

One final note, when I started this process, the battery was at 100%, but by the time I finished, the battery was down to 67%, so be sure to fully charge the phone before you start this process, if you intend to follow along.

Linux – keep it simple.

Install μlogger on CentOS 7 Server

If you are unfamiliar with μlogger, it is a handy Android application paired with a self hosted server application to keep track of your location. Or, in the author’s own words:

μlogger (‘micro-logger’) is an application for continuous logging of location coordinates, designed to record hiking, biking tracks and other outdoor activities. Application works in background. Track points are saved at chosen intervals and may be uploaded to dedicated server in real time. This client works with μlogger web server. Together they make a complete self owned and controlled client–server solution.

You can actually just use the app on your phone to record yourself walking, biking, flying, etc., and then save your track as a gpx file for editing or viewing on any supporting app on your phone. But, if you wanted to save your adventures easily, or keep your adventures updating live for someone you know to view, then you can use the web server application as well. It works incredibly well, and if you are out of cell/wifi range, it will update with your personal server once you return, which is very useful.

The only problem was, while it had clear instructions for installation, they were written for someone smarter than me, so it took a bit of work to get it set up on my home CentOS 7 server. Hopefully, by writing this down, others can save themselves a little bit of a headache.

First, I would like to mention that this assumes you already are running a web server on your machine. In my case, I am running the Apache web server. So, I wont cover web server installing and setup here, but there are some great tutorials for that out there, like this one.

The instructions look like this, per the

  • Download zipped archive or clone the repository on your computer
  • Move it to your web server directory (unzip if needed)
  • Fix folder permissions: uploads folder (for uploaded images) should be writeable by PHP scripts
  • In case of development version it is necessary to build javascript bundle from source files. You will need to install npm and run npm install and npm run build in root folder
  • Create database and database user (at least SELECT, INSERT, UPDATE, DELETE privileges, CREATE, DROP for setup script, SEQUENCES for postgreSQL)
  • Create a copy of config.default.php and rename it to config.php. Customize it and add database credentials
  • Edit scripts/setup.php script, enable it by setting $enabled value to true
  • Make sure you have a web server running with PHP and chosen database
  • Open http://YOUR_HOST/ulogger-server/scripts/setup.php page in your browser
  • Follow instructions in setup script. It will add database tables and set up your μlogger user
  • Remember to remove or disable scripts/setup.php script
  • Log in with your new user on http://YOUR_HOST/ulogger-server/
  • You may also want to set your new user as an admin in config file.
  • Folders .docker/ and .tests/ as well as composer files are needed only for development. May be safely removed.

The biggest headache that I ran into was that the minimum requirement was for PHP 5.5, and CentOS 7 only comes with PHP 5.4 by default. However, that was easily fixed as root:

yum update
yum install
yum install
yum install yum-utils
yum-config-manager --enable remi-php55 [Install PHP 5.5]
yum-config-manager --enable remi-php56 [Install PHP 5.6]
yum-config-manager --enable remi-php72 [Install PHP 7.2]
yum install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo

This updated PHP to version 7.2, so you could skip that line if you didn’t want it, but I figured it might save me from having to update it in the future, so I went with it. Note that I did have to test out my other server functions that use PHP to make sure they were compatible.

After getting PHP up to date, I then downloaded the μlogger server repository from GitHub. It is pretty small, and only took a few seconds, even on my slow 10 mb internet to download it. I extracted in place, and went to work in the terminal, moving it to my web server location and giving it the proper ownership:

cd Downloads/
cd ulogger-server-master/
mkdir /var/www/html/ulogger
cp -Rav ./* /var/www/html/ulogger/
cd /var/www/html/
chown -R apache:apache ./ulogger
cd ulogger/

Now that it is in the right place, I needed a database for it to work with….

mysql -u root -p
enter password:
MariaDB> create database uloggerdb;
MariaDB> grant all privileges on uloggerdb.* TO 'EDITED_USERNAME'@'localhost' identified by 'EDITED_PASSWORD';
MariaDB> flush privileges;
MariaDB> exit

Keep in mind, the author of μlogger only suggests a few privileges, which he states in his read me as “(at least SELECT, INSERT, UPDATE, DELETE privileges, CREATE, DROP for setup script, SEQUENCES for postgreSQL)” however, as I monkeyed around with this, the script only seemed to run when I gave my user all privileges. Not sure if that’s just me, but here’s what I did, and praise God, it worked, because I was getting a little frustrated at this point. This write-up is the end result, not the “how many times I failed setting this up” story….

Now I needed to proceed and make a copy of the config file and edit it per the instructions:

cp config.default.php config.php
nano config.php
cat config.php 

/* μlogger
 * Copyright(C) 2017 Bartek Fabiszewski (
 * This is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <>.

// This is default configuration file.
// Copy it to config.php and customize

// Database config

// PDO data source name, eg.:
//$dbdsn = "mysql:host=localhost;port=3306;dbname=uloggerdb;charset=utf8"
//$dbdsn = "mysql:unix_socket=/tmp/mysql.sock;dbname=uloggerdb;charset=utf8"
// pgsql:host=localhost;port=5432;dbname=uloggerdb
// sqlite:/tmp/uloggerdb.db
//$dbdsn = "uloggerdb";
$dbdsn = 'mysql:dbname=uloggerdb;host=';

// Database user name
$dbuser = "EDITED_USERNAME";

// Database user password
$dbpass = "EDITED_PASSWORD";

// Optional table names prefix, eg. "ulogger_"
$dbprefix = "";


The key part that went wrong here, was that there were several examples of how to set the “$dbdsn” or database name and location. I tried the ones included in the file, but none of them worked, so I web searched and found this line worked: $dbdsn = ‘mysql:dbname=uloggerdb;host=’; so that is what I used in the end, instead of any of the included examples.

Now I needed to enable the setup script:

nano scripts/setup.php 

.... edited for space ....
// This script is disabled by default. Change below to true before running.
$enabled = true;
.... edited for space ....

With the setup script enabled, it was now time to get started! I opened https://EDITED_HOST/ulogger/scripts/setup.php page in my browser, and followed the on screen instructions, logging in with the username and password I made earlier, and everything went smoothly! Keep in mind, once the setup is done, you need to delete or disable the setup script to prevent it’s future use. So I just deleted it. Here is the end result when you bring up the web page https://EDITED_HOST/ulogger/

Sorry, I blurred everything out because I didn’t want any uninvited house guests! 🙂 If you want to see a great demo of it from the author, though, you can check it out from his web server on Heroku. Here’s a screen shot of it:

The mobile app is very simple to setup. Under settings, you simply input the username, password, and URL for your web server. You can then choose if you want it to auto upload as you go, or you can update it manually by pressing an upload button on the main screen.

I thought it best to mention that the original user you make is an administrator, and can edit several settings. I recommend that you make a new user with lesser credentials (non-admin) for use with the phone app. When you are logged in as the administrator (the first account you made) you can choose to make new users. This allows you to have lesser accounts for daily logging of activity. It also is handy if you are using this for your company as a way to track drivers/workers or if you have multiple family members, because everyone can have their own username and password.

Hopefully, this will save others using CentOS 7 a little bit of time to set this up!

Linux – keep it simple.

Ship, Captain, and Crew: Ready to set sail!

Well, for better or worse, it’s finally finished! That’s right, my first, from scratch, no tutorial, 3D dice game, “Ship, Captain, and Crew” is now in Beta stage! Be sure to give it a try!

You can find all the source code here:

And you can download the Windows, Linux, and Android versions here:

Be sure to let me know in the comments if you find any bugs or have any suggestions. The game is not really for playing by oneself, although there is a player vs computer setting. However, the key point of this game is a sort of paper/rock/scissors game with your friends when you need to decide something, like who’s buying, or who gets to pick where/what/etc. next.

You can also read the official rules on Wikipedia, which my game follows. I mention this, because some play where you must roll a 4,5, then 6 for ship, captain, and crew, and others play 6, 5, then 4 instead. Either way, the mechanics of the game are the same, just which order you must roll the dice. In this game, I set it to follow the official 6, 5, and 4 rule-set.

Let me know if you tried it out!

Linux – keep it simple.

Which 3D engine to use?

Well, it’s time to pick which engine/sdk I am going to use to make my dice game.

Now the big question is what game engine to use. There may be many to choose from, but from a mobile app perspective, there seem to be only 3 that I would want to use. Of course, I’m ruling out Unity, because it is not open source. I’m trying to make an open source game, and I’d like to use open source tools so that anyone can openly tinker with it. I’m also ruling out several that work for Android, but the sdk is only available on Windows computers (irrlicht for example). That leaves the three main options of LibGDX, GoDot, Ogre, and jMonkeyEngine. There may be others, these are just the ones I know about.

Above is the quote from my post last week. I needed to do some research to decide which 3D engine and SDK (software development kit) to use to make my game. As I said, I’m sticking with open source tools, so that ruled out Unity and several other big name brands of SDK’s. I also am using a Linux computer, so it can’t be an SDK that only works on Windows or Mac. So, that leaves me with four main options that I could come up with. Obviously there are more options out there, but I’m trying to stick with ones that meet these criteria:

  1. Active development – Something that is still modern and will get updated over time, so I don’t have to learn a new SDK after I get the hang of this one.
  2. Guides and example code – I’m new to this, so I need it to have plenty of examples and guides to springboard off of.
  3. Active community – A place where I can go to ask questions if I get stuck.
  4. Easy Android integration – The whole point of this is to make an Android game, so it should be easy to get to that point.
  5. Java or C++ compatible – I don’t want to learn ANOTHER programming language just to make this game. I want to use and improve the tools I already have.
  6. Easy to use – It needs to make sense to me, or it will not work. If the API calls are ridiculous, I wont accomplish much.

So, with those in mind, I have sorted it out between my top four choices. Before I get to that, though, there are a lot of other options, but they don’t meet the above criteria, so I couldn’t spend my time on them, even though they may be great engines to use. That said, here is the breakdown of my thoughts on the top four choices, and what I plan to do. It’s not really a review, just my thoughts on what to do.


I’ve actually used libGDX before, to make my open source game “Critical Velocity“, which was a 2D side scrolling space ship game similar to flappy bird. It does have an active community, is still being developed, and has lots of guides and tutorials and example code to draw from. It doesn’t have an SDK, you just add the java libraries to your app and use your standard Android SDK platform to build it, which is a big plus.


The only downside is that it is made for 2D games with 3D kind of as an add on, which seems to still be under development. But, I would be familiar with it, since I’ve used it before, albeit for a 2D game. It also doesn’t have an “SDK” it is rather a library that you add to your own app.


There are quire a few perks to using jMonkeyEngine, it is actively being developed, and it seems to have a pretty good community behind it. There seem to be a lot of guides, documentation, and explanation of methods and classes, which is super helpful for me. It also seems to be a well fleshed out 3D engine, with a sustainable future and some neat features, most of which I am too new to understand. All the programming is done in Java, which is a plus for me, since it is a language that I am already familiar with.


I am not sure if I can see a downside to using this setup. It seems to be pretty solid, there are a lot of indie games made with it, and it even has book tutorials on Amazon, so this might be a good direction to go. I tried it out a little bit, and got confused right off the bat, but I’m not sure it that’s because of the interface, or because I am new to 3D game development.


Next up on the list is Godot. Hailed as “the game engine you waited for”, it seems pretty impressive. With a super permissive MIT license, an attractive interface, a visual editor, and full c++ support, this sounds too good to be open source true.


The only concern I have is that it will require some other languages as well. It seems to support c++, of which I am only a beginner, but used to. Yet it also uses GDScript as well, which is an open source scripting code they made just for this development SDK. Where I see that as a problem is it will probably only be useful inside of Godot.


Last up is Ogre. Ogre seems to be very actively developed at the moment. So active, that it appears to have created some sort of rift between the different versions. From what I can gather by doing a little research (just my opinion based on what I saw), there is the old version Ogre1, which you can use to make Android games, and the new version OgreNext, which only works in Windows and Linux for now, with hopes of adding Android later.

If you use Ogre1, it appears to be more of a library that you add, like libGDX, but if you use OgreNext, it seems to be a full fledged SDK. So, I’m not sure about how I would want to use it.

It also appears that Ogre1 and OgreNext do not work the same, so if I learn Ogre1 to build my Android games, will I need to relearn OgreNext so I can continue with that in the future? Perhaps that’s just my perception, but my perception being my reality, I don’t think I can put in double the effort to learn how to make 3D games.

Final result

I think I am going to give Godot a try. However, if it doesn’t work out, jMonkeyEngine is the runner up. Ogre seems to be undergoing some massive changes, and I’d like to work with something that is a bit more stable, but libGDX doesn’t seem to have all the “bells and whistles”, seeing that it is just a library to add to your current development.

I struggled this week between jMonkeyEngine and Godot, but in the end settled with Godot because the interface was so intuitive. I was able to walk through a few things in no time. Literally, within minutes and without any documentation, I loaded someone else’s project and was playing a game and editing code. I am also looking to expand my c++ skills rather than work on my Java. So, Godot it is, at least, for now….

Linux – keep it simple.

Dice, anyone?


Now that I’ve completed the low poly course from Udemy, I’m ready to start using my fledgling, but newfound skills in some form of application. That said, the most fun and easiest way that I can imagine using 3D models is in some kind of game. The question is, what to make?

If you’ve been reading this blog for a while, you may remember that I once made a dice game app called “Ship, Captain, and Crew”, based on the sailor dice game of the same name. So, I’ve decided to revamp that project by creating a 3D version of the app. Essentially, I’ll be starting from scratch, but utilizing the same game mechanics that are in the first game.

The two big things I think I will need are the 3D objects and then some form of 3D game engine to render it. Today I completed the first part, which was making the dice. It took me about an hour to throw this together, but I think it will do as a low-poly die for the game. In theory, I will just use 5 of them during the game itself.

Now the big question is what game engine to use. There may be many to choose from, but from a mobile app perspective, there seem to be only 4 that I would want to use. Of course, I’m ruling out Unity, because it is not open source. I’m trying to make an open source game, and I’d like to use open source tools so that anyone can openly tinker with it. I’m also ruling out several that work for Android, but the sdk is only available on Windows computers (irrlicht for example). That leaves the four main options of LibGDX, GoDot, Ogre, and jMonkeyEngine. There may be others, these are just the ones I know about.

So, now I need to do some research and see which one will work best for me. I’ve never made a 3D game before, so this might take a while….

Linux – keep it simple.

QFIL Sahara Errors


It sounds like some kind of desert problem, but QFIL is actually a tool that you can use to flash firmware on Qualcomm devices. I’ve made a YouTube video about using it as well as writing about it here on this site in the past. It’s a really simple tool to use, but it never ceases to amaze me at how much trouble it gives me every time I try to use it.

This time, I was trying to fix a BLU LifeXL and get it flashed back to stock. Unfortunately, after downloading the latest QFIL, it failed every time I tried to flash the firmware, telling me that “sahara” had failed:

ERROR: function: sahara_main:924 Sahara protocol error

Well, after spending a while fiddling with it, and searching the web, I found XDA post after post with people doing different things and solving their issues. Some had to unlock the bootloader, some had to get into download mode a different way, etc. But none of those helped me.

In the end, the real issue was that I needed to use an older version of QFIL. I started with version 2.7, but I finally got it to work by using version 2.0. So perhaps if you have a sahara error, you might check to see what version of QFIL you are using. I *think* that the old phone firmware was written back around QFIL version 2.0, and just wouldn’t work with the newer versions. But that’s the best I can figure of why it doesn’t work with the newer versions. It seems odd to me that you would need to know the specific version of QFIL needed for the specific phone firmware you have, but it seems to be the case.

Linux – keep it simple.

FreedomPop without Google Play Services?


Using FreedomPop without Google Play Services? I have been tinkering with this for a couple days now, and I finally got it to work. Of course, I’ve mentioned FreedomPop on the website before, but for those who are new to it, here is a brief description:

FreedomPop is a wireless Internet and mobile virtual network operator based in Los Angeles, California. The company provides “free” IP mobile services including free data, text and VoIP and sells mobile phones, tablets and broadband devices for use with their service.

Essentially, it is a phone company that you can use to get free calling/texting/data. When they say free, they actually “mean” it. I wrote an article about how to set it up and actually use it for free. It even works in Alaska!

Now that I’ve gone Gappless, which I’ve been really enjoying, I thought I would switch my old backup phone to be Gappless as well. For the most part, it was just sitting in a drawer, but I keep a FreedomPop sim card in it, so if I absolutely ever needed it, it was available in a pinch. Unfortunately, it was easier said than done to use FreedomPop Gaplessly. And it is a toss up if you consider it “working”.

After setting up the APN for FreedomPop, I can connect to the network, as you can see in the picture, I have over three bars of signal, and I can initiate data transfer. I figured the app from FreedomPop wouldn’t work, since it requires push notifications through Google Services, but I did try the FreedomPop app anyways, as well as several older/newer versions of it, just in case. This is the main feature that is not working. Without the app, you can’t use your FreedomPop phone number to make or receive call and texts.

So for many, going Gappless would make using FreedomPop a no-go.

There are, however, lots of Jabber/XMPP apps that work great without Google Services, and I figured I could just use that, for which the FreedomPop sim card still works great. Essentially, it just becomes a LTE data device.

I did a few tests, as you can see above, and managed to pull a speed test as well as browse the internet for a minute or two. By the way, Google’s home page is 1.4 MB. Then I searched for a speed test, which brought me to 3.4 MB, and then I ran the speed test, which took me all the way up to 9.14 MB of data. It is noteworthy to mention that the phone believes it only used 8.92 MB of data thus far, so there is a disparity between the two. If you are using the free plan and don’t want to go over, you need to make sure you are careful about your limits and warnings you set on your phone.

So, I downloaded Xabber, one of my favorite XMPP messaging clients, and went to work. Sending and receiving messages seems to be in the low kilobyte range, which is great. In four messages, I only used 10 KB of data. The only problem is, that you are using data consistently because there is no push notification, so your phone is checking the server for messages all the time. This check seems to take only kilobytes, but I decided to let it run for a while and see how that went. After 30 minutes, it only used 110 KB of data. In theory, that is 5.3 MB per day, or 159 MB per month, when sitting idle.

Of course, you could only use the service when you want to use it, and most of the time the spare phone is at home or work, so there is a constant and available WiFi connection, which negates the need for any data at all. There are also plenty of apps that allow messaging and VOIP calls as well. Things like AnTox and Riot come to mind. I do think the whole service would be better with Google Services installed, so you can use the 200 free call minutes, and the 500 free texts as well, but it is nice to have it as an emergency phone option, and it is nice to know that you can use the data, even without Google Services.

Linux – keep it simple.

Still Gapp-less?


Back in July, I decided to go Google App-less, or gappless. Cold turkey. No baby steps, just quit using Google Apps on my phone. Of course, this is possible only with custom ROMs, and then I don’t install the Google Apps packages into those ROMs. I don’t want to belabor the point, but the one thing I want to say about going gappless is: I can’t even tell they’re gone.

I thought it would be a little inconvenient, or that it would be difficult to work with on a day to day basis, but the truth is, since going gappless, I don’t even notice a difference. Other than using a few different apps to do the exact same thing I was doing before, nothing has changed. Kind of makes me wonder what all those Google Apps were for anyways….

Truth be told, Google does make some great apps. But most of the time, even before going gappless, I wasn’t using them anyways. For instance, GMail is a great app, but I have multiple email accounts (because of work, etc.) and so I was using a different email app (librem, K-9, even AquaMail at one point) for all of my phone email needs.

The only big ticket item was the Play Store, which now I realize I can get just about any app (well, any app I ever needed) from F-Droid, Aptoid, or Amazon Apps. The other contender being Google Photos to store all of my pictures. Of course, if you’ve been around my blog a while, you’ve surely seen my home piwigo photo storage system, so I wasn’t using Google Photos either.

Overall, looking long term at my phone these past few months, my battery typically has a higher charge at the end of the day. Typically I was seeing around 60-65% at the end of the day, now I see about 70-80% when I get ready for bed. My data plan uses less data, usually in the 500 MB to 1 GB per month range over these past few months as well, which is a plus. Also, my phone uses about 200 MB ram to run during the day.

I’m actually not writing this to bash on Google or their apps. They actually work really well if you use them. I am writing this to answer that question that I’ve been asked dozens of times lately: “Are you still gappless? How’s that working out for you?” Truth is, yes, and I don’t even miss it.

Linux – keep it simple.