The Android Compatibility Definition Document for Android Nougat is laying the law for what the future of Android will be.

Here's how Google plans to reduce update cycles and fragmentation...

The Android Compatibility Definition Document (CDD) is a list of rules by Google, which Android OEMs need to follow in order to get their devices approved for Google services, which includes the Google Play. The document is released each time a new version of Android is announced, and the one for Nougat is finally here. Interestingly, Google seems to be using this to reduce the fragmentation between hardware and software, which has always been the secret sauce to the iPhone’s performance.


Firstly, the CDD mentions something called Android Extensions, which is mandatory for all OEMs. Google may use these to bypass OEMs and carriers when pushing updates to its AOSP APIs. Currently, such updates need an update to the entire Android ecosystem. However, the Android Extension APIs on the LG V20 and Google Pixel don’t reveal much at the moment.


To make it simpler, one must understand the two sets of APIs on Android right now. There’s the AOSP APIs and Google Play Services APIs. While Google can update the Play Services APIs any time, updating AOSP APIs on a third party device takes time. This is because of the modifications etc. that are done by OEMs. By using Android Extensions, Google is trying to nullify this issue.


Further, Google has also issued a “strong recommendation” to use USB Power Delivery standards, instead of the myriad proprietary charging standards in the market. Some examples of proprietary standards in this area are OnePlus Dash Charge, OPPO VOOC charging and Qualcomm’s Quick Charge standards. Google uses USB Power Delivery in its Pixel devices, and that is what it is recommending for all Android phones. While it is only a recommendation right now, speculations are that later versions of Android may make it mandatory, thereby allowing users to charge any phone with any charger.


The CDD also has rules for standard functions from inline buttons on earphones that attach to the 3.5mm jack on Android phones. This would be useful, since it would allow all headphones to function similarly with each Android phone, however, one cannot overlook Apple’s recent push at obliterating the jack altogether.


There’s also a provision for the multi-window facility introduced in Android Nougat. While this feature has been implemented by other OEMs much before Google, the Search giant is now preventing them from using any other method but its own. OEMs can still choose to not use the feature, but they can’t use their own versions.


With all the changes mentioned above, Google’s goal seems simple — to gain more control over Android. The open source nature of Google’s operating system has allowed OEMs to build phones using Android very easily, but it also takes away the control from Google. Currently, problems with OEMs not issuing updates, or hardware compatibility are issues that put Android behind iOS. Google seems to be slowly implementing this. However, it is still far from the vertical integration that an iOS-powered device enjoys.


Note: The CDD also reveals that Vulkan APIs aren’t necessary for Android Nougat implementations. This again raises questions on why devices like the Nexus 5 etc. will not be getting the update. Vulkan compatibility was earlier thought to be the reason for Nougat being pulled from such smartphones. While Android Nougat does support Vulkan APIs, it doesn’t make the same mandatory.




‘).insertAfter(‘.inside-container p:eq(1)’); */
// $( ” ).insertAfter(‘.inside-container p:eq(0)’);
//});#}
$(function(){
$(‘.inside-container > blockquote’).addClass(‘twitter-tweet’);
var elig_P_Index = [];
var pLength = $(‘.inside-container p’).length;
var count = 0;
// for(var i=0; i 150){
var textVal = $(this).text();
var indexVal = $(this).index();
elig_P_Index.push({textVal:textVal, indexVal:indexVal});

}

});

if(elig_P_Index.length > 0 && elig_P_Index.length

‘).insertAfter(“.inside-container p:eq(” + firstAdd + “)”);

console.log(‘//If article have 3 Paragraph :​ Square (300×250) Sized banner will come after 1st paragraph:’)

}

//If article have 5 Paragraph :​ Square (300×250) Sized banner will come after 1st and 4th paragraph
if(elig_P_Index.length >= 4 && elig_P_Index.length

‘).insertAfter(“.inside-container p:eq(” + firstAdd + “)”);

$(”).insertAfter(“.inside-container p:eq(” + fourthAdd + “)”);

console.log(‘//If article have 5 Paragraph :​ Square (300×250) Sized banner will come after 1st and 4th paragraph’)

}

//If article have 7 Paragraph :​ Square (300×250) Sized banner will come after 1st, 4th and 6th paragraph
if(elig_P_Index.length > 5 && elig_P_Index.length

‘).insertAfter(“.inside-container p:eq(” + firstAdd + “)”);
$(”).insertAfter(“.inside-container p:eq(” + fourthAdd + “)”);
$(”).insertAfter(“.inside-container p:eq(” + sixthAdd + “)”);

console.log(‘If article have 7 Paragraph :​ Square (300×250) Sized banner will come after 1st, 4th and 6th paragraph’)

}

//If article have 9 or more Paragraph :​ Square (300×250) Sized banner will come after 1st, 3rd, 5th and 7th paragraph
if(elig_P_Index.length > 7 ){
var firstAdd = parseInt( [elig_P_Index[0].indexVal]);
var thirdAdd = parseInt( [elig_P_Index[2].indexVal]);
var fifthAdd = parseInt( [elig_P_Index[4].indexVal]);
var seventAdd = parseInt( [elig_P_Index[6].indexVal]);

$(”).insertAfter(“.inside-container p:eq(” + firstAdd + “)”);
$(”).insertAfter(“.inside-container p:eq(” + thirdAdd + “)”);
$(”).insertAfter(“.inside-container p:eq(” + fifthAdd + “)”);
$(”).insertAfter(“.inside-container p:eq(” + seventAdd + “)”);
console.log(‘If article have 9 or more Paragraph :​ Square (300×250) Sized banner will come after 1st, 3rd, 5th and 7th paragraph’)

}

