+Alfredo Morresi Android Apps Quality
Jan 15, 2015
+Alfredo Morresi
Android AppsQuality
ROLEDeveloper Relations Program Manager for Italy
PASSIONSCommunity, Development, Snowboarding, Tiramisu'
REACH [email protected]/+AlfredoMorresi@rainbowbreeze
Who I am
Design, Develop, Distribute
d.android.com/distribute/googleplay/quality
d.android.com/distribute/googleplay/quality
Criteria+
Test Procedures
• Visual Design and User Interaction
• Functionality
• Performance and Stability
• Google Play
Breaking it down
Visual Design and User Interaction
Standard Design
2%
28%
21%
49%
OtherGingerbreadICSJellybean
d.android.com/about/dashboard
30%
70%
OtherHolo
d.android.com/about/dashboard
Navigation
Navigation & Notifications
Navigation
All dialogs are dismissible using the Back button
Notifications
Notifications: • are persistent only if related to ongoing events• only contain content related to the core function of the app*• do not contain advertising*
* unless opted in
Functionality
Permissions
Request only the absolute minimum
permissions that are needed to support core
functionality.
Implicit Permissions
App/Game Audio plays...
...unless it is a core feature
UI
App State
• Don’t leave services running while app in background, unless core function
• Preserve and Restore User State from recents, device wake, relaunch
Performance and Stability
GPU Overdraw
Profile GPU Rendering
Profile GPU Rendering
Profile GPU Rendering
Performance
<android-sdk>/tools/monitor
Hierarchy Viewer
Tracer for OpenGL ES
• Devoxx 2012: For Butter or Worse• Curious-Creature.org: Android Performance Case Study
...exercise break...
Content Policy
App Content Rating
App Rating
App Rating
App Rating
• Full battery, wifi signals, no notifications
• Phone + Tablet
• No system buttons on image (personal preference)
Screenshots
Feature Graphic
• Hardware accelerated emulators• AndroVM• BlueStacks• HDMI recorder - (e.g. Blackmagic) or HDMI -> SD Converter •$ adb shell screenrecord /sdcard/myclip.mp4 (API 19)
Making a promo video
What’s New / Improving an App
Google Play Services
Fused Location Provider
Connect the Location Service Client! MyActivity
private void connectLBS() { int gpsExists = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (gpsExists == ConnectionResult.SUCCESS) { mLocationClient = new LocationClient(this, this, this); mlocationClient.connect(); }}
@Overridepublic void onConnected(Bundle connectionHint) { requestUpdates(mlocationClient);}
Location Update Requests! MyActivity
LocationRequest request = LocationRequest.create();request.setInterval(minTime);request.setPriority(lowPowerMoreImportantThanAccuracy ? LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY : LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationClient.requestLocationUpdates(request, new LocationListener() { @Override public void onLocationChanged(Location location) { updateLocation(location); }});
Geofencing
! MyActivityList<Geofence> fenceList = new ArrayList<Geofence>();
// TODO Repeat for all GeofencesGeofence geofence = new Geofence.Builder() .setRequestId(myKey) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .setCircularRegion(latitude, longitude, GEOFENCE_RADIUS) .setExpirationDuration(Geofence.NEVER_EXPIRE) .build();
fenceList.add(geofence);
mLocationClient.addGeofences(fenceList, pendingIntent,
Geofencing
Activity Recognition
! MyActivity
Activity Recognition
Intent intent = new Intent(this, ActivityRecognitionIntentService.class);intent.setAction(MyActivity.ACTION_STRING);
PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mActivityRecognitionClient.requestActivityUpdates(interval, pi);
!ActivityRecognitionIntentSer@Overrideprotected void onHandleIntent(Intent intent) { if (intent.getAction() == MyActivity.ACTION_STRING) { if (ActivityRecognitionResult.hasResult(intent)) { ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); DetectedActivity detectedActivity = result.getMostProbableActivity(); int activityType = detectedActivity.getType(); if (activityType == DetectedActivity.STILL) setUpdateSpeed(PAUSED); else if (activityType == DetectedActivity.IN_VEHICLE) setUpdateSpeed(FASTER); else setUpdateSpeed(REGULAR); } }}
Activity Recognition
Google+ Sign in on the Web
Enables App Install!!
• Enable Google+ APIs access in Google APIs Console
• Add the apppackagename parameter to your sign-in button.
2 Steps
Enables App Install!!
https://developers.google.com/+/features/play-installs
Measure the results.
Google Play Games
Google Play Games
Google Play Games
Google Play Games
Cloud Save
Google cloud messaging
Google Cloud Messaging
Your Service
Google cloud messaging
Google Cloud Messaging
Google cloud messagingYour
Service
Google Cloud Messaging
...To summarize
Resourcesdeveloper.android.comdeveloper.android.com/designdeveloper.android.com/trainingandroid-developers.blogspot.comsource.android.com
GDL - Google Developers Live
GDL Italia - http://goo.gl/MyQai
http://developersitalia.blogspot.it/
+Alfredo Morresi
Q+A
Copyrights and trademarksAndroid, Google are registered trademarks of Google Inc.
All other trademarks and copyrights are the property of their respective owners.