ANDROID_ID 在 abd 和 API 26 上的代码中不同

Jas*_*son 4 android adb android-8.0-oreo

在模拟器上使用 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
Run Code Online (Sandbox Code Playgroud)

在模拟器上使用 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
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 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));

}
}
Run Code Online (Sandbox Code Playgroud)

单击带有 API 25 的设备上的按钮时,我得到与从 adb 请求 ANDROID_ID 时相同的值:

adb shell settings get secure android_id
Run Code Online (Sandbox Code Playgroud)

如果我更改了 android_id,我仍然会在控制台中使用按钮和使用 adb 获得更新的 android_id。

单击带有 API 26 的设备上的按钮时,我得到的值与使用 adb 时得到的值不同。如果我使用 adb 更改 android_id 我将在使用 adb 但不使用按钮时获得更新的值。

Ale*_* P. 5

来自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只要签名密钥相同(并且在 OTA 到 Android 8.0 版本之前未安装应用程序),卸载或重新安装软件包时的值 不会更改。

ANDROID_ID即使系统更新导致包签名密钥更改,的值也不会更改。

在附带 Google Play 服务和广告 ID 的设备上,您必须使用广告 ID。一个简单的标准系统,用于通过应用程序获利,广告 ID 是唯一的、用户可重置的广告 ID。它由 Google Play 服务提供。

其他设备制造商应继续提供ANDROID_ID

shell用户是从您的应用程序的用户ID不同-这样的差异。

  • 它是隐含的。*“ANDROID_ID”的值对于应用签名密钥、用户和设备的每个组合都是唯一的。因此,在同一设备上运行的具有不同签名密钥的应用将不再看到相同的 Android ID*。`shell` 用户与您的应用程序的用户 ID 不同 - 因此差异 (5认同)