// var pLength = $(‘.inside-container p’).length;
// var count = 0;
// for(var i=0; i = 150){
// totalCount =count;
// count++;
// }
// }
// if(totalCount=== 3)
// {
// $(”).insertAfter(‘.inside-container p:eq(0)’);
// }
// if(totalCount=== 5)
// {
// $(”).insertAfter(‘.inside-container p:eq(0)’);
// $(”).insertAfter(‘.inside-container p:eq(3)’);
// }
// if(totalCount=== 7)
// {
// $(”).insertAfter(‘.inside-container p:eq(0)’);
// $(”).insertAfter(‘.inside-container p:eq(3)’);
// $(”).insertAfter(‘.inside-container p:eq(5)’);
// }
// if(totalCount === 9)
// {
// $(”).insertAfter(‘.inside-container p:eq(0)’);
// $(”).insertAfter(‘.inside-container p:eq(2)’);
// $(”).insertAfter(‘.inside-container p:eq(4)’);
// $(”).insertAfter(‘.inside-container p:eq(6)’);
// }

});

//method to trunkate the text
function shorten(text, maxLength) {
var ret = text;
if (ret.length > maxLength) {
ret = ret.substr(0,maxLength-3) + “…”;
}
return ret;
}

$(function(){
//function to put utm on DontMiss links
/*if(isDesktop()){
$(‘div.dontMiss > a’).each(function(){
$(this).prop(‘href’, $(this).prop(‘href’)+’?utm_source=within_article&utm_medium=desktop&utm_campaign=related’);
//trunkate dont miss content
var sub = shorten($(this).html(),47);
$(this).html(sub);
});
}else{
$(‘div.dontMiss > a’).each(function(){
$(this).prop(‘href’, $(this).prop(‘href’)+’?utm_source=within_article&utm_medium=mobile&utm_campaign=related’);
});
}*/

//disabled method to append dontmiss links to page content by Mayank
/*$(‘div.dontMiss > a’).each(function(index){
//loop over each list item

// if(index%2 > 0){
// index = index – 1;
// }
if($(‘.inside-container > p:eq(‘+index+’)’).length){
if(isDesktop()){
$(‘.inside-container > p:eq(‘+((index * 2) + 1)+’)’).append(‘

Related: ‘ + $(this).html() + ‘‘ );
}else{
$(‘.inside-container > p:eq(‘+((index * 2) + 1)+’)’).append(‘

Related: ‘ + $(this).html() + ‘‘ );
}
}
});*/
$(‘div.dontMissArea’).hide();

/* if(isDesktop()) {
$(‘div.dontMissArea’).hide();
}else{
$(‘div.dontMissArea’).show();
} */

/*
* ga event tracking on page scroll start and end by Mayank
*/

// Debug flag
var debugMode = false;

// Default time delay before checking location
var callBackTime = 100;

// # px before tracking a reader
var readerLocation = 150;

// Set some flags for tracking & execution
var timer = 0;
var scroller = false;
var endContent = false;
var didComplete = false;

// Set some time variables to calculate reading time
var startTime = new Date();
var beginning = startTime.getTime();
var totalTime = 0;

// Get some information about the current page
var pageTitle = document.title;

// Track the aticle load — disabled
if (!debugMode) {
// ga(‘send’, ‘event’, ‘Reading’, ‘ArticleLoaded’, pageTitle, {‘nonInteraction’: 1});
// console.log(“ga(‘send’, ‘event’, ‘Reading’, ‘ArticleLoaded’, pageTitle, {‘nonInteraction’: 1}”);
} else {
alert(‘The page has loaded. Woohoo.’);
}

// Check the location and track user
function trackLocation() {
bottom = $(window).height() + $(window).scrollTop();
height = $(document).height();

// If user starts to scroll send an event
if (bottom > readerLocation && !scroller) {
currentTime = new Date();
scrollStart = currentTime.getTime();
timeToScroll = Math.round((scrollStart – beginning) / 1000);
if (!debugMode) {
ga(‘send’, ‘event’, ‘Reading’, ‘StartReading’, pageTitle, timeToScroll, {‘metric1’ : timeToScroll});
} else {
alert(‘started reading ‘ + timeToScroll);
}
scroller = true;
}

// If user has hit the bottom of the content send an event
if (bottom >= $(‘.inside-container’).scrollTop() + $(‘.inside-container’).innerHeight() && !endContent) {
currentTime = new Date();
contentScrollEnd = currentTime.getTime();
timeToContentEnd = Math.round((contentScrollEnd – scrollStart) / 1000);
if (!debugMode) {
if (timeToContentEnd = height && !didComplete) {
currentTime = new Date();
end = currentTime.getTime();
totalTime = Math.round((end – scrollStart) / 1000);
if (!debugMode) {
ga(‘send’, ‘event’, ‘Reading’, ‘PageBottom’, pageTitle, totalTime, {‘metric3’ : totalTime});
} else {
alert(‘bottom of page ‘+totalTime);
}
didComplete = true;
}
}

// Track the scrolling and track location
$(window).scroll(function() {
if (timer) {
clearTimeout(timer);
}

// Use a buffer so we don’t call trackLocation too often.
timer = setTimeout(trackLocation, callBackTime);
});
});



Source link