Ответ 1
С точки зрения безопасности, вы всегда должны предоставлять свой собственный IV, потому что вы бы полностью контролировали его качество рандомизации и устраняли одну потенциальную уязвимую точку безопасности.
Что касается исключения, в вашей перспективе, IV является случайным и хорошим. Но в перспективе Android ваш предоставленный IV является фиксированным и, следовательно, не очень хорошим, API не знает, правильно ли он генерируется случайным образом или нет. Таким образом, исключение "Caller-provided IV not permitted when encrypting"
является просто общим предупреждением, которое пытается предупредить разработчиков о том, чтобы использовать плохой IV и поощрять их использовать встроенный IV.
Однако обратите внимание, что встроенный IV - это всего лишь один метод построения IV. Как вы можете видеть, никто не гарантирует его качество с уровня API 23, поэтому наилучшей практикой является обеспечение собственного качества IV.