Adding Google Play Services to Visual Studio Android Emulator

Out of the box, the Visual Studio Android Emulator (and the Genymotion emulator, and the Xamarin Android Player) does not support Google Cloud Messaging (GCM) push notifications.  The reason for this is that GCM is part of the Google Play Services.  And the Google Play Services are not included in the virtual machine (VM) images that the Visual Studio Android Emulator uses.

The typical Android device starts with a base Android stack that comes from the Android Open Source Project (AOSP).  Device OEMS (Samsung, Huawei, LG, etc) then license the Google Play Services from Google.  On top of that, the OEMs add any customizations that they do to Android.

Google does not allow Microsoft/Genymotion/Xamarin to include the Google Play Services with their builds from the AOSP.  Enough developers have put together versions of the package so that it’s a fairly easy process to install. They are commonly packaged under the name “GApps”.

Run the Visual Studio Emulator for Android from the Start Menu.  If you run it from VS, you may not be able to install firmware packages.  Then create a new VM.  For this example, we’ll create an Android 5.1 VM.  I tried this with Android 6 and it did not work with the GApps packages that I was able to obtain.

Emulation Manager

If you are using an existing VM, you’ll need to know which CPU architecture or ABI that the VM is running under.  Thanks to a tip from the nutty people at Intel, you can execute an ADB command to see what is on board.

adb shell getprop ro.product.cpu.abilist

Also see the documentation for the Build class.

SInce we created the VM, we know it’s Android 5.1.  If you were working with VM and were not sure of the version, you can check via the Android Settings app or from the command line with the adb command.

adb shell getprop

While we are checking stuff with ADB, the following command will return the SDK version

adb shell getprop
Results from the ADB commands
Results from the ADB commands

First up is the installation of an ARM translator. The VS Android Emulator gets its speed by running an x86 version of Android. The Google Play Services are usually packed up already compiled for ARM. The ARM translator lets ARM code run on an x86 image. This is usually packaged up in a .zip named ARM Translation v1.1.

Installing is easy, drag the .zip on to a running Android VM and follow the prompts.

The dialog that appears after drag and drop the ARM Translator package onto the Android VM

If it didn’t reboot the VM, reboot it to be safe.  Multiple web sites have a copy of this file.  I downloaded one from the Tech Bae blog.

ARM Translator installed

Since we have Android 5.1, we need a GApps package for Android 5.1.  There are a few places where you can download a package from, but not all of them may work.  I was hoping to to use the packages on the Open Gapps project.  None of their packages would install into my VMs.  They all reported an invalid folder error message.

The file sets available from TeamAndroid should install without any problems.  I downloaded one named  The “lp” in the file name stands for Lollypop, the code name for Android 5.

Drag the gapps package and drop it on your Android VM.  You should get a dialog like this:

Click the install button and let it do it’s thing.  After it completes, it should shutdown.  Restart it from the Emulator Manager.  After Android starts up, you may see a “Optimizing app X of Y” dialog.  When Android versions upgrade, the apps all need to tuned for the new version.  This is normal.

When that is all done, you should see  the Google Play icon in the app drawer.  Launch the app and provide your Google account information.  If you see an endless busy indicator, let it go for a minute, then close and restart Google Play.

You may see an error message about Google Play services having stopped.  That is normal and should go away once the Google Play services have been updated.

After installing GApps, some (many) Google apps and services will probably crash. Do not be alarmed, that is perfectly normal. Most of the files are out of date.

Get the Google Play app to run long enough for you to login and it will start updating.  To force Google Play to update itself, do the following (from Android Central):

  1. Launch Google Play
  2. Slide out the menu
  3. Tap on Settings
  4. Scroll to the bottom and tap Build version

If a newer version is a available, you’ll see a dialog with that information.

At that point, your Android VM will support push notifications.  You can install of Google Play apps like the Maps application.  These steps were tested with Visual Studio Android Emulator but they should work more or less in the same way with the Genymotion and Xamarin emulators.

The Open GApps page looks like it is a promising location to get GApp packages, they have a list of variants.  Basically each variant has more or less of the Google Apps.  To keep things simple, I wanted to use the stock version.  There is a naming scheme for gapps distributions.  It follows the pattern or a subset of that pattern

For this example, I had downloaded the full version of the x86 Android 6.0 GApps.  that came down with the following command line.

It wouldn’t install, but that is the accepted pattern for naming GApp packages.  It (and the ARM version) error-ed out with an invalid directory message.  Hopefully this will be addressed in an update to the Visual Studio Android Emulator.

