d4rken-org / sdmaid

SD Maid is an Android app that helps you manage files and apps.
https://play.google.com/store/apps/details?id=eu.thedarken.sdm
1.51k stars 745 forks source link

Failure to grant secondary storage access via SAF #1678

Closed d4rken closed 6 years ago

d4rken commented 6 years ago

Mapping the SAF Uri fails due to a reflection call failing.

05-09 18:42:36.683 5995-5995/eu.thedarken.sdm W/u.thedarken.sd: Accessing hidden method Landroid/os/storage/StorageVolume;->getOwner()Landroid/os/UserHandle; (blacklist, reflection)
05-09 18:42:36.683 5995-5995/eu.thedarken.sdm W/u.thedarken.sd: Accessing hidden method Landroid/os/storage/StorageVolume;->getOwner()Landroid/os/UserHandle; (blacklist, reflection)
    Accessing hidden method Landroid/os/storage/StorageVolume;->getOwner()Landroid/os/UserHandle; (blacklist, reflection)
05-09 18:42:36.683 5995-5995/eu.thedarken.sdm E/SDM:StorageVolumeRepository: StorageVolumeX reflection issue
    java.lang.NoSuchMethodException: getOwner []
        at java.lang.Class.getMethod(Class.java:2068)
        at java.lang.Class.getMethod(Class.java:1690)
        at eu.thedarken.sdm.tools.storage.oswrapper.manager.StorageVolumeX.getOwner(StorageVolumeX.java:138)
        at eu.thedarken.sdm.tools.storage.oswrapper.mapper.BaseRepository.isMatch(BaseRepository.java:83)
        at eu.thedarken.sdm.tools.storage.oswrapper.mapper.BaseRepository.getVolumeRoot(BaseRepository.java:47)
        at eu.thedarken.sdm.tools.storage.oswrapper.mapper.StorageVolumeMapper.updateMappings(StorageVolumeMapper.java:108)
        at eu.thedarken.sdm.main.ui.setup.steps.SAFSetupFragment.onActivityResult(SAFSetupFragment.java:251)
        at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
        at eu.thedarken.sdm.ui.SDMActivity.onActivityResult(SDMActivity.java:95)
        at android.app.Activity.dispatchActivityResult(Activity.java:7448)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4365)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4414)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
05-09 18:42:36.715 5995-5995/eu.thedarken.sdm E/SDM:StorageVolumeRepository: getVolumeRoot(UriPermission {uri=content://com.android.externalstorage.documents/tree/19F6-2209%3A, modeFlags=3, persistedTime=1525891356680}) via getVolumeList() failed.
05-09 18:42:36.717 5995-5995/eu.thedarken.sdm W/u.thedarken.sd: Accessing hidden method Landroid/os/storage/VolumeInfo;->getDescription()Ljava/lang/String; (blacklist, reflection)
05-09 18:42:36.717 5995-5995/eu.thedarken.sdm E/SDM:MarshmallowRepository: VolumeInfoX reflection issue
    java.lang.NoSuchMethodException: getDescription []
        at java.lang.Class.getMethod(Class.java:2068)
        at java.lang.Class.getMethod(Class.java:1690)
        at eu.thedarken.sdm.tools.storage.oswrapper.manager.VolumeInfoX.<init>(VolumeInfoX.java:55)
        at eu.thedarken.sdm.tools.storage.oswrapper.manager.StorageManagerX.getVolumes(StorageManagerX.java:112)
        at eu.thedarken.sdm.tools.storage.oswrapper.mapper.MarshmallowRepository.getVolumeRoot(MarshmallowRepository.java:44)
        at eu.thedarken.sdm.tools.storage.oswrapper.mapper.StorageVolumeMapper.updateMappings(StorageVolumeMapper.java:108)
        at eu.thedarken.sdm.main.ui.setup.steps.SAFSetupFragment.onActivityResult(SAFSetupFragment.java:251)
        at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
        at eu.thedarken.sdm.ui.SDMActivity.onActivityResult(SDMActivity.java:95)
        at android.app.Activity.dispatchActivityResult(Activity.java:7448)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4365)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4414)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
05-09 18:42:36.741 5995-5995/eu.thedarken.sdm E/SDM:MarshmallowRepository: getVolumeRoot(UriPermission {uri=content://com.android.externalstorage.documents/tree/19F6-2209%3A, modeFlags=3, persistedTime=1525891356680}) via getVolumes() (API23+) failed.
05-09 18:42:36.742 5995-5995/eu.thedarken.sdm E/SDM:StorageVolumeMapper: eu.thedarken.sdm.tools.exceptions.MissingVolumeRootException: No VolumeRoot for: /tree/19F6-2209:
        at eu.thedarken.sdm.tools.storage.oswrapper.mapper.StorageVolumeMapper.updateMappings(StorageVolumeMapper.java:116)
        at eu.thedarken.sdm.main.ui.setup.steps.SAFSetupFragment.onActivityResult(SAFSetupFragment.java:251)
        at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
        at eu.thedarken.sdm.ui.SDMActivity.onActivityResult(SDMActivity.java:95)
        at android.app.Activity.dispatchActivityResult(Activity.java:7448)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4365)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4414)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
05-09 18:42:36.749 5995-5995/eu.thedarken.sdm E/SDM:UriAccessFragment: Invalid uri permission for Storage(location=SDCARD, path=/storage/19F6-2209, userHandle=-1, flags=[SECONDARY], safUri=null, mount=Mountpoint(path=/storage/19F6-2209, blockDevice=/mnt/media_rw/19F6-2209, fileSystemType=SDCARDFS, options=[noexec, rw, fsuid=1023, nodev, fsgid=1023, nosuid, noatime, gid=9997, mask=18])), releasing: content://com.android.externalstorage.documents/tree/19F6-2209%3A
d4rken commented 6 years ago

There is currently no alternative to StorageVolume.getOwner() so we have to hardcode this for now.