s3rrallonga / s3rrallonga.github.io

TsunamiD
54 stars 57 forks source link

Aplicació es penja acceding a escanneig QR #12

Open nomdusuarifals opened 4 years ago

nomdusuarifals commented 4 years ago

Hola!

En un Samsung I8190 Galaxy S III mini amb Android Nougat 7.1.2 (un mòbil certament vell i atrotinat), totes les aplicacions que he provat funcionen bé, però la del tsunami em dóna problemes al moment crucial de llegir QR. Només de pitjar el botó, l'aplicació es congela.

Entenc que arreglar aquest problema potser no és prioritari, tenint en compte que la gent gasta aparells més moderns, però per si de cas rebeu algun altre informe d'error similar, us deixo una mica més d'informació.

Mirant el log de sistema, entenc que hi ha una reserva de memòria d'un buffer gràfic que falla just quan pitjo el botó i abans que s'obri la càmera. Les línies rellevants són aquestes:

10-16 19:18:14.435 2598 2635 I DisplayManagerService: Display device added: DisplayDeviceInfo{"flutter-vd": uniqueId="virtual:org.tsunami.app,10066,flutter-vd,0", 480 x 680, modeId 2, defaultModeId 2, supportedModes [{id=2, width=480, height=680, fps=60.0}], colorMode 0, supportedColorModes [0], HdrCapabilities null, density 240, 240.0 x 240.0 dpi, appVsyncOff 0, presDeadline 16666666, touch NONE, rotation 0, type VIRTUAL, state ON, owner org.tsunami.app (uid 10066), FLAG_PRIVATE, FLAG_NEVER_BLANK, FLAG_OWN_CONTENT_ONLY}

10-16 19:18:14.453 1819 1819 E gralloc : gralloc_alloc: gralloc_alloc_framebuffer (google) failed, Out of memory

10-16 19:18:14.453 1819 1819 E FramebufferNativeWindow: fb buffer 0 allocation failed w=480, h=800, err=Out of memory

És estrany que la reserva de memòria sigui denegada amb un "Out of memory". Creieu que podríeu treure una versió de l'aplicació que forci una resolució més baixa per la previsualització de la càmera?

retroixer commented 4 years ago

Hola @nomdusuarifals , no formo part del projecte, però intento donar un cop de mà. Segons la wikipèdia, el mòbil que fas servir té 512 MB o 1 GB de RAM.

És possible que per algun motiu l'aplicació no en tingui prou. Si no poden fer el que proposes fer fer que consumeixi menys, estaria bé que com a mínim @s3rrallonga anunciessin les especificacions mínimes que necessita o amb les mínimes que s'ha comprovat que funciona.

nomdusuarifals commented 4 years ago

Al moment d'intentar obrir la captura de QR el mòbil té 400 MiB lliures, o sigui que sospito que el "Out of memory" deu ser de memòria de GPU i no pas de sistema. De tota manera, trobo molt bona idea publicitar uns requeriments mínims (versió d'android, RAM, mida de la pantalla...).

joanotpetitot commented 4 years ago

Per el trace que has compartit te pinta que esta reservant memoria de la GPU amb gralloc per processar la imatge, i segurament aquest teléfon en te més aviat molt poca, aixi que es queda sense i peta:

: gralloc_alloc: gralloc_alloc_framebuffer (google) failed,

Segons el trace sembla que hi ha aquests modes disponibles: supportedModes [{id=2, width=480, height=680, fps=60.0}], colorMode 0, supportedColorModes [0], HdrCapabilities null, density 240, 240.0 x 240.0 dpi,

Sense comprobar les caracteristiques dels codis escanejats jo diria que no deu ser suficient per acabar la operació i et dona un OOM.

Si fos un error molt comú és una cosa que té possible solució en el codi, però suposo que cal veure si és un error molt comú com per dedicar-hi el temps que requeriria. Aviam que en pensen els responsables de la app.

IsmaelMartinez commented 4 years ago

As probat de installar un altre applicacio per lleguir el codi QR? En altres ocassions he tingut problemas amb la camera quan utilitzant lineage i altres... suspito que tu estaras fent el mateix amb aquest mobil (sent del 2012...)

nomdusuarifals commented 4 years ago

Efectivament, faig servir lineageOS (però he provat també ResurectionRemix i Carbon, totes descarregades de NovaFusion). He descarregat aquesta app i funciona sense problemes.

