Android: come modificare o fare il porting di un apk di una rom

Per modificare un apk Android occorre accedere al suo contenuto e per poterlo fare sono disponibili diversi software che semplificano l'utilizzo di Apktool:

e se è necessario editare i files smail contenuti all'interno del file odex allora è possibile usare i tools smali/backsmali.

Questi sono i comandi standard per effettuare smali/backsmali:

#decompile
java -jar baksmali.jar -o <deodexed_dir> <odex_file>
#compile
java -Xmx512M -jar smali.jar <deodexed_dir> -o <dex_file>

Qui vediamo alcuni esempi più particolari:

#the commands -b, -p, -m flags clean up the code
java -jar baksmali.jar -b -p -m -o <deodexed_dir> <odex_file>
#the -l changes the .registers to .locals
#the -b removes the smali debugging stuff that is not needed
#most custom rom builders know about this edits but this is for the average user that would like to make edits on their own and want to make edits to system/apps
java -Xmx1024M -jar baksmali.jar -l -b -o <deodexed_dir> <odex_file>
java -jar baksmali.jar -a 15 -x <odex_file> -d <framework_dir> -o <deodexed_dir>
java -Xmx512m -jar smali.jar -o <dex_file> <deodexed_dir>

Di seguito è mostrato come deodexare con smali/backsmali da computer un file odex di un file apk o jar per fare un porting, abbiamo ad esempio i files original_app.apk ed original_app.odex estratti da /system/app da un telefono del quale abbiamo anche la directory /system/framework:

java -jar baksmali.jar -a 15 -x original_app.odex -d copy_of_system_framework_dir -o original_app_deodexed_dir
java -Xmx512m -jar smali.jar -o classes.dex original_app_deodexed_dir

copiare il file classes.dex nel file patched_app.apk, che è una copia del file original_app.apk.

Per reodexare il file è possibile utilizzare da telefono il tool dexopt-wrapper con i seguenti comandi:

dexopt-wrapper /sdcard/tmp/patched_app.apk /sdcard/tmp/patched_app.odex
busybox dd if=/sdcard/tmp/original_app.odex of=/sdcard/patched_app.odex bs=1 count=20 skip=52 seek=52 conv=notrunc