domingo, 9 de diciembre de 2012

Como hacer que coexistan gNewSense, Ubuntu y Windows

Explicaré como hacer que coexistan gNewSense y Ubuntu en una PC convencional(Muy interesante para los que como yo tuvieron problemas cuando se Instaló gNewSense después de Ubuntu), Este es un manual de ayuda para aquellos que ya tiene ciertos conocimientos básicos de sistemas GNU/Linux(y conocen conceptos como LiveCD, LiveUSB, Grub, boot, particiones, etc).
Empecemos:

gNewSense: Una de las distribuciones GNU/Linux completamente libres recomendada por la FSF y además una de las mas usadas de su categoría.

Ubuntu: Distribución GNU/Linux muy popular pero no recomendada por la FSF, ya que contiene módulos de software que tienen licencias no compatible con la GNU License, osea es una distro no completamente libre.

Escenario(Mi caso):

1º Una Laptop con Windows 7(NTFS) y Ubuntu(ext4); el grub de ubuntu permite elegir sin problemas que sistema operativo arrancar cuando se enciende la PC. Hasta aquí todo bien.

2º Instalé gNewSense(ext3); el grub de gnewsense no muestra a Ubuntu en su menú (a windows sí), por lo que es necesario arreglar el problema.

Problema:  El grub solo muestra en su menú de opciones a dos(Windows y gNewSense) de los tres(Falta Ubuntu) sistemas operativos instalados en la PC.

Solución:

1º Levantar un sistema vivo Ubuntu.
Levantar un Live CD o Live USB con ubuntu, en mi caso levante un LiveUSB con la iso: ubuntu-12.04-desktop-i386.iso; con la ayuda de la herramienta: Universal-USB-Installer-1.8.9.6. Desde mi sistema Windows.

2º Reemplazar el grub de gNewSense por el grub de Ubuntu(El instalado en el disco duro).
Una ves tengamos levantado nuestro sistema vivo Ubuntu, debemos instalar su grub y reemplazar al grub actual.
Pasos:
   a) Montar la partición de Ubuntu(El ubuntu instalado en el disco duro)
                   sudo mkdir /mnt/disco
                   sudo mount -t ext4 /dev/sda6 /mnt/disco 
{Donde ext4 es el formato del sistema de archivos de la particion sda6, sda6 es la partición donde tienes instalador Ubuntu en el disco duro, si necesitas ver las particiones de tu disco duro Ejecuta: sudo cfdisk o sudo fdisk -l}
                   sudo mount --bind /deb /mnt/disco/dev

   b) Ingresar como root en la paritición montada, para que todos los comandos que ejecutemos en adelante sean efectuados en el sistema de archivos de dicha partición(Hacking).
                   sudo chroot /mnt/disco
     En éste paso te debe salir un nuevo shell con usuario root.

   c) Instalar el Grub de la partición montada(lo que es lo mismo que instalar el grub de nuestro ubuntu instalado en el disco duro y no del LiveCD/USB) en el MBR del disco duro.
                   grub-install /dev/sda
                   exit

PD: Esta es solo una de las formas por las que puedes reemplazar o reinstalar el grub de cualquier distro GNU/Linux instalada en el MBR de tu PC(Existen según e visto hasta dos formas mas y también son validas)

3º Reiniciar el sistema vivo, quitar el LiveCD/USB y verificar el nuevo grub instalado.
Ahora en ése nuevo grub instalado podrás ver que todas las opciones del menu permiten que levante solo a Windows o Ubuntu, gNewSense ahora no aparece en el menú, el ultimo paso es configurar correctamente el grub de Ubuntu.

4º Modificar el archivo grub.cfg(Archivo de configuracion del grub)  de nuestro Ubuntu y agregar los parámetros necesarios para que contenga en la lista de su menú a gNewSense, Ubuntu y Windows.

      a) Ingresar a Ubuntu(ya no como LiveCD /USB) selecionando la opción correspondiente en nuestro nuevo grub.

    b) Modificar el archivo /boot/grub/grub.cfg agregando las opciones necesarias para que el grub ahora bootee tambien a gNewSense.

                                   sudo nano /boot/grub/grub.cfg
     
  Agregar debajo de el código que bootea a Ubuntu lo siguiente:


