2012-03-19 12 views
33

Desidero modificare il file init.rc di un pad Android. Ma dopo averlo cambiato e riavviato il sistema, viene restituito l'originale init.rc.Apportare modifiche permanenti a init.rc

Come posso apportare la modifica allo init.rc persistentemente senza ricostruire il sistema (poiché non ho il codice sorgente del sistema)? O c'è un modo per aggirare?

+0

come hai fatto le modifiche a init.rc ?? tirando il file con ADB ?? e poi spingere al dispositivo ?? –

+0

Sì, con adb push e pull – user1278251

+0

il dispositivo ha il permesso di root ?? –

risposta

-3

È necessario modificare/modificare init.rc prima di creare il file system del pad Android. Questo è il modo preferito e funziona sempre.

+1

Non ho il codice sorgente del sistema del pad, come posso costruirlo? C'è un modo per risolvere questo problema senza ricostruire il sistema? – user1278251

10

Un numero di dispositivi Android include il codice per impedire le modifiche di root ai file di sistema. Il modo in cui questo viene fatto è utilizzando la partizione di ripristino. Al riavvio, ripristinano sostanzialmente la partizione di sistema utilizzando l'immagine di ripristino. Se il tuo sistema lo sta facendo, non puoi apportare modifiche persistenti: il meglio che potresti fare sarebbe collegare qualcosa da eseguire dopo il riavvio per riapplicare la tua modifica. In CyanogenMod avevano gli hook in init.rc per eseguire gli script sdcard se trovati. Forse puoi creare un'app o un widget per poi avviare uno script per rendere le mod richieste usando uno script setuid root dalla partizione dati. Senza costruire la tua ROM, sei abbastanza limitato in quest'area.

Forse è possibile recuperare l'immagine di ripristino e provare a disimballarla, apportare le modifiche e ripetere l'operazione e renderla lampeggiante. Ma assicurati di poter recuperare con fastboot prima di provare questo.

+0

Grazie per le tue informazioni. Sembra che il metodo di recupero della partizione sia utilizzato da questi due pad. Il metodo hook è ciò che voglio fare con init.rc, con cui posso fare un po 'di controllo durante l'avvio del sistema. Ma il recupero impedisce che accada. Se esiste l'immagine di recupero, dov'è? Come posso trovarlo? – user1278251

+0

Se è possibile eseguire il backup utilizzando nandroid è un modo per ottenere l'immagine di ripristino. Altrimenti puoi usare dd e copiare la partizione di ripristino in un file. Una volta che hai un'immagine della partizione di ripristino dovresti essere in grado di usare unyaffs per decomprimerlo. Dovresti esaminare in che modo le origini Android creano questi elementi per scoprire come rifare uno da un albero di file. – patthoyts

+0

provato con il suggerimento da: http: //android-dls.com/wiki/index.php? Title = HOWTO: _Unpack% 2C_Edit% 2C_and_Re-Pack_Boot_Images. Ma il recupero img tramite "cat/dev/mtd/mtd1> mtd1.img" non è riuscito ad essere aperto da unyaff con errore "file immagine danneggiato". Qualche suggerimento? Grazie! – user1278251

9

Quando un androide sistema si avvia, uboot decomprime uno speciale file compresso di file nella partizione di avvio chiamato 'uRamdisk' nella RAM e definisce quei file che comprendono la directory principale del sistema. uRamdisk normalmente contiene un sacco di directory (sistema, dati, file multimediali, ecc.) che fungono da punti di montaggio per le partizioni che contengono i file in esse contenuti, ma ha anche alcuni file di base vitali per il sistema, inclusi init binary e startup script come init.rc.

quando si modifica init.rc, in realtà si è appena modificata la copia decompressa di init.rc che si trova nella RAM. Per cambiarlo davvero, devi copiare il tuo uRamdisk, estrarlo, modificare init.rc da lì, riconfezionare uRamdisk e quindi sostituire quello nuovo con quello vecchio in/boot.

Prova a cercare gli script 'xuramdisk' e 'mkuramdisk', questi rendono il processo molto semplice.

13

scompattare l'uramdisk utilizzando seguente comando nel PC host (Linux)

mkdir /tmp/initrc cd /tmp/initrd 
sudo mount /dev/sdb1 /mnt   

sdb1 è partizione dove risiede uramdisk/uInitrd.

dd bs=1 skip=64 if=/mnt/uInitrd of=initrd.gz 
gunzip initrd.gz 

A questo punto l'esecuzione del comando file initrd dovrebbe mostrare:

mkdir fs 
cd fs 
cpio -id < ../initrd 

apportare modifiche al init.rc

pacchetto uramdisk utilizzando i seguenti comandi:

