Android Browser versions
Whilst looking into browser update cycles I started examining the various versions of the Android Browser. I wasn’t expecting this to be simple but it ended up being more complex than I thought so I’ve summarised my findings here.
The main data points I’ve used for the comparison are outlined below.
Android codename
The Android codename is probably the easiest thing to grasp when it comes to Android versions but, whilst it mostly matches the versioning system, it doesn’t directly map to it — for example Eclair was used for Android 2.0 and 2.1, Honeycomb for 3.0, 3.1 and 3.2, and Jellybean for 4.1, 4.2 and 4.3.
Android version
The Android version is the next thing to look at, this follows a standard format of major.minor.patch . However, this doesn’t seem to tell the full story — there is also an API version.
API version
I’m not entirely sure what the API version actually maps to in Android but it is both sequential and more fine grained than the main Android version so I’ve gone down to this level.
WebKit version
Whilst a browser is more than just the rendering engine — the JavaScript engine plays a significant part — I’ve not got data for the JavaScript engine so I’ve looked at the WebKit version as an indicator to see if the browser had changed. I don’t have complete data for this but the WebKit version is updated much less frequently than anything else but still not to a set pattern.
However, the WebKit version doesn’t seem to be reliable as an indicator of the browser changing, the Can I Use. support tables for Android 2.2 and 2.3 indicate that and support changed between these two versions yet the WebKit version did not. There were also two API versions covered by 2.3 and the data from Can I Use. doesn’t indicate which one they are referring to when they say 2.3, but 2.3.3+ (API 10) is much more common than 2.3-2.3.2 (API 9).
Further complicating the situation I have two devices running different patch versions of Android 2.3 at API version 10 — 2.3.4 and 2.3.5. Despite having the same WebKit version, and somewhat counter intuitively, the Browser on the 2.3.4 device scores marginally higher than the 2.3.5 device on both the HTML5 and CSS3 tests.
Chrome for Android
As of Android 4.1, Chrome became the default browser. Or not. It’s hard to say. The presence of Browser in an Android 4.2 version of Cyanogen shows that it’s still possible to have the old default browser. Added to which Samsung and LG devices ship with different versions of Chrome (and others probably do too). At least one Android 4.1 device only ships with Browser and maybe some devices include Browser as well as Chrome?
With Android 4.4 it seems that Browser is not included but vendors can recreate Browser using a web view. But then again, in Android 4.4 the WebView is significantly different from previous versions of Android since it is now based on Chromium and the V8 JavaScript engine. I think that this now means we can mark the official end of Browser in Android at version 4.3 (Jellybean) [API 18].
Update 2014-04-15: Version 11 of Cyanogen is based on Android 4.4 and includes Browser which reports itself in the user agent string as Chrome 30.0.0.0. This fits with the release date of Chrome 30 making it the current version of Chrome when Android 4.4 was released.
Update 2015-01-19: Android 5 (Lollipop) now uses an updatable Chromium for the web view meaning that it can now benefit from updates independent of the operating system.
Android Browser version data
Date | API Version | Android version | Codename | WebKit |
---|---|---|---|---|
2009-04-30 | 3 | 1.5 | Cupcake | 528.5 |
2009-09-15 | 4 | 1.6 | Donut | 528.5 |
2009-09-26 | 5 | 2.0 | Eclair | 530.17 |
2009-12-03 | 6 | 2.0.1 | Eclair | 530.17 |
2010-01-12 | 7 | 2.1 | Eclair | 530.17 |
2010-05-20 | 8 | 2.2 | Froyo | 533.1 |
2010-12-06 | 9 | 2.3 | Gingerbread | ? |
2011-02-09 | 10 | 2.3.3 | Gingerbread | 533.1 |
2011-02-22 | 11 | 3.0 | Honeycomb | 534.13 |
2011-05-10 | 12 | 3.1 | Honeycomb | 534.13 |
2011-07-15 | 13 | 3.2 | Honeycomb | 534.13 |
2011-10-19 | 14 | 4.0 | Ice cream sandwich | 534.30 |
2011-12-16 | 15 | 4.0.3 | Ice cream sandwich | 534.30 |
2012-07-09 | 16 | 4.1 | Jellybean | 534.30 |
2012-11-13 | 17 | 4.2 | Jellybean | 534.30 |
2013-07-24 | 18 | 4.3 | Jellybean | 534.30 |
2013-07-24 | 19 | 4.4 | KitKat | 537.36 |
2014-07-14 | 20 | 4.4w | KitKat for wearables | N/A |
2014-11-03 | 21 | 5.0 | Lollipop | 537.36 (Chrome 37) |
2015-03-09 | 22 | 5.1 | Lollipop | ? |
Conclusion
There isn’t any correlation between any of the data points and, even if there were, it’s apparent this isn’t the whole story. Essentially, don’t try and make any assumptions about Android browsers based on any of the available data points — do your own testing.
Comments, suggestions, corrections? Contact me via this website
About me
Hi, I’m Orde Saunders and I’m a consultant webmaster.
I help companies get more out of their websites by optimising the, often invisible, technical details. I work with each client to understand their problems and to deliver tailored solutions.
With over 20 years experience of building websites, and having worked with companies ranging from international corporations to one room start-ups, I have the depth and breadth of experience to help you with your website.
I’m currently working full time for FanDuel as the engineering lead for an analytics migration so I’m not taking on any new consultancy work.
Pick up the Android version in the browser by Javascript
If what you’re really trying to detect is whether you have a version of the browser that supports a particular feature, then it’s nearly always better to use feature detection instead of browser version detection. modernizr is a huge base of code for feature detection that you can either use as is or borrow one particular piece from or just learn how the general technique works.
When I Google, I see user agent strings like this for Android:
Mozilla/5.0 (Linux; U; Android 2.2.1; fr-ch; A43 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
A regex of /Android\s+([\d\.]+)/ on window.navigator.userAgent will pick up the Android version number.
Solution 5
This code checks the full version of Android from the useragent.
var test = LowerThanAndroidVersion('4.4'); if (test) < alert('lower than android 4.4') >else if (test == undefined) < alert('no android') >else < alert('android 4.4 or higher'); >function LowerThanAndroidVersion(testversion) < //var useragent = 'Mozilla/5.0 (Linux; U; Android 4.3.1; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'; var useragent = navigator.userAgent; var androidpoint = useragent.indexOf('Android'); if (androidpoint >= 0) < var rest = useragent.substring(androidpoint + 8, useragent.length); var version = rest.substring(0, rest.indexOf(';')); return (version < testversion) ? true : false; >>
Подберите версию Android в браузере от Javascript
Я создаю веб-приложение и хочу отключить эффекты перехода на устройствах Android под версией 3.0. Есть ли какой-нибудь способ поднять номер версии Android на Javascript в браузере? Если да, то как?
9 ответов
function getAndroidVersion(ua) < ua = (ua || navigator.userAgent).toLowerCase(); var match = ua.match(/android\s([0-9\.]*)/); return match ? match[1] : undefined; >; getAndroidVersion(); //"4.2.1" parseInt(getAndroidVersion(), 10); //4 parseFloat(getAndroidVersion()); //4.2
parseFloat принимает только один аргумент, поэтому нет необходимости в ,10 в конце. (Я бы отредактировал его сам, но для редактирования нужно изменить как минимум 6 символов.)
Из приведенного ниже комментария от andy, пользовательский агент может быть: «Linux; Android; Release / 4.1.2». Это означает, что на этих устройствах Motorola произойдет сбой.
Я думаю, что вы должны добавить , 10 в конце, иначе, если число начинается с 0, оно будет анализироваться как восьмеричное число. Просто попробуйте выполнить следующее: alert(parseInt(021)) . Вы увидите 17, а не 21
Я согласен с user1613797, parseInt принимает второй необязательный аргумент, который является основанием / основанием. Указание его как 10 помогает с числами, начинающимися с 0, и гарантирует, что они не рассматриваются как восьмеричные числа.
Используйте код ниже, чтобы получить 2-значную версию Android
var ua = navigator.userAgent; if( ua.indexOf("Android") >= 0 ) < var androidversion = parseFloat(ua.slice(ua.indexOf("Android")+8)); if (androidversion < 2.3) < // do whatever >>
Mozilla/5.0 (Linux; U; Android 2.2.1; fr-ch; A43 Build/FROYO). AppleWebKit/533.1 (KHTML, например, Gecko) Версия /4.0 Mobile Safari/533.1
вернется Android Version = 2.2
@Alexey Алексей, скрипт уже проверяет наличие Android в строке (2-я строка). Поэтому я не согласен с тем, что это слепая операция indexOf, поскольку она всегда будет возвращать позицию, отмечающую конец строки Android плюс один символ.
Вы можете посмотреть строку пользовательского агента — window.navigator.userAgent , описанную здесь: https://developer.mozilla.org/en/DOM/window.navigator.userAgent
Если вы действительно пытаетесь обнаружить, есть ли у вас версия браузера, поддерживающая определенную функцию, то почти всегда лучше использовать обнаружение функций вместо обнаружения версии браузера. modernizr — это огромная база кода для обнаружения функций, которую вы можете использовать как есть или заимствовать одну конкретную деталь или просто узнать, как работает общая техника.
Когда я Google, я вижу строки пользовательского агента, подобные этому для Android:
Mozilla/5.0 (Linux; U; Android 2.2.1; fr-ch; A43 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Регулярное выражение /Android\s+([\d\.]+)/ на window.navigator.userAgent подберет номер версии Android.
Да, я так и догадывался, но искал код 🙂 Я не хочу ошибиться. Есть много устройств с Android, я думаю, что они не будут одинаковыми.
Я бы посоветовал вам сделать поиск в Google для различных списков пользовательских агентов. Есть страницы, которые показывают, что такое множество пользовательских агентов. Возможно, вам будет лучше с обнаружением функций, о котором я добавил параграф к своему ответу.
Нет, не ищет функции обнаружения. Мобильные переходы jquery работают нормально, они просто медленные на старых устройствах Android. Но все равно спасибо.
Ваш конкретный случай больше о «обнаружении производительности». Что вам нужно, так это переходы CSS3, которые выполняются непосредственно через CSS3, а не с помощью JS с jQuery откатом, когда CSS3 не поддерживается. Я написал слайд-шоу с довольно причудливыми переходами CSS3, которые работают на всех версиях устройств Android. Возможно, вы захотите проверить: addyosmani.com/blog/css3transitions-jquery .
Я не могу найти ничего, что говорит, что jQuery mobile будет использовать CSS3 для переходов. Если это произойдет, я не думаю, что это будет слишком медленно на любом устройстве Android.
Похоже, что это так: jquerymobile.com/demos/1.0b2/#/demos/1.0b2/docs/pages/… Они будут ускоряться в следующей версии, поэтому я просто хотел временно не показывать их на старых устройствах для сейчас, пока они не делают.
Не знал, что вы говорите о переходах страниц в отличие от анимации отдельных объектов. Если вы хотите выполнить обнаружение пользовательского агента, вам потребуется Google, пока вы не выясните, какие соответствующие строки пользовательского агента вам нужны.
Я добавил информацию о строке агента пользователя в свой ответ. Я не уверен, почему вы не можете найти это с Google. Кроме того, если у вас есть какие-либо устройства Android, существует множество веб-сайтов, которые покажут вам, какой пользовательский агент для устройства просмотра: whatsmyuseragent.com .
Я скучаю, понял. Да, я мог бы найти пользовательский агент. Я использую webview, а не браузер, поэтому я посмотрю, работает ли ваше регулярное выражение. Спасибо за вашу помощь, я уверен, что теперь я могу получить что-то работающее, на самом деле это не имеет значения, если это не работает на некоторых устройствах.
Я не могу прокомментировать, потому что у меня недостаточно рекламы. Просто хотел добавить, что мне пришлось изменить код neiker на
var match = ua.match(/Android\s([0-9\.]*)/i);
чтобы сделать регистр нечувствительным, потому что Galaxy S3 возвращал «андроид» вместо Android в свой пользовательский агент
Я сделал эту функцию и отлично поработал в Android 2.6.3, 4.2.2., 6.0.1 в разных браузерах и устройствах. Я думаю, что это может быть альтернативой.
function check_android_version() < var ua = navigator.userAgent; ua = ua.toLowerCase(); var and_pos = ua.search("android"); if(and_pos == -1) return 0; //not android var pv_pos = ua.indexOf(";", and_pos); var versao = ua.slice(and_pos+8, pv_pos); return versao; >
Это довольно просто, во-первых, поиск слова «андроид». Если не найден, возвращается 0 (не является пользовательским агентом Android). Затем найдите первый ‘;’ после позиции «android», которая знаменует конец версии. Как только эти позиции будут получены, «срез» изолирует номера версий (что «+8» удаляет слово «андроид» конечного результата), а затем возвращается.
Если кто-то найдет какой-то недостаток, было бы приятно поделиться.