menuentry 'gNewSense 2.3 deltah' --class gnu-linux --class os {
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos7)'
        search --no-floppy --fs-uuid --set=root d5c4eb63-084f-414c-aee1-5d0ea3e225f2
        linux   /boot/vmlinuz-2.6.24-24-generic root=UUID=d5c4eb63-084f-414c-aee1-5d0ea3e225f2 ro quiet splash
        initrd  /boot/initrd.img-2.6.24-24-generic
}

PD: Para que obtengas la información con letras rojas y reemplaces las que te estoy mostrando, debes acceder al archivo de configuración menu.lst de gNewSense, para ésto debes montar la partición en la que instalaste gNewSense y habrir dicho archivo.
Para la linea de letras azules debes reemplazar  set root='(hd0,msdos7)' por set root='(hd0,msdos#)' donde # es el siguiente numero consecutivo(msdos1, msdos2, etc) de todas las linea set root='(hd0,msdos#)' que encuentres en dicho archivo(grub.cfg de ubuntu).

Reinicia la PC y listo, Te debería salir el menú del grub con las opciones para que escojas cualquiera de tus tres sistemas operativos a iniciar.

Heberth.






jueves, 6 de septiembre de 2012

Android: Como DESACTIVAR y/o ACTIVAR un componente (BroadcastReceiver, Activity, etc) dinamicamente


Para desactivar o activar desde código según condiciones algún componente Android como son BroadcastReceivers, Activities, Services, etc. ya sean registrados en el manifest o también desde código  se utiliza un objeto de la clase component, esto es especialmente útil cuando por ejemplo solo necesitan activar la funcionalidad al  100% de su aplicación bajas condiciones de los usuarios o acciones que estos realizen(Por ejemplo registrar la app usando un web service)

Vean el código:

//Activar

