[GUIDE] Modifying apk/jar files on the Axon 7

bkores

Senior Member
Aug 12, 2016
813
614
0
Staten Island, NY
So I decided to write up a little guide on how to modify apk and jar files on the Axon 7 for those of you who do not know how and would like to make some modifications such as the ones in my guides.

Prerequisites

A Windows/Linux/Mac computer
A rooted device with TWRP Recovery
USB cable
ADB installed and USB debugging enabled
Java JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html
APKTool: https://ibotpeaches.github.io/Apktool/install/ (Follow all the instructions)
Baksmali: https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.2.0.jar
7-Zip or another archive manager

1. Install the frameworks to your computer

Open a command window in your working directory and connect your device to your computer with the USB-C cable.

Pull the framework files with

Code:
adb pull /system/framework/framework-res.apk
adb pull /system/framework/framework-zte-res.apk
Install them

Code:
apktool if framework-res.apk
apktool if framework-zte-res.apk
Depending on which ROM you are on you may need to install other frameworks. The above is for the stock ROM.

2. Decompile the apk/jar file.

Pull the apk/jar you want to decompile with

Code:
 adb pull path_to_apk_or_jar
Here are paths for some commonly modified apk/jars:

SystemUI: /system/priv-app/SystemUI_ZTE/SystemUI_ZTE.apk
Settings: /system/priv-app/Settings_ZTE/Settings_ZTE.apk
services.jar: /system/framework/services.jar

Decompile the apk with

Code:
 apktool d <apk/jar>
If you did everything correctly, a folder should now exist with the name of your apk/jar.

3. Decompile the .odex file

You can skip this step if your apk/jar does not have an .odex associated with it or you only need to modify res and not smali.

Pull the odex file

Code:
 adb pull path_to_odex
For example if you want to pull the odex file for SystemUI you would do

Code:
 adb pull /system/priv-app/SystemUI_ZTE/oat/arm64/SystemUI_ZTE.odex
Create a folder called "smali" in the directory of your decompiled apk/jar. Then go back to your working directory.

Pull all boot oat files from your device with

Code:
 adb pull /system/framework/arm64
Move all the oat files inside the arm64 folder on your PC to your working directory.

Using baksmali, decompile the odex file to smali

Code:
 java -jar baksmali.jar deodex -a <api> filename.odex
where api is 23 for Android 6.0, 24 for Android 7.0, and 25 for Android 7.1

A new folder should now be created called "out". Cut and paste the files and folders inside this folder into the "smali" folder you created earlier.

4. Make your modifications.


5. Recompile the apk/jar


From the working directory (not the directory of the decompiled apk/jar) Recompile the apk/jar with

Code:
 apktool b name_of_folder
where name_of_folder is the name of the directory of the decompiled apk/jar.

The complied apk/jar should now exist in the "dist" folder in the directory of the decompiled apk/jar.

6. Sign the apk.

Using 7-zip or another archive manager, copy the res folder, resources.arsc file, and the classes.dex file (if you modified smali in steps 3 and 4) from the NEW apk to the ORIGINAL apk.

7. Replace the apk/jar on your device.

Reboot your device into TWRP recovery with

Code:
 adb reboot recovery
For user apps: Make sure data is mounted in TWRP's mount menu. If you have encryption turned on you must enter your password otherwise data will not be mounted!

For system apps and framework files: Make sure system is mounted in TWRP's mount menu. Uncheck "Mount system read-only" if it is checked.

Push the ORIGINAL apk/jar to the correct directory on your device

Code:
 adb push <apk/jar> path_to_apk_or_jar
Set correct permissions on the apk/jar

Code:
 adb shell chmod 0644 path_to_apk_or_jar
If you did step 3, use TWRP's file manager in Advanced<File Manager to navigate to the apk/jar file's directory and delete the existing .oat or .odex file associated with it.

You did it :)
 
Last edited:

le_cactus

Senior Member
Nov 25, 2005
568
35
0
Amsterdam
No go

Hi,

