我正在开发一个在 Android 上充当设备策略控制器的应用程序,主要侧重于启用和处理安全日志记录。尽管按照文档正确设置了所有内容并启用了安全日志记录,但我没有在 DeviceAdminReceiver 子类中收到 onSecurityLogsAvailable 回调,尽管我能够通过不同的机制接收网络日志。
我的应用程序已通过 ADB 确认为设备所有者。
下面是与启用日志记录和设置 DeviceAdminReceiver 相关的简化代码。
...
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponentName = new ComponentName(context, AppDeviceAdminReceiver.class);
if (dpm.isDeviceOwnerApp(context.getPackageName())) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
dpm.setAffiliationIds(adminComponentName, Collections.singleton("my.unique.id"));
dpm.setSecurityLoggingEnabled(adminComponentName, true);
dpm.setNetworkLoggingEnabled(adminComponentName, true);
Log.d("Setup", "Logging enabled");
return true;
}
} else {
Log.w("Setup", "Not device owner, cannot enable logging.");
return false;
}
...
AppDeviceAdminReceiver 实现:
public class AppDeviceAdminReceiver extends DeviceAdminReceiver {
@Override
public void onSecurityLogsAvailable(@NonNull Context context, @NonNull Intent intent) {
Log.i("AdminReceiver", "Security logs available.");
// TODO: Handle logs...
}
@Override
public void onNetworkLogsAvailable(@NonNull Context context, @NonNull Intent intent, long batchToken, int networkLogsCount) {
Log.i("AdminReceiver", "Network logs available, count: " + networkLogsCount);
// TODO: Handle logs...
}
}
Manifest.xml 中的AppDeviceAdminReceiver:
<receiver
android:name=".AppDeviceAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
我尝试使用错误的代码解锁设备 5 次,启用和禁用蓝牙和 Wifi,使用 adb 安装/卸载应用程序,还使用命令
adb -s device_name shell dpm force-security-logs
强制生成安全日志。尽管如此,我仍然没有收到任何安全日志回调。
另一方面,我能够接收网络日志,但只有当我像 AppDeviceAdminReceiver 中那样使用 onReceive 方法时,而不是通过推荐的 onNetworkLogsAvailable 回调:
@Override
public void onReceive(@NonNull Context context, @NonNull Intent intent) {
Log.i("AppDeviceAdminReceiver", "Received intent: " + intent.getAction());
}
(我可以忍受这一点,这只是我遇到的另一个可能相关的问题)。
我在不同供应商的多个设备(从 Android 10 到 14)上测试了此行为,但没有成功接收安全日志。
我想知道是否可能有其他配置或权限被我忽略以接收此回调。任何关于为什么这可能行不通的见解或建议将不胜感激。
我也遇到了同样的问题。
解决方案是不重写DeviceAdminReceiver子类中的onReceive()。删除该代码后,我开始收到 onNetworkLogsAvailable() 和 onSecurityLogsAvailable() 的回调