2013-06-25 12 views
5

Il mio dispositivo è Nexus 4 con Jelly Bean 4.2. Sto provando a registrare lo schermo e inviarlo. La maggior parte dei codici su internet fa il cap di read/dev/graphics/fb0. Funziona bene su alcuni dispositivi e sui vecchi sistemi. Ma quando lo provo sul mio dispositivo, fallisce. Mi dà solo la schermata nera e tutto lo "0" nei dati grezzi. Ho eseguito "adb root" per ottenere il permesso di root, provato "chmod 777 fb0", "cat fb0>/sdcard/fb0". Inoltre ho provato codici come "mmap" e "memcpy" per ottenere i dati. Ma tutti falliscono. Ho cercato su internet e non sembra esserci soluzione. E alcuni thread hanno detto che il kernel potrebbe proibirti di leggere l'fb0. Qualcuno ha idea al riguardo?Android leggi fb0 sempre mi dia schermo nero

+1

Con le GPU più moderni, il framebuffer è probabilmente solo non banalmente accessibili (almeno non nella sua interezza) a la CPU principale il più delle volte. La maggior parte delle implementazioni di ADBD sono passate da molto tempo all'uso di un dispositivo esterno: un eseguibile unico chiamato qualcosa come screencap per fare il vero lavoro di catturare il framebuffer. Puoi usarlo, provare a trovare documentazione/fonte, o provare a decodificare l'eseguibile. Normalmente direi "buona fortuna" sulla fonte, ma per un dispositivo Nexus potrebbe essere effettivamente disponibile (o potrebbero semplicemente fornire il binario insieme agli altri bit chiusi) –

+1

Grazie per la risposta. In realtà, i codici originali di Android contengono due nomi eseguibili: screencap e screenshot. E ci sono due modi nei loro codici. Uno è leggendo l'fb0, un altro è chiamando glPixel() fornito dalla libreria nativa di Android. Il secondo è piuttosto lento. In realtà ne ho implementato uno con il secondo metodo, ma l'fps non è l'ideale. Quindi torno indietro e cerco di farlo nel primo modo. Non ci sono restrizioni nel mio progetto. Posso anche hackerare il kernel per implementarlo. Bloccato dal problema per settimane. Ho bisogno di aiuto. – user1659072

+0

Ciò di cui hai bisogno sono informazioni di programmazione di GPU di basso livello che, purtroppo, in genere non vengono rilasciate dai produttori. Non credo che abbiano rinunciato al semplice fb letto per essere difficile o addirittura per sicurezza; lo hanno fatto perché l'hardware non è più facilmente (o almeno portabile) esposto l'intera cosa come un buffer contiguo.Tracciai un'altra implementazione subito dopo questa modifica che legge il vero framebuffer in blocchi che interagiscono con un codice di basso livello - più efficiente dell'approccio pixel per pixel, ma ancora univoco per hardware specifico. –

risposta

5

Con l'avanzare dell'hardware, è sempre meno probabile trovare un framebuffer effettivo con il contenuto dello schermo.

Come indicato nei commenti, adb utilizza il comando "screencap", che contatta il surfaceflinger tramite una chiamata Binder, ricadendo su /dev/graphcs/fb0 in caso di esito negativo. Quest'ultimo percorso è usato raramente ora.

Se si vuole veramente indagare su come funziona, è necessario esaminare come il surfaceflinger compie la composizione, in particolare l'HAL di hwcomposer. Il compositore hardware prende più superfici gralloc e le compone durante la scansione. Come funziona differisce da dispositivo a dispositivo; l'implementazione di hwcomposer viene solitamente eseguita dal produttore del chip grafico.

Generazione di screenshot, utilizzata dal framework dell'app per generare le miniature per la funzione "app recenti", applica gli stessi passaggi di composizione che HWC fa ma esclusivamente con GLES. A partire da Android 4.2, il compositore hardware non è in grado di eseguire il composito in un buffer.

A volte il compositore hardware "punts", ad es. perché ci sono più livelli da comporre rispetto a quelli che l'hardware può gestire. In tal caso, il surfaceflinger ritorna alla composizione GLES, e ci sarà un buffer da qualche parte che ha l'immagine completa; se lo troverai o meno aprendo /dev/graphics/fb0 è un'altra questione.

alcuni punti di partenza:

Problemi correlati