M'he estat mirant el codi descompilat de l'aplicació i veig que fa servir aquest codi per llegir els paràmetres de la càmera i configurar la vista prèvia. Crec que el meu problema rau a l'elecció de resolució de PreviewScalingStrategy, però com que no tinc un bon entorn de desenvolupament per android ni l'experiència adequada ja no vull furgar més.

Si que hi ha, però, un canvi d'un únic caràcter del projecte original que crec que podria arreglar l'aplicació en el meu cas particular. Si pogués forçar l'aplicació a emprar la càmera frontal, que té una resolució de 640x480, la reserva de memòria de la vista prèvia seria permesa. Això es pot aconseguir a sources\com\google\zxing\client\android\camera\open\OpenCameraInterface.java, canviant if (cameraInfo.facing == 0) per if (cameraInfo.facing == 1) en aquest mètode:

public static int getCameraId(int i) {
    int numberOfCameras = Camera.getNumberOfCameras();
    if (numberOfCameras == 0) {
        Log.w(TAG, "No cameras!");
        return -1;
    }
    boolean z = i >= 0;
    if (!z) {
        i = 0;
        while (i < numberOfCameras) {
            CameraInfo cameraInfo = new CameraInfo();
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == 0) {
                break;
            }
            i++;
        }
    }
    if (i < numberOfCameras) {
        return i;
    }
    if (z) {
        return -1;
    }
    return 0;
}

Evidentment no espero que els desenvolupadors em facin un release només per mi. Només ho comento perquè porto massa estona arrebossant-me en el projecte i crec que seria un hack curiós.

Salut i que vagi bé la vaga!

davidfranquet commented 4 years ago

Efectivament, faig servir lineageOS (però he provat també ResurectionRemix i Carbon, totes descarregades de NovaFusion). He descarregat aquesta app i funciona sense problemes.

M'he estat mirant el codi descompilat de l'aplicació i veig que fa servir aquest codi per llegir els paràmetres de la càmera i configurar la vista prèvia. Crec que el meu problema rau a l'elecció de resolució de PreviewScalingStrategy, però com que no tinc un bon entorn de desenvolupament per android ni l'experiència adequada ja no vull furgar més.

Si que hi ha, però, un canvi d'un únic caràcter del projecte original que crec que podria arreglar l'aplicació en el meu cas particular. Si pogués forçar l'aplicació a emprar la càmera frontal, que té una resolució de 640x480, la reserva de memòria de la vista prèvia seria permesa. Això es pot aconseguir a sources\com\google\zxing\client\android\camera\open\OpenCameraInterface.java, canviant if (cameraInfo.facing == 0) per if (cameraInfo.facing == 1) en aquest mètode:

public static int getCameraId(int i) {
    int numberOfCameras = Camera.getNumberOfCameras();
    if (numberOfCameras == 0) {
        Log.w(TAG, "No cameras!");
        return -1;
    }
    boolean z = i >= 0;
    if (!z) {
        i = 0;
        while (i < numberOfCameras) {
            CameraInfo cameraInfo = new CameraInfo();
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == 0) {
                break;
            }
            i++;
        }
    }
    if (i < numberOfCameras) {
        return i;
    }
    if (z) {
        return -1;
    }
    return 0;
}

Evidentment no espero que els desenvolupadors em facin un release només per mi. Només ho comento perquè porto massa estona arrebossant-me en el projecte i crec que seria un hack curiós.

Salut i que vagi bé la vaga!

Pensa que s’hauria de modificar la llibreria i integrarla amb Flutter, ja que el codi base de l’app esta fet amb Flutter. Si fas reverse engineering amb l’apk, veuras que codi d’Android hi ha poc.

nomdusuarifals commented 4 years ago

Tenint en compte que d'altra gent ha reportat problemes durant la captura del QR (report #15 i comentaris a twitter), se m'acut que una solució de baixa tecnologia seria la possibilitat d'entrar el contingut del codi QR mitjançant una caixa de text. Això permetria l'entrada manual caràcter a caràcter, però també llegir el codi des d'una altra app i empegar-ne el contingut tot de cop.

Salut!

sometent commented 4 years ago

@nomdusuarifals , vaig provar d'escanejar un QR d'aquests amb un lector genèric i el contingut conté caràcters que no es poden entrar per teclat. A banda d'això, recordo que hi havia emmagatzemats més de 200 caràcters, amb la qual cosa introduir-ho a mà pot ser engorrós. L'escaneig ha de funcionar bé; no entenc la dificultat que té l'app per fer-ho quan hi ha d'altres que només passar la càmera per sobre i sense deixar el mòbil quiet, te l'escanegen en mil·lisegons.