This article’s banner image comes from Arena4G.

Thoughts on One Trick Ponies

When your company is a one trick pony (Apple), that pony (the iPhone) better be a compelling trick.  ZDNet’s Ed Bott just wrote an article that shows where Apple, Google, and Microsoft gain their income from.  While Google predictably gets most of the money from advertising and Microsoft has pivoted from the Windows company to the Services company, Apple remains as the company that sells the iPhone with other things.

With 68% of Apple’s income coming from the iPhone, protecting that product line is a big deal for Apple.  With the relative maturity of the Android platform, it’s incumbent on Apple to keep the iPhone as the premium device.  It has to be different and it has to be better in order for Apple to keep that revenue stream high.

There’s an argument that I have had with a few other developers about mobile development tools that let you write once, deploy everywhere.  Tools like Cordova, where the screens are defined in HTML and the code in JavaScript.  I’ve been told that I should be using that instead of tools that let me write to the native platform.  Xamarin tools in my case.  The Cordova (and other web like development tools) are a threat to Apple.  If you can write an app with Cordova and it runs the same way on Android as it does on the iPhone, what is the point in paying a premium for Apple hardware?

That’s why Apple continues to add functionality and services that doesn’t exist on other platforms.  Features like 3D Touch or FaceTime.  Remember when FaceTime was announced?  Steven Jobs said it would be an open industry standard.  That was in 2010.  Six years later Facetime is still a closed platform.  If FaceTime ran on Android, customized Androids would be the rage at schools, not the iPhone.  Apple is never going to open up FaceTime.  But they will continue on enhancing that one trick.

Get AMPed for faster page loading on mobile

I just updated this blog to use the Accelerated Mobile Pages (AMP) plugin for WordPress.  AMP is an open source project designed to optimize page content for mobile pages.  It uses a subset of HTML and some JavaScript to trim down the content of a web page.  Early testing has shown that AMP pages load four times faster and use eight times less data than a traditional web page.

AMP filters out 3rd party JavaScript code (aside from the AMP code), which basically takes out every analytics package.  Iframe and object tags are stripped out.  The HTML5 multimedia tags (img, video, audio) are replaced with custom elements (amp-img, amp-video, amp-audio).  On a page that uses the AMP runtime, a hidden link is added that provides the URL to AMP optimized version of the web page.  With the WordPress plugin, the AMP page is the original URL with “/amp” appended to it.  This will work on any hosted WordPress site.  Self hosted sites would need to add the plugin.

For this blog post, if you want to see the AMP version, click here.  It will load much faster, but without any special styling.  The banner image will be gone.  I like to use images from the Getty collection and as part of the terms of use, you have to embed the image with their custom template and that template puts the image in an iframe.  And since iframes are forbidden in AMP HTML, good bye image.

The AMP runtime manages the amp-* HTML tags and can manage the loading and unloading of the resources. CSS is also limited for performance reasons.  That trade off gives you the performance boost on mobile.  AMP is already being used by sites like Pinterest, Twitter, New York Times, The Verge.

AMP is not for everyone.  It is basically serving up a subset of your experience and you will lose custom animations, analytics, etc.  So where is it useful?  When you want a page to load as fast as it can.  Like a status page for service.  Google is already indexing AMP pages.  While it’s not currently giving preference to AMP pages, it does rank pages by page load.  AMP is open source and you can view the code on GitHub in the ampproject repository.

Generating new row numbers in SQL based on a starting value

One of our support people came to me with an interesting task.  He needed to add rows from a SQL Server table to another table and populate a row number type of field.  That field needed to be generated by his SQL statements and start with the next number after the highest value already in the table.  And he couldn’t use an autoincrement field.

My first thought was to read the new values into a table variable with an column for that row number field.  Then iterate over that table with a cursor and populate that column.  That was a very bad thing and was quickly banished.  So I thought about it a bit and sent him the following example.

-- The following temporary tables represent the 
-- the data to be worked with.  They are temp
-- tables only to illustrate the code
create table #BaseTable
    ID int,
    Name varchar(64)

create table #NewData
    Name varchar(64)

-- Lets throw some sample data into the base
-- table.
insert #BaseTable(ID, Name) values (1, 'Joe')
insert #BaseTable(ID, Name) values (2, 'Jim')
insert #BaseTable(ID, Name) values (3, 'Jay')
insert #BaseTable(ID, Name) values (4, 'John')

-- Lets populate the data table that we want
-- to get the data from
insert #NewData(Name) values ('Ken')
insert #NewData(Name) values ('Keith')
insert #NewData(Name) values ('Kevin')

