2013-06-25 23 views
5

Cihazım, Jelly Bean 4.2 çalıştıran Nexus 4. Ekranı kaydetmeye ve göndermeye çalışıyorum. İnternetteki çoğu kod, oku/dev/graphics/fb0 ile kapar. Bazı cihazlarda ve eski sistemlerde iyi çalışır. Ama cihazımda denediğimde, başarısız oluyor. Sadece siyah ekrana ve ham verilere "0" verir. Kök iznini almak için "adb root" çalıştırdım, "chmod 777 fb0", "cat fb0>/sdcard/fb0" denedim. Ayrıca verileri almak için "mmap" ve "memcpy" gibi kodları denedim. Ama hepsi başarısız. İnternette araştırdım ve çözüm yok gibi görünüyor. Ve bazı iplikler, çekirdeğin fb0 okumayı yasaklayabileceğini söyledi. Bunun hakkında fikri olan var mı?Android fb0 okundu her zaman bana siyah ekran verin

+1

, karetamponu muhtemelen (bütünüyle en azından) sadece trivially erişilebilir değil için ana CPU çoğu zaman. ADBD'nin uzun bir süre önce gerçekleştirdiği uygulamalarda, çerçevenin sahibini yakalamanın gerçek işini yapmak için screencap gibi bir şey denilen harici bir cihaz-benzersiz bir uygulama kullanıldı. Bunu kullanabilir, belge/kaynak bulmaya veya yürütülebilir dosyayı tersine çevirmeye çalışabilirsiniz. Normalde kaynakta "iyi şanslar" derdim, fakat bir Nexus cihazı için gerçekten mevcut olabilir (veya diğer kapalı bitlerle birlikte ikiliyi sağlayabilirler) –

+1

Cevabınız için teşekkürler. Aslında, Android'in orijinal kodları iki çalıştırılabilir ad içerir: screencap ve ekran görüntüsü. Ve kodlarında iki yol var. Biri fb0 okuyor, diğeri ise Android yerel kütüphanesi tarafından sağlanan glPixel() çağrılıyor. İkincisi oldukça yavaş. Aslında ikinci yöntemle bir tane gerçekleştirdim, ancak fps ideal değil. Ben de geri dönüp ilk yoldan yapmaya çalışıyorum. Projemde herhangi bir kısıtlama yoktur. Bunu uygulamak için çekirdeği bile kesebilirim. Haftalarca sorunla takıldım. Yardıma ihtiyacım var. – user1659072

+0

İhtiyacınız olan şey, ne yazık ki, genellikle üreticiler tarafından piyasaya sürülen, düşük seviyeli GPU programlama bilgisidir. Basit fb'nin zor, hatta güvenlik için okunmasından vazgeçtiğine inanmıyorum; Bunu yaptıklarını çünkü donanım artık herşeyi bitişik bir tampon olarak kolayca (veya en azından portatif olarak) açığa çıkarmadı.Piksel yaklaşımla piksel daha verimlidir, ancak belirli donanıma yine eşsiz - Birazdan tür bazı düşük seviyesi kodu ile etkileşim parçalar halinde gerçek kareyazmaç okumak bu değişiklikten sonra bir başka uygulanması yoluyla takip ettik. –

cevap

5

Donanım ilerledikçe, ekran içeriğiyle birlikte gerçek bir kare kıskacı bulma olasılığınız azalır.

Açıklamalarda belirtildiği gibi, adb, yüzey aktifleştirici ile Binder çağrısı üzerinden temas eden "screencap" komutunu kullanır ve bu başarısız olursa /dev/graphcs/fb0 geri düşebilir. İkinci yol şimdi nadiren kullanılmaktadır. Gerçekten bu nasıl çalıştığını içine kazmak istiyorsanız

, sen SurfaceFlinger kompozisyonu, özellikle hwcomposer HAL nasıl yaptığını incelemek gerekir. Donanım oluşturucu, çoklu gralloc yüzeyleri alır ve bunları tarama sırasında bir araya getirir. Bu, cihazdan cihaza nasıl değişiyor? hwcomposer uygulaması genellikle grafik yongası üreticisi tarafından yapılır. "Son uygulamalar" özelliği için küçük oluşturmak için uygulama çerçevesi tarafından kullanılan

ekran görüntüsü nesil, aynı kompozisyon HWC ancak münhasıran gles ile yaptığı adımları uygular. Android 4.2'den itibaren, donanım besteci bir arabelleğe birleştirilemiyor. Bazen, donanım besteci "punts", ör. Çünkü, donanımın işlem yapabileceğinden daha fazla katman var. Bu durumda, yüzey aktifleştirici, GLES bileşimine döner ve tam görüntüye sahip numaralı bir tampon olacaktır; /dev/graphics/fb0 açılarak bulunup bulunmayacağı farklı bir konudur.

Bazı başlangıç ​​noktaları:

İlgili konular