首页 > 解决方案 > Android 10 仍可使用 ANDROID_ID

问题描述

根据谷歌的说法,如果没有一些先决条件,ANDROID_ID(也称为 SSAID)不应该在 Android 10 系统上访问(参见:https ://developer.android.com/about/versions/10/privacy/changes )

• If your app targets Android 10 or higher, a SecurityException occurs.

• If your app targets Android 9 (API level 28) or lower, the method
  returns null or placeholder data if the app has the READ_PHONE_STATE
  permission. Otherwise, a SecurityException occurs.

我的问题是,我仍然能够在没有上述任何前提条件的情况下访问 ANDROID_ID。

我创建了一个目标平台为 Android 10 API 级别 29 的 Kotlin 项目。

在这个项目中,我运行了这段代码:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Settings
import android.util.Log


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.i("ANDROID ID", "##### READ Android ID ######")

        try {
            val my_android_id = Settings.Secure.getString(this.contentResolver, Settings.Secure.ANDROID_ID)
            Log.i("ANDROID ID", my_android_id)

        }
        catch (e: SecurityException){
            Log.i("ANDROID ID", "Secure Exception!")
        }

    }
}

结果是,ANDROID_ID 被写入 logcat 没有任何问题。该值不是虚拟值,而是实际的 ANDROID_ID。这已经在模拟器和真实设备(Pixel 2)上进行了测试。

标签: androidkotlinidentifier

解决方案


也许为时已晚,但根据 android O android developer's blog中的这篇文章

  • 只要软件包名称和签名密钥相同,ANDROID_ID 值不会在软件包卸载/重新安装时更改。应用程序可以依靠此值在重新安装时保持状态。
  • 如果应用程序安装在运行早期版本 Android 的设备上,则当设备更新到 Android O 时,Android ID 保持不变,除非卸载并重新安装该应用程序。
  • 仅当设备恢复出厂设置或签名密钥在卸载和重新安装事件之间轮换时,Android ID 值才会更改。
  • 只有附带 Google Play 服务和广告 ID 的设备制造商才需要进行此更改。其他设备制造商可能会提供替代的可重置 ID 或继续提供 ANDROID ID。

推荐阅读