Android: come modificare AndroidManifest.xml

Qualche volta per modificare un apk di sistema dobbiamo editare il suo AndroidManifest.xml ma non possiamo semplicemente modificarlo altrimenti corromperemo la firma e l'apk non sarà avviato all'avvio del sistema.

Potremmo disabilitare la verifica della firma nel services.jar oppure rifirmare ogni apk nella rom ma queste non sono le soluzioni più eleganti.

Dopo aver editato l'AndroidManifest.xml in un apk di sistema possiamo controllare la firma dell'apk modificato in .apk/META-INF/CERT.RSA e poi rifirmare ogni apk di sistema che ha lo stesso numero di serie nella firma.

Con questo comando avremo ogni informazione sul certificato:

keytool -printcert -v -file .apk/META-INF/CERT.RSA

e con questo comando avremo il Numero di serie:

keytool -printcert -v -file CERT.RSA|grep "Numero di serie"| cut -c 18-23

Possiamo rifirmare l'apk con signapk usando il proprio certificato, il certificato test o il certificato AOSP. Qui i certificati.

Questo è il comando per firmare l'apk con il certificato test:

java -Xmx512M -jar signapk.jar testkey.x509.pem testkey.pk8 .apk .apk.signed

e questo è il comando per firmare l'apk con il certificato AOSP:

java -Xmx512M -jar signapk.jar platform.x509.pem platform.pk8 .apk .apk.signed

Per automatizzare l'intero processo possiamo usare questi scripts:

#!/bin/bash

cd app

for filename in *.apk
do
	unzip -d $filename.extract $filename META-INF/CERT.RSA
	if [ -f $filename.extract/META-INF/CERT.RSA ]
	then
		mkdir `keytool -printcert -v -file $filename.extract/META-INF/CERT.RSA|grep "Numero di serie"| cut -c 18-23`
		mv $filename `keytool -printcert -v -file $filename.extract/META-INF/CERT.RSA|grep "Numero di serie"| cut -c 18-23`/$filename
		mv `echo $filename | sed 's/\(.*\.\)apk/\1odex/'` `keytool -printcert -v -file $filename.extract/META-INF/CERT.RSA|"Numero di serie"| cut -c 18-23`/`echo $filename | sed 's/\(.*\.\)apk/\1odex/'`
		rm -rf $filename.extract
	else
		mkdir none
		mv $filename none
		mv `echo $filename | sed 's/\(.*\.\)apk/\1odex/'` none
		rm -rf $filename.extract
	fi
done;

mkdir other
mv * other
mv other/1446 motorola
mv other/b399 platform
mv other/f2a7 shared
mv other/f2b9 media
mv other/936e test
#!/bin/bash

cd app

for filename in `find . -name '*.apk' -or -name '*.jar'`
do
	echo $filename
	java -Xmx512M -jar signapk.jar platform.x509.pem platform.pk8 $filename $filename.signed
	rm $filename
	mv $filename.signed $filename
done;