Tried it with the SystemUI_ZTE.apk (and odex) from the 2017G B08 ROM. I ended up with a folder named SystemUI_ZTE. I created a smali folder in that folder and moved the android, com and cn folders (that I got using the "java -jar oat2dex.jar smali SystemUI_ZTE.odex" command) to that smali folder. But when I try the apktool b command I get the following error:

Code:
C:\Users\Blub\ZTE>apktool b SystemUI_ZTE
I: Using Apktool 2.3.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
SystemUI_ZTE\smali\android\support\v17\leanback\app\BackgroundManager.smali[102,4] iput-wide-volatile is an odexed instruction. You cannot reassemble a disassembled odex file unless it has been deodexed.
Exception in thread "main" brut.androlib.AndrolibException: Could not smali file: android/support/v17/leanback/app/BackgroundManager.smali
        at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:75)
        at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:59)
        at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:36)
        at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:412)
        at brut.androlib.Androlib.buildSources(Androlib.java:343)
        at brut.androlib.Androlib.build(Androlib.java:299)
        at brut.androlib.Androlib.build(Androlib.java:270)
        at brut.apktool.Main.cmdBuild(Main.java:224)
        at brut.apktool.Main.main(Main.java:75)
Any idea what I am doing wrong?

TIA,

Cheers,
/Cacti
 
Last edited:

bkores

Senior Member
Aug 12, 2016
813
614
0
Staten Island, NY
Hi,

Tried it with the SystemUI_ZTE.apk (and odex) from the 2017G B08 ROM. I ended up with a folder named SystemUI_ZTE. I created a smali folder in that folder and moved the android, com and cn folders (that I got using the "java -jar oat2dex.jar smali SystemUI_ZTE.odex" command) to that smali folder. But when I try the apktool b command I get the following error:



Any idea what I am doing wrong?

TIA,

Cheers,
/Cacti
I updated the OP with a different tool for the odex file. Try it now.
 

le_cactus

Senior Member
Nov 25, 2005
568
35
0
Amsterdam
Hi,

Thanks,but "java -jar baksmali-2.2.0.jar -a 25 -x SystemUI_ZTE.odex -d %CD%" gives me this error

Code:
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got -a
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
        at com.beust.jcommander.JCommander.parse(JCommander.java:304)
        at com.beust.jcommander.JCommander.parse(JCommander.java:287)
        at org.jf.baksmali.Main.main(Main.java:90)
Cheers,
/Cacti
 

le_cactus

Senior Member
Nov 25, 2005
568
35
0
Amsterdam
Hi,

The command "java -jar baksmali.jar deodex -a 25 SystemUI_ZTE.odex"gives me

Code:
Error occurred while loading class path files. Aborting.
org.jf.dexlib2.analysis.ClassPathResolver$ResolveException: Error while loading oat file boot.oat
        at org.jf.dexlib2.analysis.ClassPathResolver.loadEntry(ClassPathResolver.java:250)
        at org.jf.dexlib2.analysis.ClassPathResolver.loadLocalClassPathEntry(ClassPathResolver.java:179)
        at org.jf.dexlib2.analysis.ClassPathResolver.loadLocalOrDeviceBootClassPathEntry(ClassPathResolver.java:191)
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:120)
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:105)
        at org.jf.baksmali.AnalysisArguments.loadClassPathForDexFile(AnalysisArguments.java:129)
        at org.jf.baksmali.AnalysisArguments.loadClassPathForDexFile(AnalysisArguments.java:86)
        at org.jf.baksmali.DisassembleCommand.getOptions(DisassembleCommand.java:203)
        at org.jf.baksmali.DeodexCommand.getOptions(DeodexCommand.java:71)
        at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:177)
        at org.jf.baksmali.Main.main(Main.java:102)
Caused by: org.jf.dexlib2.analysis.ClassPathResolver$NotFoundException: Cannot find dependency boot-core-libart.oat in null
        at org.jf.dexlib2.analysis.ClassPathResolver.loadOatDependencies(ClassPathResolver.java:270)
        at org.jf.dexlib2.analysis.ClassPathResolver.loadEntry(ClassPathResolver.java:248)
        ... 10 more
Cheers,
/Cacti
 

le_cactus

