在模拟器上使用API 25:
adb shell settings put secure android_id 8af8770a27cfd182
adb shell settings get secure android_id //gives 8af8770a27cfd182
Secure.getString(context.getContentResolver(), Secure.ANDROID_ID) //gives 8af8770a27cfd182
在模拟器上使用API 26:
adb shell settings put secure android_id 8af8770a27cfd182
adb shell settings get secure android_id //gives 8af8770a27cfd182
Secure.getString(context.getContentResolver(), Secure.ANDROID_ID) //gives 6e4f84f5513b80e1
我已经了解了API 25和26之间ANDROID_ID的变化,但为什么adb和代码会给我不同的结果?
更新:
创建了一个简单的应用程序来消除旧的应用程序的复杂性。新应用程序只有一个主要活动,上面有一个按钮:
package com.example.diolaj01.testandroidid;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
protected void GetAndroidId(View view){
Log.e("myDebugTag", Settings.Secure.getString(view.getContext().getContentResolver(),
Settings.Secure.ANDROID_ID));
}
}
当点击具有API 25的设备上的按钮时,我获得与从adb请求ANDROID_ID时相同的值:
adb shell settings get secure android_id
如果我更改了android_id,我仍然会在控制台中使用按钮并使用adb获得更新的。
当点击具有API 26的设备上的按钮时,我获得的值与使用adb时得到的值不同。如果我使用adb更改android_id,我会在使用adb但不使用按钮时获取更新后的值。
答案 0 :(得分:3)
来自https://developer.android.com/about/versions/oreo/android-8.0-changes.html#privacy-all
隐私权Android 8.0(API级别26)使以下与隐私相关 改变平台。
平台现在以不同方式处理标识符。
对于那些应用程序 在OTA之前安装到Android 8.0版本(API级别26) (API级别26),
ANDROID_ID
的值保持不变,除非 在OTA之后卸载然后重新安装。保护价值观 在OTA之后的卸载过程中,开发人员可以关联旧的和新的 使用键/值备份的值。适用于设备上安装的应用 运行Android 8.0时,
ANDROID_ID
的值现在是每个应用程序的范围 签名密钥以及每个用户。ANDROID_ID
的值是唯一的 对于应用签名密钥,用户和设备的每个组合。作为一个 结果,具有不同签名密钥的应用程序在同一设备上运行 更长时间看到相同的Android ID(即使是同一个用户)。的价值 只要对包卸载或重新安装,
ANDROID_ID
不会更改 因为签名密钥是相同的(并且之前没有安装应用程序 对Android 8.0版本的OTA。)
ANDROID_ID
的值没有 即使系统更新导致程序包签名密钥,也会更改 变化在使用Google Play服务和广告的设备上 ID,您必须使用广告ID。一个简单,标准化的货币化系统 应用程序,广告ID是一种独特的,用户可重置的广告ID。 它由Google Play服务提供。
其他设备制造商 应该继续提供
ANDROID_ID
。