[Guide] [App] [6.x.x & 7.x.x] Allow SDCard write access & switch SDCard Path

Search This thread

kishorerprem

Senior Member
Mar 3, 2012
62
102
Chittagong
From what I saw the original files although they are zipped does not contain any compression, while the patched has compression around 50%. I wonder if this can affect performance in some way
AutoPatcher uses Deflate compression method & normal compression level to repack jar. I think this will not affect in performance. I will try to improve the compression process if possible. But, I need a uncompressed jar file. If you got one, please send me the jar via PM.
 

kishorerprem

Senior Member
Mar 3, 2012
62
102
Chittagong
I just tried this on Resurrection Remix 5.8.4 where the original services.jar was 6.93 MiB and the patched services.jar is 3.09 MiB.

Why is the patched file size less than half of the original file size?

Sent from my SM-N910F using XDA Labs

From what I saw the original files although they are zipped does not contain any compression, while the patched has compression around 50%. I wonder if this can affect performance in some way
Patched jar compression process has been improved in new build. Now, AutoPatcher will try to detect compression method of original jar, then patched jar will be repacked in same way. Download the latest build from here https://xdaforums.com/attachment.php?attachmentid=4283664&d=1506406860
 
Last edited:

kishorerprem

Senior Member
Mar 3, 2012
62
102
Chittagong
How do I know if the framework.jar patch is working?

I don't see any difference with the paths

Internal SD card = /sdcard
External SD card = /storage/0000-0000/

I used the AutoPatcher on copies of services.jar and framework.jar. I then copied the automatically created SDPath file to /sdcard and then installed the patched jar files from within the recovery environment. Lastly I cleared the davlik-cache and rebooted.

This doesn't make any defference between above two paths. The changes will affect on applications, which are uses ExternalStorage to read/write files. Normally your device/phones storage is ExternalStorage for all apps. But, after patching your Removable SDCard Storage will be treated as ExternalStorage for all apps. As example before patching framework files AutoPatcher app was located you to phones storage when you clicked "Select File" button. After patching the path is swiched to SDCard Storage.
 

Vighneswar

Member
Feb 17, 2016
29
3
I flashed the patched files but still unable to download on sdcard through uTorrent and flud.
I'm on RR 5.8.4 in Redmi Note 4g.
Help me out if you can
 

kishorerprem

Senior Member
Mar 3, 2012
62
102
Chittagong
I flashed the patched files but still unable to download on sdcard through uTorrent and flud.
I'm on RR 5.8.4 in Redmi Note 4g.
Help me out if you can
@Vighneswar
For uTorrent- you have to select SDCard path manually when you add a torrent link to download. To select SDCard path manually use "Up" button instead of using dropdown list, when you are in "InternalStoarage/Download". I guess, this app will remember your last selected path for next download attempt.

For Flud- change the path manually to SDCard in "settings->storage->Storage path" of this app or clear application data (Note: this will reset all setting & data of this application) or uninstall & reinstall the app.

I am not much sure the above trick will work for you. You can follow these trick, if you are agree to test. Please note that, I will note be responsible if you lose anything.
 
Last edited:
  • Like
Reactions: ritter20

Vighneswar

Member
Feb 17, 2016
29
3
No Luck Brother
How do I check whether there's access writing to sd card is enabled? Any app which can successfully Write to sd card
 

totoascend88

Member
Dec 6, 2015
47
24
Hi guys,
I have developed an android application to patch framework.jar & services.jar automatically. The application have attached in attachment.

Instructions :-
a) Download & install the AutoPatcher.apk from attachment.
b) Copy /system/framwork/services.jar and /system/framework/framework.jar to External Storage.
c) Open the application & select services.jar or framwork.jar to patch by clicking on "Select File" button.
d) Select a patching option from patching options list.
e) Click the "Patch" button to patch the jar file.
f) Create flashable zip with patched file/files & flash the zip from recovery.

Can anyone test the app & report me back its working correctly or not?

Thanks..

EDIT: Attachment updated (Installation issue fixed).
EDIT: Attachment updated (Bug fixed).
a) Fixed issue with Jar selection.​
b) Fixed issues with patching framework.jar.​
c) Fixed issue: Can't boot after flashing the patched files.​

EDIT: Attachment updated (Removed unnecessary files from apk package)
EDIT: Attachment updated (Improved patched Jar compression process)

I have this from your app on my s7edge.. rom stock.. thanks for efforts
 

Attachments

  • Screenshot_20170928-225318.png
    Screenshot_20170928-225318.png
    212.3 KB · Views: 399
T

TheNatureOne

