質問したいこと
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のバージョンの違いによる動作の確認
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/21 04:35