sábado, 11 de febrero de 2012

Conociendo el Hardware de Android




Intro.
En una entrada anterior habiamos hablado en parte de las ventajas de un smartphone y entre una de las cosas que nos llama la atencion fue el Hardware, ya que normalmente nos hacemos o hacemos la pregunta de sus especificaciones como: su memoria, la ram, la duración de la batería, la pantalla, entre otras caracteristicas.

Para saber esto de parte de un desarrollador, sin contar el buscar la informacion por internet u otro medio, podriamos importar librerias o buscar directorios que nos permitieran saber sus especificaciones.

Desarrollo:
Buscando en internet de como hacer dichas llamadas a las librerias de android o directorios y con esto sacar la infromacion que se busca, nos encontramos con varias llamadas utiles, pero las que manejare seran, la del cpu, memoria interna y lde la ram. Para el cpu y la ram, nos encontramos con los siguientes directorios:

CPU
proc/cpuinfo

Ram
system/bin/cat
proc/meminfo

Memoria Interna
*libreria Enviroment

Para algunos, estos directorios se les haran algo familiares, ya que para varios que han trabajado en el entorno de linux los encontraremos como directorios donde espcifican o nos pueden dar informacion del cpu o de la memoria ram. A comparacion de la memoria interna, se hacen llamadas al sistema con la ayuda de la libreria de Enviroment, proporcionandonos con ciertas funciones como si contamos con alguna memoria extraible, su capacidad, etc...

Explicando:
CPU
private String getInfo(){
     String cpu = "/proc/cpuinfo"; //Cargamos el directorio
     StringBuffer sb = new StringBuffer(); //Creamos el constructor de Stringbuffer para meter cadenas
     sb.append("CPU: \n"); //Cadena
     if (new File(cpu).exists()) { //Verificamos si existe el directorio
         try {
          BufferedReader br = new BufferedReader(new FileReader(new File(cpu))); //Avimos directorio
          String aLine; //Creamos nueva variable
    while ((aLine = br.readLine()) != null) { //Miestras en Buffer haya la asignara a aLine
     sb.append("\t"+ aLine + "\n"); //Pasamos el contenido de aLinea a sb
    }
    if (br != null) {
        br.close();  //Cerramos el buffer br
       }
   } catch (IOException e) { //Manejo de excepcion
    e.printStackTrace();
   } 
        }
     return sb.toString();  //Como esto es una funcion, regresamos db
    }


Memoria Ram
private String RamInfo(){
     String dir = "/system/bin/cat"; //directorio
     String mem = "/proc/meminfo" ;  //directorio
     StringBuffer sab = new StringBuffer(); //Creamos el constructor de Stringbuffer para meter cadenas
     sab.append("RAM \n");
     if (new File(dir).exists()) { //Verificamos si existe el directorio
         try {
          BufferedReader bas = new BufferedReader(new FileReader(new File(mem))); //Abrimos el directorio
          String aLine;
    while ((aLine = bas.readLine()) != null) { //Miestras en Buffer haya la asignara a aLine
     sab.append("\t"+ aLine + "\n"); //Pasamos el contenido de aLinea a sab
    }
    if (bas != null) { 
        bas.close();  //De ya no tener nada cerramos bas
       }
   } catch (IOException e) { //Manejo de excepcion
    e.printStackTrace();
   } 
        }
     return sab.toString();    
    }