find ./ | cpio -H newc -o > ../newinitrd 
cd .. 
gzip newinitrd 
mkimage -A arm -O linux -C gzip -T ramdisk -n "My Android Ramdisk Image" -d newinitrd.gz uInitrd-new 
+1

Come fai a sapere che/dev/sdb1 è dove uramdisk/uInitrd? Quando allego il telefono, posso vedere solo la scheda sdcard sotto/dev/sdb. Come posso cercare uramdisk? – melopsitaco

+0

/dev/sdb1 non esiste sul mio dispositivo. Potrebbe essere necessario discutere come determinare il dispositivo di blocco corretto in cui risiede l'immagine di avvio. –

+1

Varia in base al dispositivo Android. Se il tuo dispositivo è rootato, prova ad eseguire "adb shell mount" per un elenco di file system montati. Questo ti darà alcuni buoni suggerimenti su dove guardare. –

4

non so se stai ancora provando a farlo ma senza conoscerti r dispositivo esatto nessuno può darti una risposta esatta.

Prova a fare una dd image di tutte le partizioni interne e utilizzare alcuni script come quelli inclusi con cucina Android sul forum di xda. Le partizioni di ripristino e avvio avranno entrambe un disco ram, ma le probabilità sono che si desideri modificare init.rc nel ripristino boot.img, a meno che non si desidera solo le modifiche presenti in modalità di ripristino.

La cosa di unyaffs non si applica a tutti i dispositivi e la maggior parte dei dispositivi ha diversi layout di partizione quindi è necessario capire quale è l'avvio e il tipo di fs che è. Forse se dai le specifiche del tuo dispositivo puoi ottenere una risposta migliore.

4

La partizione di root (dove /init.rc vive) è un ramdisk che viene decompresso da un file initrd e montato ogni volta che si avvia il dispositivo. Tutte le modifiche apportate sono solo su ramdisk e andranno perse al successivo riavvio.

Se è possibile ottenere il file initrd, è possibile montarlo sul sistema host Linux, modificare i file lì, smontarlo e scriverlo sul proprio Android.

Il file initrd esiste nella propria partizione sul dispositivo. Se riesci a capire quale partizione è, puoi caricarla dal dispositivo sul tuo host, montarla, modificarla e riscriverla sul dispositivo. Questo è ciò di cui tripler stava parlando sopra.

In generale, la modifica di boot.img è qualcosa che solo gli sviluppatori di sistema fanno. Se stai costruendo l'intero sistema Android, avrai accesso al codice sorgente necessario. Il mio flusso di lavoro per questo si presenta così:

# Modify init.rc 
m -j8 bootimage_signed 
adb reboot bootloader 
fastboot flash boot $OUT/boot.img 
fastboot reboot 
+0

Ho provato a creare il collegamento statico per init.rc in sdcard (ln-s /sdcard/init.rc init.rc), in modo che la modifica a init.rc sia più semplice, ma non ha funzionato. qualche idea ? – ransh

+0

Per "collegamento statico" intendevi l'hard link? Non puoi farlo attraverso i filesystem, quindi devi essere collegato a un altro file nel tuo ramdisk. Di nuovo, questo andrebbe perso al successivo riavvio. Se hai creato un collegamento simbolico, presumo che si trattasse di un altro file system, che potrebbe non essere stato ancora montato quando era necessario. Ad ogni modo, non penso che funzionerà. In un modo o nell'altro, è necessario modificare l'immagine init.rd. –

+0

@Edward non ha accesso al codice sorgente. –

0

Si prega di notare che potrebbe essere più facile per voi da usare un app come Scripter per eseguire uno script all'avvio del sistema di modificare questo file.

Prima di seguire @ istruzioni del triplicatore sopra avete bisogno di un file chiamato boot.img che può essere estratto da (eseguito sul dispositivo radicata Android, non testato, senza root):

dd if=/dev/block/platform/<someplatform>/by-name/boot of=/sdcard/boot.img 

quindi collegare l'Android al computer e copiare il file boot.img da lì.

Script:

http://linuxclues.blogspot.ca/2012/11/split-bootimg-python-android.html

Qui è una versione modificata, più facile vedere la versione delle istruzioni di triplicatore (ammesso boot.img è in tmp):

cd /tmp 
mkdir fs 
# Now use the linked script above to split the boot.img file into ramdisk.gz and kernel 
python split_boot_img.py -i boot.img -o parts 
cd fs 
gunzip -c ../parts/ramdisk.gz | cpio -id 
# make changes to init.rc 

A quel punto si dovrà ricostruire il boot.img nuovamente insieme prima del reflashing, che sarà specifico del dispositivo. Non posso aiutarti, mi dispiace!

Problemi correlati