PackageManager pm = context.getPackageManager();    
pm.setComponentEnabledSetting(new ComponentName(context, Discovery.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP);

//Desactivar


PackageManager pm = context.getPackageManager();      
pm.setComponentEnabledSetting(new ComponentName(context, Discovery.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);


.Heberth
heberth2788@gmail.com

Android: Como modificar un APK

En alguna oportunidad quizá necesitemos modificar el contenido de un APK y que éste continue siendo instalable. Lo que se necesita es lo siguiente:

  • El APK(Ejm: com.micasa.client.apk)
  • El keystore con el que se firmo el APK(Aunque leí que éste ultimo no es necesario, tambien podrian generar un nuevo keystore distinto al original con el que se firmo el APK, queda que ustedes lo prueben)(Ejm: myalmacendeclaves.heystore)(Generar una nuevo keystore, Ejm: keytool -genkey -v -keystore almacen-android -alias Theliel -keyalg RSA -keysize 2048 -validity 3650 )

Y las herramientas(Poner las rutas de estos ejecutables en la PATH del sistema para poder acceder desde cualquier directorio en el que nos encontremos):

  • apktool(http://code.google.com/p/android-apktool/)
  • jarsigner(http://www.oracle.com/technetwork/java/javase/downloads/index.html)
  • zipalign(http://developer.android.com/sdk/index.html)-Viene en el JDK de Android
El procedimiento a seguir es el siguiente:
  • Decompilar el APK
  • Modificar el contenido descomprimido(Archivos en RAW, manifest, imagenes, etc)
  • Recontruir el apk
  • Firmar el APK
  • Alinear el APK(Que en palabras simples es optimizarlo, osea que use menos memoria)(Se puede obiar éste paso)
Quiza le parescan demasiados pasos, pero se pueden por ejemplo poner todos éstos en un .bat(Windows) o en un .sh(Linux)

Comencemos:

Decompilamos el APK en una carpeta usando la herramienta apktool:

                apktool d -f com.micasa.client.apk .\decompilado\client

La "d" indica descomprimir, el "-f" indica que si existe la carpeta destino, la chancará.

Luego de esto debemos tener en la carpeta .\decompilado\client (Usted puede poner la que quiera) el apk descomprimido.

Modificar el contenido de los archivos descomprimidos, aqui viene la parte interesante, podemos por ejemplo cambiar alguna IP que tenga por defecto el APK, la imagen por defecto, los arhivos que tenga, etc, miles de cosas(Pos favor no usarlo para cosas oscuras (mentira))

Yo solo necesitaba modificar el contenido de un archivo en la carpeta RAW del APK, por lo que lo hice con ésta linea(en un .bat porsupuesto):

                    echo iptexto="192.168.1.21">.\decompilado\client\res\raw\auxiliar.txt

Recontruir el APK de la siguiente forma:

                      apktool b .\decompilado\client\ apk_client_sinfirmar_sinalineal.apk 

La "b" indica al contrario de "d", generar el APK o 'comprimirlo'. Ésta linea nos debería crear el APK llamado pk_client_sinfirmar_sinalineal.apk en el directorio actual donde nos encontremos, éste APK esta sin firmar y sin optimizar.

Firmar el APK, aquí usaremos nuestro archivo de almacén de claves(.keystore):

Para Java 7:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore ./myalmacendeclaves.keystore  -storepass   -keypass  ./apk_client_sinfirmar_sinalineal.apk  

Para Java 6:
jarsigner -verbose -keystore ./myalmacendeclaves.keystore -storepass  -keypass  ./apk_client_sinfirmar_sinalineal.apk

Ejm para Java6: 
jarsigner -verbose -keystore ./myalmacendeclaves.keystore -storepass androidsp -keypass androidkey ./apk_client_sinfirmar_sinalineal.apk platform

Jarsigner es una herramienta que sirve para firmar en éste caso APKs,  "-keystore" indica que usaremos un archivo keystore para firmar,  "-sigalg MD5withRSA -digestalg SHA1" indican el algoritmo a usar para firmar, se debe especificar obligatoriamente para Java 7, en caso contrario saldrá un error al firmar, para Java 6 no es necesario ya que Android conserva la compatibilidad con Java 6 y no con Java 7(Por el momento).

Nuestro APK apk_client_sinfirmar_sinalineal.apk ahora ya se encuentra firmado, es importante primero firmar el APK y luego optimizarlos, ya que si se hace de la manera contraria, la optimización sera nula. Renombramos el apk de  apk_client_sinfirmar_sinalineal.apk a  apk_client_sinalineal.apk

Optimizar el APK, también se le conoce como alinear:

             zipalign -v 4  apk_client_sinalineal.apk com. micasa .client.apk

El "-v 4"  indica que el comienzo de cada archivo del APK(Ejm: imágenes, archivos de texto, etc) comience con un bloque de 32 bits(4 bytes)

---------------------------------------------------------------------------------------------------------------------------------

¡ Y listo ya tenemos nuestro nuevo APK modificado e instalable, 100% funcional !


.Heberth
heberth2788@gmail.com

miércoles, 5 de septiembre de 2012

Android: Como saber si una aplicación está instalada o no


En Android para poder conocer si un paquete en particular(conociendo su nombre Ejm: com.heberth.client) está instalado en el dispositivo o no se debe usar un objeto de la clase PackageManager y con un pequeño truco podremos saberlo, el código es el siguiente:

//Consultar el método
if(isAppInstaled("com.heberth.client"))
{
      Log.d(getClass().getSimpleName(), "Instalado");
}
else
{
    Log.d(getClass().getSimpleName(), "No Instalado");
}

//Método
 private boolean isAppInstaled(String nomPackage)
    {
    PackageManager manejadorPaquetes = getPackageManager();
    boolean ret=Boolean.FALSE;
    try
    {
    manejadorPaquetes.getInstallerPackageName(nomPackage);
       ret=Boolean.TRUE;
    }
    catch(Exception ex)
    {
    ret=Boolean.FALSE;
    }  
    return ret;
    }

Lo que hace éste método es valerse de try y catch cuando se llama al método getInstallerPackageName(nomPackage), ya que éste metodo devuelve una exepción cuando no logra encontrar el paquete en la lista de todos los paquetes instalados en nuestro Android.

.Heberth
heberth2788@gmail.com