<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La fatiga del Geek &#187; Sistemas Operativos</title>
	<atom:link href="http://nauj27.com/blog/category/sistemas-operativos/feed/" rel="self" type="application/rss+xml" />
	<link>http://nauj27.com/blog</link>
	<description>Reflexiones y cacharreos de nauj27</description>
	<lastBuildDate>Wed, 01 Feb 2012 19:17:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Fuse layer for ADB &#8211; adbfuse</title>
		<link>http://nauj27.com/blog/2012/02/01/fuse-layer-for-adb-adbfuse/</link>
		<comments>http://nauj27.com/blog/2012/02/01/fuse-layer-for-adb-adbfuse/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 19:17:55 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[fuse]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=912</guid>
		<description><![CDATA[En los últimos días he estado trabajando en un proyecto que permite mostrar el contenido de un móvil con Android como si fuese una unidad de disco externa. Las ventajas que tiene respecto a activar la conexión por USB que trae Android de serie son varias, entre ellas: Acceso completo al sistema de ficheros del [...]]]></description>
			<content:encoded><![CDATA[<p>En los últimos días he estado trabajando en un proyecto que permite mostrar el contenido de un móvil con <a href="http://www.android.com/">Android</a> como si fuese una unidad de disco externa.</p>
<p>Las ventajas que tiene respecto a activar la conexión por USB que trae Android de serie son varias, entre ellas:</p>
<ul>
<li><strong>Acceso completo al sistema de ficheros</strong> del teléfono. La tarjeta de memoria interna es accesible en <em>/mnt/sdcard</em>.</li>
<li><strong>Acceso simultáneo desde el teléfono y desde el ordenador</strong>. De este modo no dejarán de funcionar las aplicaciones que han sido pasadas a la tarjeta de memoria mientras la usamos desde el ordenador.</li>
</ul>
<p>Se trata de una primera versión y en directorios donde hay muchos archivos, por ejemplo la carpeta de fotos o de música, el acceso puede ser algo lento. Las siguientes versiones de <a title="Fuse layer for ADB" href="http://code.google.com/p/adbfuse/">adbfuse</a> irán mejorando este y otros aspectos.</p>
<p>Se trata de algo para usuarios avanzados, ya que el teléfono ha de estar <em>rooteado</em>, tener instalado BusyBox, y saber montar un sistema de archivos FUSE en Linux.</p>
<p>Se puede descargar en <a href="http://code.google.com/p/adbfuse/">la web del proyecto</a> tanto la <a href="http://code.google.com/p/adbfuse/downloads/detail?name=adbfuse.tar.bz2">versión empaquetada</a> como el código fuente con <a href="http://mercurial.selenic.com/">Mercurial</a>. El proyecto ha sido liberado bajo la licencia <a href="http://gplv3.fsf.org/">GNU GPLv3</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2012/02/01/fuse-layer-for-adb-adbfuse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Threads y animaciones en Android</title>
		<link>http://nauj27.com/blog/2011/05/14/threads-y-animaciones-en-android/</link>
		<comments>http://nauj27.com/blog/2011/05/14/threads-y-animaciones-en-android/#comments</comments>
		<pubDate>Sat, 14 May 2011 10:17:07 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=881</guid>
		<description><![CDATA[En la entrada anterior vimos cómo convertir un gif animado en una animación para Android. Lo siguiente que queremos hacer es usar esa animación en una aplicación. Es un problema conocido que si se llama al método AnimationDrawable.start() desde métodos del Activity como en Activity.onCreate(), la animación no se moverá, y solo se verá la [...]]]></description>
			<content:encoded><![CDATA[<p>En <a title="Uso de gif animado en Android" href="http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/">la entrada anterior</a> vimos cómo convertir un gif animado en una animación para Android. Lo siguiente que queremos hacer es usar esa animación en una aplicación.</p>
<p><a title="Issue 1818 - AnimationDrawable.start()  doesn't work" href="http://code.google.com/p/android/issues/detail?id=1818">Es un problema conocido</a> que si se llama al método <a href="http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html#start%28%29"><em>AnimationDrawable.start()</em></a> desde métodos del Activity como en <a href="http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"><em>Activity.onCreate()</em></a>, la animación no se moverá, y solo se verá la primera imagen de la misma. No habrá ningún error, no habrá ningún problema, y sin embargo la animación no se moverá.</p>
<p><a title="Solución al problema" href="http://code.google.com/p/android/issues/detail?id=1818#c5">La solución</a> la aporta un usuario en la misma <a title="Issue 1818" href="http://code.google.com/p/android/issues/detail?id=1818">hebra del problema</a>, y viene a decir que hay que crear una clase <em>Starter</em> que implemente la interfaz <a href="http://developer.android.com/reference/java/lang/Runnable.html"><em>Runnable</em></a> y crear un objeto de este tipo dentro del método <a title="En realidad el método post() viene heredado de View" href="http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29"><em>ImageView.post()</em></a>. De este modo el método <a href="http://developer.android.com/reference/java/lang/Runnable.html#run%28%29"><em>run()</em></a> de la clase Starter se ejecutará en la misma hebra que el método del Activity (la hebra de interfaz del usuario &#8211; <a title="Solo se debe modificar la interfaz desde ésta hebra principal" href="http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html">UI Thread</a>) y además después de que nuestro ImageView haya sido correctamente inicializado y mostrado en pantalla.</p>
<p>Esta primera parte iría en el método del <em>Activity</em> donde queremos asignar e iniciar la animación.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// --- %&lt; ---</span>
imageView.<span style="color: #006633;">setBackgroundResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">throbber</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
AnimationDrawable d <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>AnimationDrawable<span style="color: #009900;">&#41;</span>imageView.<span style="color: #006633;">getBackground</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
imageView.<span style="color: #006633;">post</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Starter<span style="color: #009900;">&#40;</span>d<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// --- %&lt; ---</span></pre></td></tr></table></div>

<p>Y por otro lado tendríamos que crear una clase Starter() como la siguiente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
* Starts the animation drawable passed to the constructor.
*/</span>
<span style="color: #000000; font-weight: bold;">class</span> Starter <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Runnable</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> AnimationDrawable animationDrawable <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Starter<span style="color: #009900;">&#40;</span>AnimationDrawable animationDrawable<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">animationDrawable</span> <span style="color: #339933;">=</span> animationDrawable<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">animationDrawable</span>.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2011/05/14/threads-y-animaciones-en-android/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Uso de gif animado en Android</title>
		<link>http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/</link>
		<comments>http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 17:43:47 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animación]]></category>
		<category><![CDATA[gif]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=872</guid>
		<description><![CDATA[En Android se suele usar un ImageView para dibujar una imagen. La imagen puede provenir de un recurso interno, de una imagen externa, o de un objeto drawable que se le pase directamente al método .setImageDrawable(). En cualquier caso, en la mayoría de dispositivos no será posible mostrar en este tipo de contenedor un gif [...]]]></description>
			<content:encoded><![CDATA[<p>En Android se suele usar un <a href="http://developer.android.com/reference/android/widget/ImageView.html">ImageView</a> para dibujar una imagen. La imagen puede provenir de un recurso interno, de una imagen externa, o de un objeto drawable que se le pase directamente al método <a href="http://developer.android.com/reference/android/widget/ImageView.html#setImageDrawable(android.graphics.drawable.Drawable)">.setImageDrawable()</a>.</p>
<p>En cualquier caso, en la mayoría de dispositivos no será posible mostrar en este tipo de contenedor un gif animado, ya que según la documentación tan solo se representará el primer frame de la imagen animada.</p>
<p>El modo de representar correctamente una animación en android es usando un <a href="http://developer.android.com/guide/topics/resources/animation-resource.html">recurso creado específicamente para ello</a>. De los dos tipos de animaciones que se pueden crear en Android la que nos interesa en esta ocasión es la que se conoce como <a href="http://developer.android.com/guide/topics/resources/animation-resource.html#Frame">Frame Animation</a>. La idea es sencilla y es muy similar a la de los GIF animados: un archivo xml define qué imágenes se muestran y durante cuánto tiempo, las imágenes deben de encontrarse accesibles como recursos internos de la aplicación. Para más información véase la documentación sobre <a href="http://developer.android.com/guide/topics/resources/animation-resource.html#Frame">Frame Animation</a>.</p>
<p>La cuestión es que hay un montón de GIFs animados que podemos querer incluir en nuestra aplicación para Android, así que es necesario hacer una conversión de un formato a otro de un modo más o menos automatizado.</p>
<p>El siguiente guión en python extrae los frames completos así como la información temporal y espacial de cada uno de ellos regenerando imágenes en caso de tratarse de un GIF optimizado, para formar un recurso de imagen completo para Android. La <a href="http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html">animación así creada</a> funcionará correctamente en cualquier dispositivo en cualquier versión de Android. Para más información véase la clase <a href="http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html">AnimationDrawable</a>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- encoding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">subprocess</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># When no delay is specified in a gif file, 100ms is default</span>
DEFAULT_DELAY_MS = <span style="color: #ff4500;">100</span>
&nbsp;
input_file = <span style="color: #008000;">None</span>
output_file = <span style="color: #008000;">None</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    input_file = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
    output_file = <span style="color: #483d8b;">&quot;%s.xml&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Usage: %s &lt;input.gif&gt;&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Anim<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_header<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;animation-list<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'    xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'    android:oneshot=&quot;false&quot;&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_item<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">resource</span>, duration<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>
            <span style="color: #483d8b;">'    &lt;item android:drawable=&quot;@drawable/%s&quot; android:duration=&quot;%d&quot; /&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span>
            <span style="color: black;">&#40;</span><span style="color: #dc143c;">resource</span>, duration<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_footer<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">content</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;/animation-list&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> write_file<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        file_descriptor = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>output_file, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
        file_descriptor.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">content</span><span style="color: black;">&#41;</span>
        file_descriptor.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Gif<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, gif<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">input_file</span> = gif
        gif_info = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span>
            <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;gifsicle&quot;</span>, <span style="color: #483d8b;">&quot;--info&quot;</span>, input_file<span style="color: black;">&#93;</span>,
            stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span>,
            stderr=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: black;">&#40;</span>gif_info_out, gif_info_error<span style="color: black;">&#41;</span> = gif_info.<span style="color: black;">communicate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">gif_info_lines</span> = gif_info_out.<span style="color: black;">splitlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_info<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">gif_info_lines</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> explode<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:    
        return_code = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span>
            <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;gifsicle&quot;</span>, <span style="color: #483d8b;">&quot;--explode&quot;</span>, <span style="color: #483d8b;">&quot;--unoptimize&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">input_file</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff7700;font-weight:bold;">not</span> return_code
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> to_png<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, gif_frame<span style="color: black;">&#41;</span>:
        return_code = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;gif2png&quot;</span>, <span style="color: #483d8b;">&quot;-d&quot;</span>, <span style="color: #483d8b;">&quot;-s&quot;</span>, <span style="color: #483d8b;">&quot;-O&quot;</span>, gif_frame<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> return_code
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Processing %s...&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file,<span style="color: black;">&#41;</span>
&nbsp;
    anim = Anim<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    anim.<span style="color: black;">add_header</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> 
&nbsp;
    gif = Gif<span style="color: black;">&#40;</span>input_file<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> gif.<span style="color: black;">explode</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error exploding gif input file %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file,<span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#sys.exit(1)</span>
&nbsp;
    info_lines = gif.<span style="color: black;">get_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    counter = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> info_lines:
        line = line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> line.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;disposal&quot;</span><span style="color: black;">&#41;</span>:
            line_items = line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>line_items<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">4</span>:
                milliseconds = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">round</span><span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span>line_items<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                milliseconds = DEFAULT_DELAY_MS
&nbsp;
            <span style="color: #808080; font-style: italic;"># Rename and convert gif to optimized png</span>
            renamed_gif = <span style="color: #483d8b;">&quot;%s_%03d.gif&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, counter<span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">os</span>.<span style="color: black;">rename</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.%03d&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>input_file, counter<span style="color: black;">&#41;</span>, renamed_gif<span style="color: black;">&#41;</span>
            result = gif.<span style="color: black;">to_png</span><span style="color: black;">&#40;</span>renamed_gif<span style="color: black;">&#41;</span>
&nbsp;
            anim.<span style="color: black;">add_item</span><span style="color: black;">&#40;</span>renamed_gif.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, milliseconds<span style="color: black;">&#41;</span>
            counter = counter + <span style="color: #ff4500;">1</span>
&nbsp;
    anim.<span style="color: black;">add_footer</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    anim.<span style="color: black;">write_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #dc143c;">os</span>.<span style="color: black;">unlink</span><span style="color: black;">&#40;</span>input_file<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Es necesario tener instalado <a href="http://www.lcdf.org/gifsicle/">gifsicle</a>, y para la optimización en tamaño y conversión a png de las imágenes resultantes es necesario tener también instalado, y en el <strong>$PATH</strong>, <a href="http://catb.org/~esr/gif2png/">gif2png</a>.</p>
<p>Descargar <a href='http://nauj27.com/blog/wp-content/uploads/2011/02/getanim.zip'>getanim.py</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2011/02/08/uso-de-gif-animado-en-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bitmap desde NV21 en Android</title>
		<link>http://nauj27.com/blog/2010/12/13/bitmap-desde-nv21-en-android/</link>
		<comments>http://nauj27.com/blog/2010/12/13/bitmap-desde-nv21-en-android/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 21:32:46 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[color]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nv21]]></category>
		<category><![CDATA[ycbcr]]></category>
		<category><![CDATA[yuv]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=858</guid>
		<description><![CDATA[En el nuevo proyecto que estoy escribiendo para Android, me he visto en la necesidad de analizar cada una de las imágenes que recoge la cámara durante la vista previa de la misma. Según la documentación el formato que deben de implementar los dispositivos con Android es YCbCr_420_SP codificado como NV21. Aunque en principio se [...]]]></description>
			<content:encoded><![CDATA[<p>En el nuevo proyecto que estoy escribiendo para Android, me he visto en la necesidad de analizar cada una de las imágenes que recoge la cámara durante la vista previa de la misma. Según la documentación el formato que deben de implementar los dispositivos con Android es <a href="http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html#onPreviewFrame(byte[],%20android.hardware.Camera)">YCbCr_420_SP codificado como NV21</a>. Aunque en principio se podrían especificar otros formatos es extraño que algún terminal tenga otro formato implementado así que deberemos de usar ese si queremos que funcione en el mayor número de plataformas y dispositivos posibles.</p>
<div id="attachment_859" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-859" title="Cylon detector" src="http://nauj27.com/blog/wp-content/uploads/2010/12/cylondetector.jpg" alt="Cylon detector pre-early release" width="500" height="312" /><p class="wp-caption-text">Desarrollo de Cylon Detector para Android</p></div>
<p>En cada frame recibido se desea analizar si existe la cara de una persona, por lo que hay que convertir la imagen a <a href="http://developer.android.com/reference/android/graphics/Bitmap.html">Bitmap</a> y pasarla al <a href="http://developer.android.com/reference/android/media/FaceDetector.html">detector de caras</a> que provee el API. Pues bien, existe un problema y es que <a href="http://code.google.com/p/android/issues/detail?id=823">la factoría para crear Bitmaps no acepta ese formato</a>. Hay <a href="http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/PlanarYUVLuminanceSource.java?r=1677">varias soluciones</a> por la red, pero unas son para Android 2.2 en adelante, otras son implementaciones en C para hacerlas usando el NDK como librería independiente, y otras símplemente son demasiado complejas para lo que aquí se necesita.</p>
<p>Al final lo que he hecho es analizar el formato de los datos en base a su <a href="http://www.fourcc.org/yuv.php#NV21">definición</a> y crear el Bitmap a partir de estos datos para la imagenen blanco y negro. Podría hacerse para la imagen en color símplemente leyendo todos los datos y haciendo uso de las funciones de <a href="http://www.fourcc.org/fccyvrgb.php">conversión de YCrCb a RGB</a> pero ello requeriría mayor tiempo de proceso incluyendo varias multiplicaciones en coma flotante. Aquí solo necesitamos en principio detectar si hay una cara en la imagen o no, y para ello es suficiente con que la imagen sea en blanco y negro. Para obtener la imagen en blanco y negro lo que he hecho ha sido leer los valores de luminancia (luminosidad), que según el formato NV21 están en la primera parte del array y convertir cada valor a un punto RGB con el mismo valor. El resultado, aunque no se aprecia demasiado bien en la imagen anterior, no es completamente una imagen en blanco y negro, sino que aparecen zonas saturadas de un color amarillo. La conversión que estoy realizando no es del todo correcta pero es cuestión de convertir y acotar correctamente los valores.</p>
<p>Por si a alguien le es de utilidad, esto es un recorte de la parte más importante que he programado para la conversión de NV21 a Bitmap:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author nauj27
 * The Utils class contains utilities for CylonDetector.
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Utils <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * See http://www.fourcc.org/yuv.php#NV21 for more information.
	 * We only read luminance for speed up the whole process. 
	 * All colors of the image are set to the luminance value and
	 * this way we obtains a black and white image for processing.
	 * 
	 * @param data The data array in NV21 (YCbCr_420_SP) format.
	 * @return Black and white bitmap decoded from NV21 input data.
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Bitmap getBitmapFromNV21<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> data, <span style="color: #000066; font-weight: bold;">int</span> width, <span style="color: #000066; font-weight: bold;">int</span> height<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> pixelsNumber <span style="color: #339933;">=</span> width <span style="color: #339933;">*</span> height<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> colors <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span>pixelsNumber<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> pixel <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> pixel <span style="color: #339933;">&lt;</span> pixelsNumber<span style="color: #339933;">;</span> pixel<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			colors<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">rgb</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span>, data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span>, data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> Bitmap.<span style="color: #006633;">createBitmap</span><span style="color: #009900;">&#40;</span>colors, width, height, Bitmap.<span style="color: #006633;">Config</span>.<span style="color: #006633;">ARGB_8888</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><b>Editada:</b> El modo correcto de convertir el valor de luminancia a escala de grises para crear la imagen lo he sacado finalmente del proyecto zxing, y es el que dejo a continuación:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">grey <span style="color: #339933;">=</span> data<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;</span> 0xff<span style="color: #339933;">;</span>
colors<span style="color: #009900;">&#91;</span>pixel<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> 0xff000000 <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>grey <span style="color: #339933;">*</span> 0x00010101<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Esto es lo que iría dentro del bucle <i>for</i> para que sea interpretado correctamente por el <b>Bitmap.createBitmap</b> como mapa de color <b>ARGB_8888</b>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/12/13/bitmap-desde-nv21-en-android/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Configuración MMS con Simyo en Android</title>
		<link>http://nauj27.com/blog/2010/10/29/configuracion-mms-con-simyo-en-android/</link>
		<comments>http://nauj27.com/blog/2010/10/29/configuracion-mms-con-simyo-en-android/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 10:34:58 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[mms]]></category>
		<category><![CDATA[simyo]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=822</guid>
		<description><![CDATA[Siempre que pierdo la configuración me tiro unos días buscando la forma de volver a hacer funcionar los mensajes MMS con Android. Todas las configuraciones que por ahí aparecen hablan de crear dos perfiles, uno para Internet y otro para los MMS. Finalmente habría que ir a la configuración de los mensajes y asignar el [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre que pierdo la configuración me tiro unos días buscando la forma de volver a hacer funcionar los mensajes MMS con Android. Todas las configuraciones que por ahí aparecen hablan de crear dos perfiles, uno para Internet y otro para los MMS. Finalmente habría que ir a la configuración de los mensajes y asignar el perfil de MMS.</p>
<p>El problema es que en Android no funciona así. Desde la configuración de los mensajes no se puede elegir un perfil y si se crean dos perfiles distintos hay que elegir uno y el otro no se usa para nada.</p>
<p>La solución es crear un único perfil con una mezcla de las dos configuraciones. Lo voy a poner aquí, porque siempre que pierdo la configuración por el cambio de ROM me cuesta volver a hacerlo funcionar.</p>
<p>En el menú Ajustes &gt; Conexiones inalámbricas &gt; Redes móviles &gt; APN &gt; MENÚ &gt; APN nuevo:</p>
<blockquote><p>Nombre: Simyo<br />
APN: gprs-service.com<br />
Proxy:<br />
Puerto:<br />
Nombre de usuario:<br />
Contraseña:<br />
Servidor:<br />
MMSC: http://217.18.32.180:8080<br />
Proxy MMS: 217.18.32.181<br />
Puerto de MMS: 8080<br />
Protocolo MMS: WAP 2.0<br />
MMC: 214<br />
MNC: 19<br />
Tipo de autenticación: Ninguno<br />
Tipo de APN: default,mms</p></blockquote>
<p>Y funcionará así tanto la conexión de red GPRS/3G/HDSPA/HDSPA+ como los mensajes MMS.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/10/29/configuracion-mms-con-simyo-en-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Color Picker es GPL3</title>
		<link>http://nauj27.com/blog/2010/10/02/color-picker-es-gpl3/</link>
		<comments>http://nauj27.com/blog/2010/10/02/color-picker-es-gpl3/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 19:38:14 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[colorpicker]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=818</guid>
		<description><![CDATA[Desde que empecé el desarrollo de ColorPicker para Android tenía en mente liberar el código, pero hasta ahora ponía las típicas excusas: que si el código está muy feo, que si tengo que ponerme. Hoy ya se puede decir que he cumplido con lo que anuncié. Acabo de liberar el código con la versión GPL [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que empecé el desarrollo de <a href="http://nauj27.com/blog/2010/04/28/color-picker/">ColorPicker</a> para Android tenía en mente liberar el código, pero hasta ahora ponía las <a href="http://osl.ugr.es/2010/09/30/excusas-frecuentemente-puestas-para-no-liberar-software-y-su-contraargumento-correspondiente/">típicas excusas</a>: que si el código está muy feo, que si tengo que ponerme. Hoy ya se puede decir que he cumplido con lo que anuncié. Acabo de liberar el código con la versión GPL v3 en <a href="http://code.google.com/p/colorpicker/">la web oficial de ColorPicker</a>.</p>
<p>Para mantener el control de los cambios he venido usando Mercurial. El mejor modo de descargarse el código fuente de ColorPicker es usando por tanto un cliente de Mercurial, disponible para todas las plataformas más usadas.</p>
<p>Tengo varias ideas en mente para esta aplicación, unas que se me ocurrieron y otras muchas que me han ido sugiriendo tanto en persona como en los comentarios del propio Android Market. En las próximas semanas podrán verse novedades y actualizaciones de la aplicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/10/02/color-picker-es-gpl3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Decompilar una aplicación de Android</title>
		<link>http://nauj27.com/blog/2010/06/16/decompilar-una-aplicacion-de-android/</link>
		<comments>http://nauj27.com/blog/2010/06/16/decompilar-una-aplicacion-de-android/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 17:59:04 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[dalvik]]></category>
		<category><![CDATA[jad]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=801</guid>
		<description><![CDATA[Las aplicaciones en Android se programan en Java y es un hecho conocido que Java se puede decompilar con relativa sencillez. Existen varios programas con interfaz gráfica, distintos nombres, distintas utilidades pero al final todos usan uno internamente AFAIK para funcionar: jad. Debido a esto es fácil caer en el error como a mi me [...]]]></description>
			<content:encoded><![CDATA[<p>Las aplicaciones en Android se programan en Java y es un hecho conocido que Java se puede decompilar con relativa sencillez. Existen varios programas con interfaz gráfica, distintos nombres, distintas utilidades pero al final todos usan uno internamente <span title="As Far As I Know"><span style="text-decoration: underline;">AFAIK</span></span> para funcionar: <a href="http://www.varaneckas.com/jad">jad</a>.</p>
<p>Debido a esto es fácil caer en el error como a mi me ocurrió de pensar en que los programas de Android se van a poder decompilar y modificar fácilmente. Esto en la realidad no ocurre así ya que el código binario generado para Android es para su ejecución en la <a href="http://www.dalvikvm.com/">DalvikVM</a> que no tiene nada que ver con el bytecode de Java.</p>
<p>Cuando descomprimes un apk (porque también es bien sabido que no es más que un zip renombrado con unas características especiales), se puede encontrar un fichero classes.dex que contiene las clases de java usadas por la aplicación, entre otras cosas:</p>
<blockquote>
<div id="_mcePaste">$ file classes.dex</div>
<div id="_mcePaste">classes.dex: Dalvik dex file version 035</div>
</blockquote>
<p>Este fichero se puede deconstruir por ejemplo con las utilidades del proyecto <a href="http://code.google.com/p/smali/">smali</a>, lo cual generará una serie de ficheros .smali con los opcodes de Dalvik. Estos ficheros .smali tienen el siguiente aspecto:</p>
<blockquote><p>.class public LHelloWorld;<br />
.super Ljava/lang/Object;<br />
.method public static main([Ljava/lang/String;)V<br />
    .registers 2</p>
<p>    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;</p>
<p>    const-string	v1, &#8220;Hello World!&#8221;</p>
<p>    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V</p>
<p>    return-void<br />
.end method</p></blockquote>
<p>Así el fichero se puede en principio modificar con mayor o menor dificultad y volver a compilar con smali.</p>
<p>Pero no todo es tan bonito como parece hasta aquí, porque ahora hay que reconstruir el apk de la aplicación. El primer paso será actualizar el classes.dex dentro del apk. Esto se puede hacer con la misma utilidad zip estándar. Después hay que firmar el archivo con algo como:</p>
<blockquote><p>$ jarsigner -verbose -keystore my_keystore com.nauj27.android.hackme.apk android</p></blockquote>
<p>El problema viene cuando se intenta verificar la firma del paquete, obteniendo el siguiente mensaje:</p>
<blockquote><p>$ jarsigner -verify com.nauj27.android.hackme.apk<br />
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex</p></blockquote>
<p>Cada fichero lleva una firma SHA1 que <span title="As Far As I Know"><span style="text-decoration: underline;">AFAIK</span></span> no es posible saltarse. Probablemente se podrá hacer algo más pero por ahora lo voy a dejar aquí.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/06/16/decompilar-una-aplicacion-de-android/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>El niño Laí</title>
		<link>http://nauj27.com/blog/2010/06/06/el-nino-lai/</link>
		<comments>http://nauj27.com/blog/2010/06/06/el-nino-lai/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 18:49:06 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[libro]]></category>
		<category><![CDATA[niñolaí]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[toros]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=797</guid>
		<description><![CDATA[El niño Laí es un relato corto que escribió JJ Merelo hace algunos años y que ganó un premio y todo. Yo lo he descubierto ahora porque PJorge se ha currado una versión en ePub que se ve de maravilla en cualquier cacharrín que sea capaz de leer estos formatos. Se ve igual de bien [...]]]></description>
			<content:encoded><![CDATA[<p>El niño Laí es un relato corto que escribió <a href="http://atalaya.blogalia.com/historias/66789">JJ Merelo</a> hace algunos años y que ganó un premio y todo. Yo lo he descubierto ahora porque <a href="http://pjorge.com/2010/05/12/er-nino-lai-y-una-cultura-libre/">PJorge se ha currado una versión en ePub</a> que se ve de maravilla en cualquier cacharrín que sea capaz de leer estos formatos. Se ve igual de bien en Papyre donde lo he leído que en el programa Aldiko para Android.</p>
<p>La historia comienza cuando unos amigos deciden cuál va a ser su proyecto fin de carrera, enlazando una trama donde El niño Laí, un robot que se parece a R2D2 termina siendo torero. Una trama que te atrapa desde el principio y que me leído en una tarde. Y mira que a mi los libros suelen durarme porque los leo muy poquito a poco.</p>
<p>Si quieres echarle un vistazo lo puedes bajar libre y gratuítamente de la web oficial <a href="http://niniolai.mobi/">http://niniolai.mobi/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/06/06/el-nino-lai/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Android 2.1 oficial para HTC Hero</title>
		<link>http://nauj27.com/blog/2010/06/04/android-2-1-oficial-para-htc-hero/</link>
		<comments>http://nauj27.com/blog/2010/06/04/android-2-1-oficial-para-htc-hero/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 12:29:47 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[hero]]></category>
		<category><![CDATA[htc]]></category>
		<category><![CDATA[oficial]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=795</guid>
		<description><![CDATA[Hoy ha salido en Taiwán la versión 2.1 para HTC Hero oficial por parte de HTC. En el momento de escribir esto están saliendo literalmente decenas de versiones rooteadas en el foro de XDA-developers. Más información en mi noticia en bleiraner.com.]]></description>
			<content:encoded><![CDATA[<p>Hoy ha salido en Taiwán la versión 2.1 para HTC Hero oficial por parte de HTC. En el momento de escribir esto están saliendo literalmente decenas de versiones rooteadas en <a href="http://forum.xda-developers.com/forumdisplay.php?f=512">el foro de XDA-developers</a>. Más información en <a href="http://www.bleiraner.com/2010/06/04/android-2-1-oficial-para-htc-hero/">mi noticia en bleiraner.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/06/04/android-2-1-oficial-para-htc-hero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color Picker 1.1</title>
		<link>http://nauj27.com/blog/2010/05/29/color-picker-1-1/</link>
		<comments>http://nauj27.com/blog/2010/05/29/color-picker-1-1/#comments</comments>
		<pubDate>Sat, 29 May 2010 19:26:34 +0000</pubDate>
		<dc:creator>nauj27</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[color]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://nauj27.com/blog/?p=782</guid>
		<description><![CDATA[Acabo de subir al Android Market la versión 1.1 de Color Picker. Esta versión elimina los mensajes de debug internos, lo cual debería dar un poco más de fluidez, además de incorporar varios idiomas: inglés, alemán y español.]]></description>
			<content:encoded><![CDATA[<p>Acabo de subir al Android Market la versión 1.1 de <a href="http://nauj27.com/blog/2010/04/28/color-picker/">Color Picker</a>. Esta versión elimina los mensajes de debug internos, lo cual debería dar un poco más de fluidez, además de incorporar varios idiomas: inglés, alemán y español.</p>
]]></content:encoded>
			<wfw:commentRss>http://nauj27.com/blog/2010/05/29/color-picker-1-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

