Avoid MTP open binder call to MediaProvider
For transcoding, we forced all MTP file opens on external storage to
use the ContentResolver#openTypedAssetFile. This allowed us to
flexibly support transcoding Option A/Option B where we might want to
transcode by default or not transcode by default. Unfortunately, this
caused performance issues when transferring a lot of files via MTP.
Since in Android S, we are launching with Option A, which doesn't
transcode by default we can limit the ContentResolver opens to only
cases where transcode=true. Transcode=true is really an advanced user
option and should be false for most cases.
Test: Manual
Bug: 189977601
Change-Id: I9b2f94189e69a8f9d11803527a0095537f049c84
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index becbe6e..6fcf119 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -794,18 +794,28 @@
struct stat sstat;
uint64_t finalsize;
bool transcode = android::base::GetBoolProperty("sys.fuse.transcode_mtp", false);
+ bool filePathAccess = true;
ALOGD("Mtp transcode = %d", transcode);
- mfr.fd = mDatabase->openFilePath(filePath, transcode);
- // Doing this here because we want to update fileLength only for this case and leave the
- // regular path as unchanged as possible.
- if (mfr.fd >= 0) {
+
+ // For performance reasons, only attempt a ContentResolver open when transcode is required.
+ // This is fine as long as we don't transcode by default on the device. If we suddenly
+ // transcode by default, we'll need to ensure that MTP doesn't transcode by default and we
+ // might need to make a binder call to avoid transcoding or come up with a better strategy.
+ if (transcode) {
+ mfr.fd = mDatabase->openFilePath(filePath, true);
fstat(mfr.fd, &sstat);
finalsize = sstat.st_size;
fileLength = finalsize;
- } else {
- ALOGW("Mtp open via IMtpDatabase failed for %s. Falling back to the original",
- filePath);
+ if (mfr.fd < 0) {
+ ALOGW("Mtp open via IMtpDatabase failed for %s. Falling back to the original",
+ filePath);
+ filePathAccess = true;
+ } else {
+ filePathAccess = false;
+ }
+ }
+ if (filePathAccess) {
mfr.fd = open(filePath, O_RDONLY);
if (mfr.fd < 0) {
return MTP_RESPONSE_GENERAL_ERROR;