-- Declare a variable to hold the maximum
-- value of our row number field
declare @LastRow int

-- Assign the max value to our variable
set @LastRow = (select MAX(ID) from #BaseTable)

-- Add the rows into the destination tabkle
insert into #BaseTable(id, name)
-- Use the rank() function to generate row
-- numbers for the rows that we are adding
-- and add the @LastRow to get the next highest
-- values
select rank() over (order by n.Name) + @LastRow as rank, n.Name
from #NewData n
order by rank

-- Show our merged results
select * from #BaseTable

-- Example over, cleanup
drop table #NewData
drop table #BaseTable

To generate the row numbers from the merge table, we use the rank() function.  Rank() returns the rank of each row within the partition of the result set.  We specify the partition with the “over (order by” clause.  If you have multiple fields to make a row unique, you would need to specify each field in the over clause.

FBI vs Apple vs the Consequences

iPhone 5C, FBI Edition

There has been a lot of conversations about the court order that the FBI has filed on Apple.  If you are following this story and have not yet read the court order, you should read it now.

The FBI is asking for Apple to disable the code that slows down and locks access to the device when too many incorrect pass codes are entered. They are not asking for Apple to decrypt anything and have stated that Apple could keep possession of the device.  The Trail of Bits blog has a very write up of how Apple could comply with this request.

My initial thought was that this was a reasonable request.   What tipped me over to Apple’s view was what will happen afterwards.  Once this becomes a precedent, other countries could make the same request of Apple.  Countries with a less than stellar record of civil rights. The 800 lb gorilla in that room would be China. The same people who brought us the Golden Shield Project (aka the Great Firewall of China) would now have the opportunity to add new laws requiring backdoors into all mobile devices sold in their country. You may have seen the tweet from Snowden on this subject:

There are other ways that the FBI can get some of information that would be on the phone.  I would assume that they have already subpoenaed the mobile carrier to get the phone records.  That would tell the FBI who was talking to Farook and Malik.  According to the court order, the phone was on the Verizon network.  If Farook and/or Malik were sending SMS text messages, then Verizon has those messages on file and can supply them in response to a court order.  If they were using iMessage and were backing the phone up to iCloud, Apple could hand over that information via court order.  There’s a good article on that goes over the multiple ways information can be accessed from an iPhone.

Hard cases make bad law.  While I sympathize with the reasons that the FBI is making this request, the long term consequences would be worse.  We  face the real risk of having weaker security in mobile devices.  At the end of the day, Apple is making the right choice in opposing the court order.  It sets a bad legal precedence and they should fight it all the way to the Supreme Court.

Use Powershell to batch rename files from digital cameras

If your household is like my household, then you’ll have more than one digital camera laying around.  My wife and I have similar Sony cameras (NEX-6 and an a5000).  For easy of management and the sake of my own sanity, I back up the images from both cameras together.

I store my images in a chronological order.  A folder for each year, then sub folders for each month.  It’s simple to manage and it’s easy to find pictures.  When daughter(0) asks where the pictures are from last year’s lake vacation, I can tell her it’s in “2015\7”.   There are times where I create folders for special purposes, but by and large the collection is in chronological order.

Since Sony prefixes every image with the letters DSC, I wanted a way differentiate between my images and my wife’s images.  I also wanted to eliminate any chance of two images having the same name.  There many ways of doing batch file renaming.  I wanted something simple.

That brings us to Powershell.  There’s very little that you can’t do with Powershell and a lot resources for it.  In this case, a batch rename is trivial:

# Pipe the contents of the DIR command
# to the Rename-Item command and do text
# replacement
Dir *.jpg, *.arw | 
  Rename-Item –NewName { $ –replace “DSC“,”ABM” }

That command will take all of the files in the current folder with the .JPG and .ARW (Sony’s RAW file) extension and rename any of them that have “DSC” in the name to use “ABM”. This will replace the “DSC” in any part of the filename. If you want to just match files that start with “DSC”, then you could RegEx pattern matching. Since I didn’t need that level of pattern matching, I chose not to dive down that rabbit hole.

“What would you do to revive Windows Phone?”

A recent post on Twitter by Brad Sams asks the question

That tweet has been getting a few responses and it’s been a trendy topic of late. Between newly blond Joe Belfoire tweeting from an iPhone (for which he has a really good reason for doing so, but still freaked some people out) and the latest report on earnings showing Lumia sales dropping; people are commenting more than usual on the fate of the platform.

Many of the responses to Sams’s tweet were calls for Microsoft to spend more money promoting Windows Phone, get more iOS apps for the platform, release a Surface Phone, run Android apps, fix the Store etc.  I saw posts about just keeping the platform alive like Apple did with OS X and wait for the market to change.

Microsoft has pretty much done what it can to boost market share for Windows Phone.  They wrote native versions of popular iOS and Android apps (like Facebook and Twitter).  They assisted in getting other apps (like Flipboard) ported.  They bought technology (Project Islandwood, the Windows Bridge for iOS) to allow Objective-C iOS apps to be recompiled with little to no changes (like Candy Crush).   But in the end, no one bought a Lumia over an iPhone because they could still run Candy Crush.

The Windows Phone to Mac comparision doesn’t really have any legs to stand on.  Apple computer sales were always a fraction of Windows, but they usually had 10-12% of the market.    And Apple made their machines cool.   And Microsoft made sure that their apps (Office) ran (more or less) on the Mac.

Anything that resets the playing field is going to reset that field for all of the players.  Windows wont be able to step in to replace iOS and/or Android because whatever makes them irrelevant will make Windows 10 for Mobile irrelevant too.

This is the type of device that resets the playing field. It’s a 23rd century mobile phone/tablet device, as envisioned in the “The Expanse” TV series. Notice the crack in the upper part of the screen. Some things never change.

And then you had Project Astoria.  The Windows Bridge for Android. Last year,  Microsoft demoed the technology that would let you run Android apps on Windows 10 for Mobile. Windows 10 for Mobile had (past tense) had a subsystem that allowed Android apps to run.  You could run them basically unmodified, but Microsoft made it was to add a few lines of code and link to a library and it would give an Android app access to Windows features like live tiles.

Last fall, Microsoft pulled the plug on Astoria.  Officially it’s “on hold“, but I think they blew that bridge to smithereens.  The problem Islandwood and Astoria is that they don’t actually address the problem.  App developers were not committing resources to Windows Phone development.  Writing the code was just one piece of the problem.  You still had to have people test the apps and support the apps.

Some people have talked about a rumored Surface Phone.  It’s a unicorn, wrapped in a VaporMG case.  Microsoft could release a Surface phone tomorrow  running on top of a Snapdragon 820 and it really wouldn’t change anything.

Meanwhile, Microsoft has been porting everything from Office, to Cortana, to the Word Flow keyboard to iOS and Android.  That’s been one of the shifts that has occurred under Satya Nadella’s watch.  The mobile OS is less critical, it’s the apps and the services used by those services that Microsoft is now going after.

I have a Lumia Icon phone running Windows Phone 8.1.  It has been my favorite phone of all time.  I don’t expect to see any new flagship phones for Windows 10 for Mobile coming to Verizon.  Microsoft has already shown that it’s not terribly concerned about not being on 50% of the US market.  Nadella made it clear last July that growing their phone business was no longer a top priority.  My next phone is most likely going to be an Android phone.

So what happens next for Microsoft on mobile?  Windows 10 for Mobile will eventually be released for the Windows 8.1 phones that can run it.  Windows Phone global market share will level off at some number between really bad and awful.  It’s a minor player, some markets more minor than others.  To pretend anything else is just wishful thinking.

Microsoft will continue to bring apps and services to iOS and Android.  They could write an Android launcher that brings live tiles to Android.  That’s pretty feasible and they could provide an API to make it easy for other apps to add live tile functionality.  You could start seeing the bits and pieces of what made Windows Phone special on Android.  And to a lesser extent on iPhone.  It’s hard to upgrade a walled garden, and the walls around iOS are pretty high.  But the Microsoft apps will be there.  And those apps ultimately sell Microsoft services like Office 365 and the Azure platform.

Windows Live Writer is dead, Long Live Open Live Writer

In case you missed it, Microsoft has allowed Windows Live Writer (WLW) to go open source.  The new project is called Open Live Writer (OLW) and it’s taking the current version and breathing new life into it.  WLW has been basically in a coma since 2012

It’s part of the .NET Foundation, an umbrella group for various open source projects that have come out of Microsoft.  You read the announcement on the .NET Foundation blog.   This is cool, very cool.

When this blog was hosted on Blogger, WLW was my tool of choice for writing and editing blogs.  When I moved to a self-hosted WordPress site, I used the built in editor on the siter.  Which is actually quite good.  Good enough that I never bothered to switch WLW over to the new site.  Now that OLW will be picking up where WLW ended, I plan on using it it again.

I’m looking forward to seeing some plugins come over to OWL.  A long time ago, I wrote a plugin for WLW to generate image galleries for your blog from Smugmug.  It was so long ago that the Microsoft site for hosting plugins is long gone. 

I don’t think I would update the gallery plugin, with responsive design as the driver, it would be a better user experience to let the user go right to the SmugMug gallery.  I would do one for pulling in images from SmugMug.  Almost of the images on my blog come from my SmugMug galleries.  I don’t store images with the blog.  No point in duplicating the storage and it’s one less thing to worry about if I ever migrate the blog again.

Marvin Gaye as an antidote for Road Rage

Marvin Gaye

If our cars could just play “Mercy Mercy Me” when a Road Rage situation is detected, countless lives would be saved each year.  It shouldn’t be that hard to do.  If the car is going faster than 45 mph and it detects sudden braking and the horn being pressed, the odds are pretty high that the potential for a Road Rage condition exists.

When that happens, the car should immediately start playing Marvin Gaye singing “Mercy Mercy Me”.  You just can’t stay mad listening to that song.

I discovered this amazing fact this morning, while driving into work.  I was in the left lane, driving a large breadbox that is also known as the Honda Odyssey.  Some guy in a  Fiat 500 (named because that’s about how much it weighs) started moving into my lane, right about where my front fender is.

I tapped my brakes and pressed the horn to gently remind the driver that while we can both occupy the same place, physics prevents us from doing this at the same time.  His response was to give me the finger and do some assorted other hand signals.

That made me mad.  It’s one thing to be a lousy driver and to make a mistake of not looking to see where you are putting your ridiculous car; but it’s quite another to get mad at another person because you missed the Driver Ed class on how to use a mirror.

If I had not hit the brakes, he would have crashed into me.  Which would have been annoying.  I probably would have had to pull over and wipe Fiat off my fender.  In addition to not understanding the laws of physics, those laws would be decisively unkind to the Fiat.  When  a 2300 pound object hits a 4400 pound object, it’s not hard to pick the winner of that outcome.

He then attempted to speed away from me.  Which in a Fiat 500 is cute to watch.  Soaking wet, a Fiat 500 has about 12 horsepower (OK, 101  horsepower).  The Odyssey has 248 (breadbox aerodynamics requires the horsepower equivalent of 1980 Ferrari 308 GTS.  To be fair the Ferrari weighs less and looks cooler) horsepower.  I could tailgate the 500 without the Honda breaking a sweat.

Before I could start participating in today’s Road Rage challenge, “Mercy Mercy Me” came on the radio.  The soothing tones of Marvin Gaye pushed the Road Rage out of my head and replaced it with a pleasant calmness.  In the same amount of time it took to get mad, I became unmad.  I then maintained a normal cruising speed, while in the increasing distance the Fiat 500 driver tailgated the car in front of him.

This could work for other people.  It doesn’t have to be Marvin Gaye, you could pick from a selection of music that would soothe you, based on your own tastes.  But I think “Mercy Mercy Me” would work for most people.

Microsoft’s Privacy Manifesto

In the Cloud We Trust

Microsoft News just posted an article by Brad Smith, the President and Chief Legal Officer at Microsoft about privacy in the age of the Cloud.  You really want to read it, it’s about where we are now and where we should be going, and what Microsoft is doing to get there.

If the Sony attack taught us nothing else, it was this: There is no national security without cybersecurity. That helps explain why so many governments are taking action.

I came across the article by a link posted by The Register, which basically called it an ad for Microsoft Cloud services.  It’s that, but it’s also much more.  It’s about Sony Hack, it’s about Snowden, it’s about data residency requirements, and it’s Je suis Charlie.  It’s also about the lawsuits between Microsoft and various governments over data being stored by Microsoft.

Microsoft is taking steps in ensuring that they will treat their customer’s data properly and lawfully.  Smith wrote that Microsoft’s cloud business will be grounded in the following four commitments to “governments, enterprises, consumers, and people around the world”.

  1. We will keep their data secure.
  2. We will ensure people’s data is private and under their control.
  3. We will figure out the laws in each country and make sure data is managed accordingly.
  4. And we will be transparent so people know what we are doing.

Smith goes on to provide some information about the lawsuits that Microsoft has been in and the nearly mystical Foreign Intelligence Surveillance Court.  It’s worth reading.

Even if you don’t care about the topic, but like to see an innovative and clever use of HTML, go read the article.  It’s easy on the eyes and uses HTML5 tricks to make the graphical data interactive and non-annoying.  Go read this and go check out the Voices for Innovation web site..

A work in progress

%d bloggers like this: