Android バージョンやコードネームなどからのシェアの一覧取得

Android のバージョンを表す場合,

相手によって言い方を変えなければなりません.

「Android 4.4 はー」

「ロリポップってー」

「minSdk は 19 でー」

「Android M はー」

特に,

会議などでバージョン別のユーザの割合を話しているときには,

営業からプログラマまで言い方がバラバラでいきなり

「ジンジャーブレッドまではもう切り捨ててもいいんじゃね?」

といわれてもすぐにピンとこなかったりします.

いくつかオフィシャルに公開されている一般的な名称の一覧があります.

codenames__tags__and_build_numbers___android_open_source_project

Codenames, Tags, and Build Numbers | Android Open Source Project

%e3%82%bf%e3%82%99%e3%83%83%e3%82%b7%e3%83%a5%e3%83%9b%e3%82%99%e3%83%bc%e3%83%88%e3%82%99___android_developers

ダッシュボード | Android Developers

また, システムの内部的には, Build.VERSION_CODES とよばれる名称が, APIレベルという整数を表します.

build_version_codes___android_developers

Build.VERSION_CODES | Android Developers

android_os_%e3%83%8f%e3%82%99%e3%83%bc%e3%82%b7%e3%82%99%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%88%e3%82%99%e3%83%8d%e3%83%bc%e3%83%a0%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b

Android OS バージョンのコードネームを取得する

いちいちめんどくさいのでスクリプトにしておきます.


#!/usr/local/bin/php
<?php
$versions = '
LV VERSION_CODE           VERSION       CODE_NAME 
 1 BASE                   1             (no code name)
 2 BASE_1_1               1.1           (no code name)
 3 CUPCAKE                1.5           Cupcake
 4 DONUT                  1.6           Donut
 5 ECLAIR                 2             Eclair
 6 ECLAIR_0_1             2.0.1         Eclair
 7 ECLAIR_MR1             2.1           Eclair
 8 FROYO                  2.2.x         Froyo
 9 GINGERBREAD            2.3 - 2.3.2   Gingerbread
10 GINGERBREAD_MR1        2.3.3 - 2.3.7 Gingerbread
11 HONEYCOMB              3             Honeycomb
12 HONEYCOMB_MR1          3.1           Honeycomb
13 HONEYCOMB_MR2          3.2.x         Honeycomb
14 ICE_CREAM_SANDWICH     4.0.1 - 4.0.2 Ice Cream Sandwich
15 ICE_CREAM_SANDWICH_MR1 4.0.3 - 4.0.4 Ice Cream Sandwich
16 JELLY_BEAN             4.1.x         Jelly Bean
17 JELLY_BEAN_MR1         4.2.x         Jelly Bean
18 JELLY_BEAN_MR2         4.3.x         Jelly Bean
19 KITKAT                 4.4 - 4.4.4   KitKat
20 KITKAT_WATCH           4.4W          KitKat Watch
21 LOLLIPOP               5             Lollipop
22 LOLLIPOP_MR1           5.1           Lollipop
23 M                      6             Marshmallow
24 N                      7             Nougat
25 N_MR1                  7.1           Nougat
';

$url = 'https://developer.android.com/about/dashboards/index.html';
$versions = explode("\n", trim($versions));

$html  = file_get_contents($url);
preg_match_all('/var VERSION_DATA =(.*?)var VERSION_NAMES =/si',
               $html, $matches);
$json = json_decode(trim($matches[1][0], " \t\n\r\0\x0B[];"), true);

$sum = 100;
foreach ($json['data'] as $data) {
    printf("%5s %5s %s\n", 
           $data['perc'], sprintf('%03.1f', $sum), $versions[$data['api']]);
    $sum -= $data['perc'];
}

ユーザのシェアの数字は月一で更新される公式ページから実行時に取得します.

左から,

「ユーザ割合」
「そのバージョンをminSdkにしたときのカバー率」
「API レベル」
「バージョンコード」
「OSバージョン」
「コードネーム」

としています.


  0.1 100.0  8 FROYO                  2.2.x         Froyo
  1.3  99.9 10 GINGERBREAD_MR1        2.3.3 - 2.3.7 Gingerbread
  1.3  98.6 15 ICE_CREAM_SANDWICH_MR1 4.0.3 - 4.0.4 Ice Cream Sandwich
  4.9  97.3 16 JELLY_BEAN             4.1.x         Jelly Bean
  6.8  92.4 17 JELLY_BEAN_MR1         4.2.x         Jelly Bean
  2.0  85.6 18 JELLY_BEAN_MR2         4.3.x         Jelly Bean
 25.2  83.6 19 KITKAT                 4.4 - 4.4.4   KitKat
 11.3  58.4 21 LOLLIPOP               5             Lollipop
 22.8  47.1 22 LOLLIPOP_MR1           5.1           Lollipop
 24.0  24.3 23 M                      6             Marshmallow
  0.3   0.3 24 N                      7             Nougat

おおまかですが, すばやく一覧で確認できます.

Jelly Bean (Android 4.3) までを切り捨てた場合, minSdk=19 となり, 利用できるのは Android 4.4 以降の kitKat ユーザー で, 全体の 83.6% 程度なのかっ!


通知が表示されない とかどうせブロックの設定だろ! → 原因「フィルター」

「通知をONにしているのに表示されないんだけど...」

ありますよね!

実際, 設定が多すぎて分かりづらいです.

ネット上の情報も, OSバージョンや機種の違いなどでさらに混乱します.

とりあえず, すべての設定項目を列挙してみます.

そのアプリ内での「設定」

そのアプリの中の「設定」をONにします.

LINEの場合は以下のような画面ですね.