Guest
To test if writing to sdcard works I open terminal emulator and try to
touch /storage/0000-0000/test.txt
If successful the file will be created. If not you only can write with android framework regular mechanisms to allowed folders or using root elevation to access all folders.
 
  • Like
Reactions: kishorerprem

kishorerprem

Senior Member
Mar 3, 2012
62
102
Chittagong
I also used my mod in RR 5.8.5 & it worked. Anyway, here is your patched framework files- https://drive.google.com/file/d/0B7ssgT5S39JbM3I2aGNaVG5TYWM/view?usp=drivesdk

Make a flashable zip with these patched files, flash it from recovery, wipe dalvik-cache & reboot.

If not work, you may need to reinstall full ROM & then flash patched files. Please take a backup of your current ROM before doing this.
 

Top Liked Posts

  • There are no posts matching your filters.
  • 22


    Note:-
    After modifying your framework files by following the below tutorial all system & user apps will have the permission to write external SD Card without asking to user. Please keep backup of your ROM before doing anything. I will not be responsible for any damage or boot loop.

    Method 1 : Automatic patch

    Auto Patcher app :
    I have developed an android application to do all the patching work automatically. To download please click here- https://xdaforums.com/showpost.php?p=73854657&postcount=84


    Method 2 : Manual patch


    Requirements :-


    a) framework.jar & services.jar of your ROM.
    b) Apktool to decompile & recompile jar files.
    c) Notepad++ to edite smali files.
    d) 7zip to add modded .dex files into original .jar files.


    Step 1:- Giving write permission to External SD card.
    a) Decompile services.jar with APKTool. Go to com/android/server/pm/ directory.
    b) Open PackageManagerService.smali with Notepad++ & find the below method.

    Code:
    .method private grantPermissionsLPw(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;)V
    c) Go to end of this method & add below Red color marked lines of code accordingly in their corresponding place.

    Code:
    .method private grantPermissionsLPw(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;)V
        ...........
        ....
        
        const-wide/32 v24, 0x40000
    
        invoke-static/range {v24 .. v25}, Landroid/os/Trace;->traceEnd(J)V
    
       [COLOR=Red]move-object/from16 v2, p0
    
        move-object/from16 v3, p1
    
        invoke-direct {v2, v3}, Lcom/android/server/pm/PackageManagerService;->allowSDWrite(Landroid/content/pm/PackageParser$Package;)V[/COLOR]
    
        return-void
    
        :pswitch_data_4cc
        ....
        ...
    .end method
    
    [COLOR=Red].method private allowSDWrite(Landroid/content/pm/PackageParser$Package;)V
        .registers 8
    
        move-object/from16 v0, p1
    
        iget-object v0, v0, Landroid/content/pm/PackageParser$Package;->mExtras:Ljava/lang/Object;
    
        move-object/from16 v1, v0
    
        check-cast v1, Lcom/android/server/pm/PackageSetting;
    
        if-nez v1, :cond_b
    
        return-void
    
        :cond_b
        invoke-virtual {v1}, Lcom/android/server/pm/PackageSetting;->getPermissionsState()Lcom/android/server/pm/PermissionsState;
    
        move-result-object v1
    
        move-object/from16 v2, v1
    
        move-object/from16 v0, p0
    
        iget-object v0, v0, Lcom/android/server/pm/PackageManagerService;->mSettings:Lcom/android/server/pm/Settings;
    
        move-object/from16 v1, v0
    
        move-object/from16 v0, v1
    
        iget-object v0, v0, Lcom/android/server/pm/Settings;->mPermissions:Landroid/util/ArrayMap;
    
        move-object/from16 v1, v0
    
        move-object/from16 v0, v1
    
        const-string/jumbo v1, "android.permission.WRITE_MEDIA_STORAGE"
    
        invoke-virtual {v2, v1}, Lcom/android/server/pm/PermissionsState;->hasInstallPermission(Ljava/lang/String;)Z
    
        move-result v3
    
        if-eqz v3, :cond_29
    
        return-void
    
        :cond_29
        invoke-virtual {v0, v1}, Landroid/util/ArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
    
        move-result-object v4
    
        check-cast v4, Lcom/android/server/pm/BasePermission;
    
        if-nez v4, :cond_32
    
        return-void
    
        :cond_32
        invoke-virtual {v2, v4}, Lcom/android/server/pm/PermissionsState;->grantInstallPermission(Lcom/android/server/pm/BasePermission;)I
    
        move-result v5
    
        return-void
    .end method[/COLOR]
    
    .method private grantRequestedRuntimePermissions(Landroid/content/pm/PackageParser$Package;[I[Ljava/lang/String;)V
        .......
        ....
        ....
        ..
    .end method
    d) Recompile services.jar. Open original services.jar & modded services.jar with 7zip in side-by-side window. Drag N Drop classes.dex file from modded services.jar to original services.jar window. Now keep the services.jar in a safe place.

    Step 2:- Switch SD Path.
    a) Decompile framework.jar with Apktool. Go to android/os/ directory.
    b) Open Environment$UserEnvironment.smali with Notepad++ & find the below method.

    Code:
    .method public getExternalDirs()[Ljava/io/File;
    c) Add Red color marked lines of code accordingly in their corresponding place.

    Code:
    .method public getExternalDirs()[Ljava/io/File;
        .registers 6
    
        iget v3, p0, Landroid/os/Environment$UserEnvironment;->mUserId:I
    
        const/16 v4, 0x100
    
        invoke-static {v3, v4}, Landroid/os/storage/StorageManager;->getVolumeList(II)[Landroid/os/storage/StorageVolume;
    
        move-result-object v2
    
        array-length v3, v2
    
        new-array v0, v3, [Ljava/io/File;
    
        const/4 v1, 0x0
    
        :goto_c
        array-length v3, v2
    
        if-ge v1, v3, :cond_1a
    
        aget-object v3, v2, v1
    
        invoke-virtual {v3}, Landroid/os/storage/StorageVolume;->getPathFile()Ljava/io/File;
    
        move-result-object v3
    
        aput-object v3, v0, v1
    
        add-int/lit8 v1, v1, 0x1
    
        goto :goto_c
    
        :cond_1a
      [COLOR=Red]  invoke-virtual {p0, v0}, Landroid/os/Environment$UserEnvironment;->getExternalSD([Ljava/io/File;)[Ljava/io/File;
    
        move-result-object v0[/COLOR]
    
        return-object v0
    .end method
    
    [COLOR=Red].method public getExternalSD([Ljava/io/File;)[Ljava/io/File;
        .registers 16
    
        move-object v0, p0
    
        move-object v1, p1
    
        new-instance v8, Ljava/util/ArrayList;
    
        move-object v13, v8
    
        move-object v8, v13
    
        move-object v9, v13
    
        invoke-direct {v9}, Ljava/util/ArrayList;-><init>()V
    
        move-object v3, v8
    
        :try_start_b
        new-instance v8, Ljava/io/BufferedReader;
    
        move-object v13, v8
    
        move-object v8, v13
    
        move-object v9, v13
    
        new-instance v10, Ljava/io/FileReader;
    
        move-object v13, v10
    
        move-object v10, v13
    
        move-object v11, v13
    
        const-string v12, "data/SDPath"
    
        invoke-direct {v11, v12}, Ljava/io/FileReader;-><init>(Ljava/lang/String;)V
    
        invoke-direct {v9, v10}, Ljava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
    
        move-object v4, v8
    
        :goto_1e
        move-object v8, v4
    
        invoke-virtual {v8}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;
        :try_end_22
        .catch Ljava/lang/Exception; {:try_start_b .. :try_end_22} :catch_76
    
        move-result-object v8
    
        move-object v13, v8
    
        move-object v8, v13
    
        move-object v9, v13
    
        move-object v5, v9
    
        if-nez v8, :cond_58
    
        move-object v8, v3
    
        invoke-interface {v8}, Ljava/util/List;->isEmpty()Z
    
        move-result v8
    
        if-nez v8, :cond_81
    
        move-object v8, v3
    
        const-string v9, "ext_SD=1"
    
        invoke-interface {v8, v9}, Ljava/util/List;->contains(Ljava/lang/Object;)Z
    
        move-result v8
    
        if-eqz v8, :cond_7e
    
        move-object v8, v1
    
        if-eqz v8, :cond_7b
    
        move-object v8, v1
    
        array-length v8, v8
    
        const/4 v9, 0x1
    
        if-le v8, v9, :cond_7b
    
        move-object v8, v1
    
        move-object v4, v8
    
        move-object v8, v4
    
        const/4 v9, 0x0
    
        aget-object v8, v8, v9
    
        move-object v5, v8
    
        move-object v8, v4
    
        const/4 v9, 0x0
    
        move-object v10, v4
    
        const/4 v11, 0x1
    
        aget-object v10, v10, v11
    
        aput-object v10, v8, v9
    
        move-object v8, v4
    
        const/4 v9, 0x1
    
        move-object v10, v5
    
        aput-object v10, v8, v9
    
        move-object v8, v4
    
        move-object v0, v8
    
        :goto_57
        return-object v0
    
        :cond_58
        move-object v8, v5
    
        :try_start_59
        invoke-virtual {v8}, Ljava/lang/String;->trim()Ljava/lang/String;
    
        move-result-object v8
    
        move-object v6, v8
    
        move-object v8, v6
    
        invoke-virtual {v8}, Ljava/lang/String;->isEmpty()Z
    
        move-result v8
    
        if-nez v8, :cond_6e
    
        move-object v8, v6
    
        const-string v9, "#"
    
        invoke-virtual {v8, v9}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
    
        move-result v8
    
        if-eqz v8, :cond_6f
    
        :cond_6e
        goto :goto_1e
    
        :cond_6f
        move-object v8, v3
    
        move-object v9, v6
    
        invoke-interface {v8, v9}, Ljava/util/List;->add(Ljava/lang/Object;)Z
        :try_end_74
        .catch Ljava/lang/Exception; {:try_start_59 .. :try_end_74} :catch_76
    
        move-result v8
    
        goto :goto_1e
    
        :catch_76
        move-exception v8
    
        move-object v4, v8
    
        move-object v8, v1
    
        move-object v0, v8
    
        goto :goto_57
    
        :cond_7b
        move-object v8, v1
    
        move-object v0, v8
    
        goto :goto_57
    
        :cond_7e
        move-object v8, v1
    
        move-object v0, v8
    
        goto :goto_57
    
        :cond_81
        move-object v8, v1
    
        move-object v0, v8
    
        goto :goto_57
    .end method[/COLOR]
    
    .method public getExternalStorageDirectory()Ljava/io/File;
        ......
        .....
    .end method
    d) Recompile framework.jar. Open original framework.jar & modded framework.jar with 7zip in side-by-side window. Drag N Drop classes.dex file from modded framework.jar to original framework.jar window. Now keep the framework.jar in a safe place.

    Flashing modified files.
    Create a flashable zip with moded framework.jar & services.jar. If you are using Redmi Note 4G. Then download attached zip file from attachment, open with 7zip, Add both jar file into "system/framework/". Then flash with custom recovery, wipe dalvik-cache & reboot. It will take up to 5 min.

    Creating setting file.
    a) Create a new file in "/data" directory. Rename it to "SDPath".
    b) Then open the file "SDPath" with text editor. Then add the following line & save.
    Code:
    ext_SD=1
    If you want to switch back the SD Path to default, just change the value from 1 to 0.

    Enjoy.....


    16
    Hi guys,
    I have developed an android application to patch framework.jar & services.jar automatically. The application have attached in attachment.

    Instructions :-
    a) Download & install the AutoPatcher.apk from attachment.
    b) Copy /system/framwork/services.jar and /system/framework/framework.jar to External Storage.
    c) Open the application & select services.jar or framwork.jar to patch by clicking on "Select File" button.
    d) Select a patching option from patching options list.
    e) Click the "Patch" button to patch the jar file.
    f) Create flashable zip with patched file/files & flash the zip from recovery.

    Thanks..

    EDIT: Attachment updated (Installation issue fixed).
    EDIT: Attachment updated (Bug fixed).
    a) Fixed issue with Jar selection.​
    b) Fixed issues with patching framework.jar.​
    c) Fixed issue: Can't boot after flashing the patched files.​

    EDIT: Attachment updated (Removed unnecessary files from apk package)
    EDIT: Attachment updated (Improved patched Jar compression process)
    EDIT: Attachment updated (Code cleanup & small bug fixes)
    6
    I just tried this on Resurrection Remix 5.8.4 where the original services.jar was 6.93 MiB and the patched services.jar is 3.09 MiB.

    Why is the patched file size less than half of the original file size?

    Sent from my SM-N910F using XDA Labs

    From what I saw the original files although they are zipped does not contain any compression, while the patched has compression around 50%. I wonder if this can affect performance in some way
    Patched jar compression process has been improved in new build. Now, AutoPatcher will try to detect compression method of original jar, then patched jar will be repacked in same way. Download the latest build from here https://xdaforums.com/attachment.php?attachmentid=4283664&d=1506406860
    5
    Tested second version. Can't select any jar, app doesn't ask for any permission. LOS 14.1, Sony Z3compact.
    Problem fixed. Try the new build...Thanks
    https://xdaforums.com/attachment.php?attachmentid=4280003&d=1506094438
    5
    T
    TheNatureOne
    I updated my fork repository of tingle with the new Android 6.x patch mentioned by kishorerprem:
    https://github.com/Catfriend1/tingle

    [Update] It worked on the Android 6.x device as good as it did on the Android 7.x device. *thumbs up*