2017/07/07

Android 7.0/7.1.1 でのイースターエッグで表示されるねこの違い

Android 7.0の正式版がリリースされて1年近くたち、Android 8.0のデベロッパープレビューも出てますが、Android 7.0/7.1.1 でのイースターエッグ(ねこあつめ、Android Neko)で表示されるねこの違いが気になったのでソースを見てみました。

Android 7.0でのソースは
https://android.googlesource.com/platform/frameworks/base/+log/android-7.0.0_r33/packages/EasterEgg
Android 7.1.1でのソースは
https://android.googlesource.com/platform/frameworks/base/+log/android-7.1.1_r46/packages/EasterEgg
を見ています。
Android 7.1.1と7.1.2のソースは同じでした。

Android 7.0のリリース後に修正された点は以下の7つです。
a801d40531b71f8c75bb03bb8fec429f503e391e
1bdc770e664d7052ae277ea07bd40bd36037d822
753762c8fa3fae29f20a0fc34531ecef3fef85a9 (1)
4a1bcd966b1c271909f38b41031cc012e233fbdd (2)
1e52909888fc27bc8d7f63ceeabba0a87b65e419
7c2e730f637ee40f2be642b08a3956895dbb178b (Android 7.1.0でのソース) (3)
946c2b89396554b2618ea5bbaff4652f75768016 (Android 7.1.1, 7.1.2でのソース)

この中で見た目が変わる修正が入ったのは3つありました。

(1) 753762c8fa3fae29f20a0fc34531ecef3fef85a9

一覧でのソート処理が入りました。ねこの体の色(HSV色空間の色相)でソートされます。
Android 7.0
Android 7.1.1

黒いねこ(色は0xFF212121)、白いねこ(色は0xFFFFFFFF)、ここにはいませんが灰色のねこ(色は0xFF616161)は色相の値が0.0のため、黒だけ、白だけ、灰だけの並びにはなりません。

(2) 4a1bcd966b1c271909f38b41031cc012e233fbdd

・ねこのデザインの調整
・一覧からの削除時にダイアログを表示
・共有時の画像サイズの変更(512x512 → 600x600)
が行われました。
ねこのデザインの調整で一番分かりやすい部分は、Android 7.0では足先が白くなるパターンとして右側だけ、左側だけというのがありましたが、Android 7.1.xでは前だけ、後ろだけになっています。(上の画像だと #139, #131, #574)

(3) 7c2e730f637ee40f2be642b08a3956895dbb178b

生成されたねこに付ける名前が修正されています。(ここまでの修正がAndroid 7.1.0に含まれています)

Android 7.0, 7.1.xともにねこの生成には乱数が使用されているのですが、乱数の生成に必要なシードから名前が付けられます。
Android 7.0ではシードの上3桁、Android 7.1.xではシードの下3桁(正確にはシードを1000で割った余り)になっています。
Android 7.0ではシードが3桁未満だとアプリが(多分)落ちます。
シードは https://android.googlesource.com/platform/frameworks/base/+/android-7.0.0_r33/packages/EasterEgg/src/com/android/egg/neko/Cat.java#182 で生成されていて、 Math.abs(ThreadLocalRandom.current().nextInt()) となっているので、3桁未満になる可能性は低いです。
Android 7.1.xは下3桁になったのでアプリが落ちることは無くなりました。この修正で名前の数字部分が1桁、2桁のねこが現れるようになったと思います。


補足:
・シードの上3桁(Android 7.0)、下3桁(Android 7.1.x)をねこの名前にしているので、名前は同じなのに色が違うというのが起こります。
・ねこを全部集めようと思ってもシードが231個あるのでねこもその数だけいます。ただ、全く同じ柄のねこになる場合があるので柄の種類としては231より少なくなると思われます。(2017/07/10訂正: シードは232個ではなく231個でした)
Android 7 でのイースターエッグで表示されるねこの種類 (1)
Android 7 でのイースターエッグで表示されるねこの種類 (2)

おまけ:
ねこの体の色は
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r46/packages/EasterEgg/src/com/android/egg/neko/Cat.java#82 で設定されていて、11個が定義されています。
P_BODY_COLORS の最後が "0" になっていますが、これは透明ではなく、
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r46/packages/EasterEgg/src/com/android/egg/neko/Cat.java#152 で乱数を使って体の色を決めています。(Color.HSVToColor(new float[]{}) はアルファ値を 0xFF でHSVToColor(int alpha, float hsv[])を呼び出しているので生成される色は透明になりません。)

P_BODY_COLORSで定義されている11色はこのようになっています。

P_BODY_COLORSの最後の "0" に当たった場合、色はランダムになります。

0 件のコメント:

コメントを投稿