Senior Member
Nov 25, 2005
568
35
0
Amsterdam
Muchas gracias

Hi,

Had to pull all the .oat files from the /system/framework/arm64/ folder, only then I didn't get an error any more using the command "java -jar baksmali.jar deodex -a 25 SystemUI_ZTE.odex". The "command "java -jar baksmali.jar -a 25 -x SystemUI_ZTE.odex -d %CD%" still gave an error, you might wanna change that in the OP.

Now apktool b SystemUI_ZTE didn't give me any errors anymore. Executed the other steps, and bingo! Everthing seems to work. And byy replacing the charging.ogg, my device charges silently.

Thanks from my wife as she now doesn't wake up when I go to bed (and connect the charger). Many thanks for your patience and your excelent guide! I guess I'll bemodding some more APK's now :)

Cheers,
/Cacti
 

bkores

Senior Member
Aug 12, 2016
813
614
0
Staten Island, NY
Hi,

Had to pull all the .oat files from the /system/framework/arm64/ folder, only then I didn't get an error any more using the command "java -jar baksmali.jar deodex -a 25 SystemUI_ZTE.odex". The "command "java -jar baksmali.jar -a 25 -x SystemUI_ZTE.odex -d %CD%" still gave an error, you might wanna change that in the OP.

Now apktool b SystemUI_ZTE didn't give me any errors anymore. Executed the other steps, and bingo! Everthing seems to work. And byy replacing the charging.ogg, my device charges silently.

Thanks from my wife as she now doesn't wake up when I go to bed (and connect the charger). Many thanks for your patience and your excelent guide! I guess I'll bemodding some more APK's now :)

Cheers,
/Cacti
Great! I'll add that to the OP! Thanks for helping me out!
 
Last edited:

raystef66

Recognized Developer / Recognized Contributor
Jul 2, 2013
2,050
4,975
203
Updated the OP with a new signing method that should fix boot hang issues with some apks (aka Settings_ZTE)
IMO it was just the same as your previous method (under 5.)was saying : move META-INF ( and manifest but not necessary imo) from original apk into the new apk (in dist folder).
Now you're saying : put res, resources and classes from new apk into new apk...that's just the same, no ? Only more files to move imo.

Since res, resources and classes are indeed changing by compile, wouldn't it be better by just saying : put META-INF from original apk into new apk, like you first wrote in OP ? :confused: Easier no ?

ALSO : under 6. you say : Open a command window in the "dist" folder and push the ORIGINAL apk/jar to the correct directory on your device
Shouldn't that be : push ORIGINAL (since you copied files under 5 from NEW(in "dist") to ORIGINAL(in working folder) ) FROM WORKING FOLDER ? Since there is no original apk in DIST folder, only our new apk. Imo you make things a bit confusing here, no ? :cyclops:
 
Last edited:

bkores

Senior Member
Aug 12, 2016
813
614
0
Staten Island, NY
IMO it was just the same as your previous method (under 5.)was saying : move META-INF ( and manifest but not necessary imo) from original apk into the new apk (in dist folder).
Now you're saying : put res, resources and classes from new apk into new apk...that's just the same, no ? Only more files to move imo.

Since res, resources and classes are indeed changing by compile, wouldn't it be better by just saying : put META-INF from original apk into new apk, like you first wrote in OP ? :confused: Easier no ?

ALSO : under 6. you say : Open a command window in the "dist" folder and push the ORIGINAL apk/jar to the correct directory on your device
Shouldn't that be : push ORIGINAL (since you copied files under 5 from NEW(in "dist") to ORIGINAL(in working folder) ) FROM WORKING FOLDER ? Since there is no original apk in DIST folder, only our new apk. Imo you make things a bit confusing here, no ? :cyclops:
Fixed!
 
  • Like
Reactions: raystef66

SkaboXD

Senior Member
Jan 18, 2017
879
232
53
Ganja
i have some problem with framework.jar, it doesn't have classes.dex in jar but it also doesn't have odex file in /system/framework/oat/arm64 (also arm). Because of it i can't decompile it using smali/baksmali tool. I want to make more volume steps mode like VolumeSteps+ but without Xposed. Hope someone can help.