Memoria Interna
    private String getMemory(){
     StringBuffer mem = new StringBuffer();
     externalStorageState = Environment.getExternalStorageState(); //Creamos el constructor
                                                               
        if(externalStorageState.equals(Environment.MEDIA_MOUNTED) //Comprobamos si la memoria SD esta conectada
          || externalStorageState.equals(Environment.MEDIA_UNMOUNTED)
          || externalStorageState.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
        {
         stats = new StatFs(Environment.getExternalStorageDirectory().getPath()); //Obtenemos las estadisticas de la raiz de SD
         
         mem.append("Memoria\n\tTotal: ");
         totalSize = stats.getBlockCount() * stats.getBlockSize(); //Tamano total
         numberFormat = NumberFormat.getInstance(); //Inicializamos el objeto
         numberFormat.setGroupingUsed(false); //Desactivamos la agrupacion
         numberFormat.setMaximumFractionDigits(2); //Mostramos los numeros con dos decimales
         String qaz = numberFormat.format((totalSize / (double)1048576)); //Operacion para que nos lo devuelva en MB
         mem.append(qaz + " MB\n"); //Agregamos el resultado a la cadena mem
         
         mem.append("\n\tLibres: ");
         freeSpace = stats.getAvailableBlocks() * stats.getBlockSize(); //Vemos el espacio libre
         String wsx = numberFormat.format((freeSpace / (double)1048576)); //Convertimos
         mem.append(wsx + " MB\n"); //Agregamos el resultado a la cadena
                }
        return mem.toString(); //Regrsamos mem
    }

En el codigo puse comentarios, donde explicaba el codigo, algunas cosas las omiti, para no repetir comentarios como al declarar un objeto, una variable, una funcion, etc.

Resultado
Los datos que nos arrojan, son los siguientes:


Donde si ponemos atencion, esta dividido en tres partes: cpu, memoria y memoria ram.
CPU:
Processor: Aqui nos da el nombre del procesador que usa.
BogoMips: Es la velocidad en la que un bucle de retardo.
Features: Muestra las caracteristicas que contiene, en cuanto a su operacion.
CPU implementer: Es el gestor de recursos.
CPU architecture: Arquitectura que emplea.
CPU variant: //Falta.
CPU part: Lee los fifos y los formatos de datos.
CPU revision: Numero de revision del procesador.

Memoria:
Total: Da el total de la memoria.
Libre: Lo que queda libre de la memoria.

Memoria Ram:
MemTotal: La RAM total utilizable(espacio reservado y el tamaño del binario del kernel)
MemFree: La suma de LowFree y HighFree.
Buffers: La memoria del buffer cache.
Cached: La memoria en el caché de disco menos SwapCache.
SwapCache: La memoria que, una vez enviada al swap fue recuperada pero permanece en el fichero temporal, de forma que si es necesario volver a enviarla al swap ya está allí, ahorrandose E/S.
...
Si queremos saber mas de lo arrojado en la ram, les recomiendo que visiten este link, ya que proporciona informacion muy util acerca de esto y aqui fue donde me base

Aplicacion:
Para poder comparar esto y ponerlo en marcha en nuestro smartphone, sigamos el tutorial y veamos la informacion que nos da. O podemos Descargar la aplicacion.




Codigo Completo:
package ab.prueba.namespace;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.NumberFormat;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.widget.TextView;

public class PruebaActivity extends Activity {
    /** Called when the activity is first created. */
 private TextView textInfo;
 private StatFs stats;
 private String externalStorageState;
 private double totalSize;
 private double freeSpace;
 private TextView memory_info;
 private TextView display_ram;
 private NumberFormat numberFormat;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        memory_info = (TextView)findViewById(R.id.memoryRemain);
        memory_info.setText(getMemory());
        
        textInfo = (TextView) findViewById(R.id.cpu_info);
        textInfo.setText(getInfo());
        
        display_ram = (TextView)findViewById(R.id.memory_ram);
        display_ram.setText(RamInfo());
    }
    
    private String getInfo(){
     String cpu = "/proc/cpuinfo";
     StringBuffer sb = new StringBuffer();
     sb.append("CPU: \n");
     if (new File(cpu).exists()) {
         try {
          BufferedReader br = new BufferedReader(new FileReader(new File(cpu)));
          String aLine;
    while ((aLine = br.readLine()) != null) {
     sb.append("\t"+ aLine + "\n");
    }
    if (br != null) {
        br.close();
       }
   } catch (IOException e) {
    e.printStackTrace();
   } 
        }
     return sb.toString();    
    }
    
    private String getMemory(){
     StringBuffer mem = new StringBuffer();
     externalStorageState = Environment.getExternalStorageState();

        if(externalStorageState.equals(Environment.MEDIA_MOUNTED)
          || externalStorageState.equals(Environment.MEDIA_UNMOUNTED)
          || externalStorageState.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
        {
         stats = new StatFs(Environment.getExternalStorageDirectory().getPath());
         
         mem.append("Memoria\n\tTotal: ");
         totalSize = stats.getBlockCount() * stats.getBlockSize();
         numberFormat = NumberFormat.getInstance();
         numberFormat.setGroupingUsed(false);
         numberFormat.setMaximumFractionDigits(2); 
         String qaz = numberFormat.format((totalSize / (double)1048576));
         mem.append(qaz + " MB\n");
         
         mem.append("\tLibres: ");
         freeSpace = stats.getAvailableBlocks() * stats.getBlockSize();
         String wsx = numberFormat.format((freeSpace / (double)1048576));
         mem.append(wsx + " MB\n");
                }
        return mem.toString();
    }
    
    private String RamInfo(){
     String dir = "/system/bin/cat";
     String mem = "/proc/meminfo" ;
     StringBuffer sab = new StringBuffer();
     sab.append("RAM \n");
     if (new File(dir).exists()) {
         try {
          BufferedReader bas = new BufferedReader(new FileReader(new File(mem)));
          String aLine;
    while ((aLine = bas.readLine()) != null) {
     //Falta
     //numberFormat = NumberFormat.getInstance();
           //numberFormat.setGroupingUsed(false);
           //numberFormat.setMaximumFractionDigits(2);
           //String[] tokens = aLine.split(" ");
           //double aDouble = Double.parseDouble(tokens[1]);
           //String aun = numberFormat.format((aDouble / (double)1048576));
           //String aun = numberFormat.format((aDouble / (double)1048576));
     //sab.append("\t"+ tokens[0] + aun + "\n");
     sab.append("\t"+ aLine + "\n");
    }
    if (bas != null) {
        bas.close();
       }
   } catch (IOException e) {
    e.printStackTrace();
   } 
        }
     return sab.toString();    
    }
}

O podemos descargar todo el codigo aqui, incluyendo lo que ocupamos en el xml.

Video:


Bibliografia:
http://foros.softonic.com/documentacion-linux/proc-meminfo-explicado-96981
http://www.redhat.com/advice/tips/meminfo.html
http://www.java2s.com/Code/Android/Core-Class/returnTrueiftheexternalstorageisavailablewritable.htm

1 comentario:

  1. Bien. Aquí van 8 para el lab de móviles. (El nuevo mecanismo de comprobar que no soy un robot es insoportable - no son lada legibles las letras...)

    ResponderEliminar