20161125-152024

OSの設定「アプリ」から

OSの「設定」アイコンから「アプリ」を選択.

そして対象アプリを選択後,「通知を表示」のチェックボックスをONにします.

20161125-153800

ネット上にこの設定の話がたくさんありますが, Android 6.x (Marshmallow) では, このチェックボックはなかったりします.

OSの設定「通知」から

OSの「設定」アイコンから「通知」を選択.

「ヘッドアップ」「端末がロック」とよくわからない言葉が表示されていますが, とりあえず上から2つをONにしていきます.

20161125-154834

続いてその下の「アプリの通知」をタップして対象のアプリを選択して

「ブロック」はOFFに, ロック画面に表示」をONにします.

20161125-155321

この画面は, Android 6.0 では, こんな画面なので, 1つOFF, 2つONにします.

20161125-160017

続いて, 私がはまっていた「フィルタリング」の設定です.

通知バーが表示されたときに, 長押しからなんとなくこの「フィルタリング」を押してしまっている人が多いのではないかと思います.

20161125-161030

簡単に非表示にできるわりには, 再度表示させるときの設定がわかりずらいです.

先ほどの「通知」の画面で「通知のフィルタリング」をタップします.

20161125-161447

「フィルタリング(無視して表示しない)」している通知が一覧で表示されます.

20161125-161727

この中から復活表示したい通知をタップすると, 無視された回数などが表示されますので, ここで「削除」を押すとフィルターから除外されて表示されるようになります!

20161125-162824

まとめ

「通知する」をONにしたあと, 「ブロック」と「フィルター」をOFFにする.

OS設定は「設定-通知」と「設定-アプリ」の2つの中のどこかにある.

設定多すぎ.

👉 【Android10/11】通知が来ない、遅れるときに見直すべき「電池(バッテリー)の最適化」 

👉【Android Pie】「通知」設定のシンプルな考え方


Espresso で アイドリング

espresso

Espresso は以下の非同期処理は考慮してくれるようですが.

- メッセージキューを利用したUIイベント
- デフォルト AsyncTask のスレッドプールを利用したタスク

Square Island: Espresso: Custom Idling Resource

これらに該当しない処理でも, テスト実行を「あるタイミング」まで待たせたいときがありますよね?

カスタムした「IdlingResource」を使ってみましょう.

Espresso Idling Resource

ここで書かれているアプローチとしては2つ.

Counting running jobs: When a job starts, increment a counter. When it finishes, decrement it. The app is idle if the counter is zero. This approach is very simple and accounts for most situations. CountingIdlingResource does exactly this.

Querying state: It might be more reliable to ask a work queue or an HTTP client (or whatever is doing the background work) if it is busy. If the state is exposed, implementing an Idling Resource is trivial.

これらのうち, 汎用的に使えるジョブカウンターを利用した方法を, Googleサンプルを眺めつつ手順整理しておきます.

Android Testing Codelab

1. IdlingResource ユーティリティの作成

アイドリング向けのユーテリティを作成します.
そのまま2つのクラスを利用してもいいかもしれません.

EspressoIdlingResource.java at master · googlecodelabs/android-testing

SimpleCountingIdlingResource.java at master · googlecodelabs/android-testing

2. テスト対象の Activity に記述

テスト対象となる Activity にテスト時に利用するメソッドを記述しておきます.
テスト時にはこのメソッドを利用して, 先ほどのユーティリティを利用登録します.


    @VisibleForTesting
    public IdlingResource getCountingIdlingResource() {
        return EspressoIdlingResource.getIdlingResource();
    }

AddNoteActivity.java at master · googlecodelabs/android-testing

NotesActivity.java at master · googlecodelabs/android-testing

3. 「待たせる」処理の記述

Presenter や View などのテスト対象クラス内にアイドリングの利用タイミングを記述しておきます.


EspressoIdlingResource.increment(); 


EspressoIdlingResource.decrement(); 

カウンターを増減しながらアイドリングを操作します.
カウンターが0になると処理が再開されます.


    @Override
    public void loadNotes(boolean forceUpdate) {
        mNotesView.setProgressIndicator(true);
        if (forceUpdate) {
            mNotesRepository.refreshData();
        }

        // The network request might be handled in a different thread so make sure Espresso knows
        // that the app is busy until the response is handled.
        EspressoIdlingResource.increment(); // App is busy until further notice

        mNotesRepository.getNotes(new NotesRepository.LoadNotesCallback() {
            @Override
            public void onNotesLoaded(List<Note> notes) {
                EspressoIdlingResource.decrement(); // Set app as idle.
                mNotesView.setProgressIndicator(false);
                mNotesView.showNotes(notes);
            }
        });
    }

AddNoteFragment.java at master · googlecodelabs/android-testing

NotesPresenter.java at master · googlecodelabs/android-testing

4. テスト内で登録する

テスト対象Activityに記述したメソッドを利用してテストコードへ登録します
アイドリング処理がテスト時に反映されます.


    @Before
    public void registerIdlingResource() {
        Espresso.registerIdlingResources(
                mAddNoteIntentsTestRule.getActivity().getCountingIdlingResource());
    }

    @After
    public void unregisterIdlingResource() {
        Espresso.unregisterIdlingResources(
                mAddNoteIntentsTestRule.getActivity().getCountingIdlingResource());
    }

AddNoteScreenTest.java at master · googlecodelabs/android-testing

まとめ

テストにかかるコストがただの自己満足で終わらないようにしたいです.

JakeWharton/okhttp-idling-resource: An Espresso IdlingResource for OkHttp.

PSA: Dont Use Espresso Idling Resources like Google does · Philosophical Hacker