Как безопасно передать данные между приложениями с разной подписью

«Как безопасно передать данные между приложениями с разной подписью» — вопрос из категории Android компоненты, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для безопасной передачи данных между приложениями с разной подписью используйте ContentProvider с проверкой разрешений или BroadcastReceiver с явным указанием пакета получателя.

ContentProvider с проверкой подписи:

<provider
    android:name=".MyProvider"
    android:authorities="com.example.provider"
    android:exported="true"
    android:permission="com.example.permission.READ_DATA" />

Проверя подпись перед доступом:

fun checkCallerSignature(context: Context): Boolean {
    val callingUid = Binder.getCallingUid()
    val packageManager = context.packageManager
    val callerPackage = packageManager.getNameForUid(callingUid)
    val callerSignature = packageManager.getPackageInfo(callerPackage, PackageManager.GET_SIGNATURES).signatures[0]
    val trustedSignature = // захардкоженная подпись доверенного приложения
    return callerSignature == trustedSignature
}

Broadcast с явным указанием пакета:

val intent = Intent("com.example.ACTION_DATA").apply {
    setPackage("trusted.app.package")
    putExtra("key", "secure_data")
}
sendBroadcast(intent)

Также можно использовать Binder с кастомным интерфейсом AIDL, но это сложнее в реализации.