質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

5257閲覧

Android_idの桁数について

leoleo2

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2019/07/20 10:05

質問したいこと

AndroidIdの桁数について、Android8以降とAndroid7以前で違いがあるように見えます。
この違いの原因を探っているのですが、手詰まっているのでご存知の方がいらっしゃったら教えていただきたいです。

発生している問題

Android8以降では、AndroidIdが必ず16桁になるように見える
ex:123456789abcde0(末尾にゼロがつく)

Android7以前では、AndroidIdが15桁以下も生じるように見える。確率約20~16分の1で発生
ex:123456789abcde(末尾ゼロがない)

期待したこと

Anrodi8のAndroid_id関連の処理の何処かにパディングに相当する処理があるのではないかと考えて、探しましたが見つかりません。
公式ドキュメントにも、8から生成と切り替えに関する取扱が変わることはありましたが、パディングについては特に言及ありません。
https://developer.android.com/about/versions/oreo/android-8.0-changes?hl=ja

試したこと

以下のことを試したor確認しました。

コードの確認は以下を利用しました。
https://search.siprop.org/android-8.0.0_r1.0/

####生成部のコードの確認(動作確認)
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
このあたりで生成されているように見えます。

java

1 2746 String androidId = Long.toHexString(new SecureRandom().nextLong()); 2 2747 secureSettings.insertSettingLocked(Settings.Secure.ANDROID_ID, androidId, 3 2748 null, true, SettingsState.SYSTEM_PACKAGE_NAME);

このコードは切り出して自分でも実行してみましたが12-16桁の16進数を吐き出します。16-12桁が生じる確率も、ほぼ16分の1ずつと計算通りでした。
実機での確認では14桁以下の生成事例はありませんが、単に確率の問題という気がしています。

####格納部のコード確認
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
このあたりで格納されています。
要は、Settingクラスを生成しているので

java

1 317 public boolean insertSettingLocked(String name, String value, String tag, 2 318 boolean makeDefault, String packageName) { 3 319 if (TextUtils.isEmpty(name)) { 4 320 return false; 5 321 } 6中略 7 333 } else { 8 334 newState = new Setting(name, value, makeDefault, packageName, tag); 9 335 mSettings.put(name, newState); 10 336 }

中身を見ると(SettingStateの内部クラス)
コンストラクタ

java

1 844 public Setting(String name, String value, boolean makeDefault, String packageName, 2 845 String tag) { 3 846 this.name = name; 4 847 update(value, makeDefault, packageName, tag, false); 5 848 }

update()

java

1 911 public boolean update(String value, boolean setDefault, String packageName, String tag, 2 912 boolean forceNonSystemPackage) { 3 913 if (NULL_VALUE.equals(value)) { 4 914 value = null; 5 915 } 6 916 7中略 8 953 9 954 init(name, value, tag, defaultValue, packageName, defaultFromSystem, 10 955 String.valueOf(mNextId++)); 11 956 return true; 12 957 }

init()

java

1 859 private void init(String name, String value, String tag, String defaultValue, 2 860 String packageName, boolean fromSystem, String id) { 3 861 this.name = name; 4 862 this.value = value; 5 863 this.tag = tag; 6 864 this.defaultValue = defaultValue; 7 865 this.packageName = packageName; 8 866 this.id = id; 9 867 this.defaultFromSystem = fromSystem; 10 868 }

の順に呼び出していますが、結局Stringをコピーしているだけで、特段パディングのような処理は実施していません。
なお、ここはAndroid7だと違った引数のメソッドで実行しており、updateが挟まっていませんでした。

####取得部のコード確認
Android_idを取り出す際の一般的なコードはこのような感じなので

java

1String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

取り出しに関するコードは以下かと思います
frameworks/base/core/java/android/provider/Settings.java
Secure.getStringForUser()経由で、最後のvalueが返る

java

11837 public String getStringForUser(ContentResolver cr, String name, final int userHandle) { 2 1838 final boolean isSelf = (userHandle == UserHandle.myUserId()); 3 4中略 5 6 1894 if (Settings.isInSystemServer() && Binder.getCallingUid() != Process.myUid()) { 7 1895 final long token = Binder.clearCallingIdentity(); 8 1896 try { 9 1897 b = cp.call(cr.getPackageName(), mCallGetCommand, name, args); 10 1898 } finally { 11 1899 Binder.restoreCallingIdentity(token); 12 1900 } 13 1901 } else { 14 1902 b = cp.call(cr.getPackageName(), mCallGetCommand, name, args); 15 1903 } 16 1904 if (b != null) { 17 1905 String value = b.getString(Settings.NameValueTable.VALUE); 18 19中略 20 21 1944 } else { 22 1945 if (LOCAL_LOGV) Log.i(TAG, "call-query of user " + userHandle 23 1946 + " by " + UserHandle.myUserId() 24 1947 + " so not updating cache"); 25 1948 } 26 1949 return value;

当然といえば当然ですが、Android_idに対して特段パディングのような処理は見つかりませんでした。

####SQLite格納時にパディングされる可能性を考え、SQLiteで当該のデータをいろいろなデータ型に対して投入してみる
「123456789abcde0」や「0123456789abcde」
のようなデータをJavag側からはStringで、SQLiteにTEXT,NUMETRIC,INTEGERで定義した領域に渡してみる。
いろいろと興味深かったですが、コレだという結果には出会えませんでした。

まだ確認していないこと

・ARTのバージョン違いによる動作の違い確認
・SQLiteのバージョンの違いによる動作の確認

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

//途中経過的なものですが…

https://qiita.com/operandoOS/items/b41fa4a1c6c009c64a10
上記ページによると ANDROID ID とは

「ランダムに生成される64ビットの数値を16進数文字列にしたもの」なので文字数は固定ではない

ちなみに、Android O より前のはなし

https://mole-kingdom.com/wpbl/2015/05/25/12265.html
上記ページでは桁数が変わる件の考察がされています。

https://developers-jp.googleblog.com/2017/04/changes-to-device-identifiers-in.html
「Android O での端末識別子の変更について」によると

ANDROID_ID の値は、パッケージ名と署名キーが同じである限り、パッケージをアンインストールして再インストールしても変わらなくなります。

とあるので、そのへん絡みでそういう話になってるのかなあ、と。
すんませんが、とりあえずここまで。

投稿2019/07/20 11:33

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leoleo2

2019/07/21 04:35

回答ありがとうございます。 はい、AndroidIDが16桁保証されていないということは、ソースからも確認できております。自分も実際に同じソースで100万回生成とかやってみましたが、16-12桁まで生じうるようです。 15桁以下の発生確率も16-20分の1ずつとほぼ計算通りです。 問題は、Android8以降だとパディングされているように「見える」ということなのですが、その処理が見つけられず。 仕様に「16桁保証」とない以上(12桁までしか生じない、とも書いてませんが)15桁以下もくる前提でコードを書くべきなんでしょうけど、気持ち悪いので、、、 自分の方でも調査勧めます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問