View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

Desarrollando para Android

Enlaces: Howto de instalación en un s5





Tuesday, 29 January 2019, 10:43:41 am
Genero un nuevo proyecto: videovoewtest Para probar si se visualiza bien en un videoView el resultado de hacer realtime transcoding con el ffpeg.

cd ~/android
. env.sh
android create project --gradle --gradle-version 1.3.1  --package es.sicosoft.videoviewtest --activity VideoViewTestActivity --target android-19 --path videoviewtest
cd videoviewtest
sed -i "s/runProguard false/minifyEnabled false/g" build.gradle 
sed -i "s/com.android.tools.build:gradle:[0-9.]*/com.android.tools.build:gradle:1.3.1/g" build.gradle
sed -i "/distributionUrl/d" gradle/wrapper/gradle-wrapper.properties
echo 'distributionUrl=http\://services.gradle.org/distributions/gradle-2.2-all.zip' >> gradle/wrapper/gradle-wrapper.properties
cat > compila.sh <<'EOF'
#!/bin/bash
. ../env.sh 2>/dev/null
./gradlew clean installDebug
EOF
cat > start.sh <<'EOF'
#!/bin/bash
adb shell input keyevent KEYCODE_WAKEUP
adb shell input swipe 300 1000 300 100
adb shell am start -n es.sicosoft.videoviewtest/es.sicosoft.videoviewtest.VideoViewTestActivity
EOF
chmod a+x compila.sh start.sh


Wednesday, 24 October 2018, 11:06:05 am
Información sobre android.os.NetworkOnMainThreadException Resulta que no se puede... ver:

Al final, la solución para el PortProbe es la siguiente:

package es.sicosoft.portprobe;

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

public class PortProbeActivity extends Activity
{
    String res="";
    TextView t;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(es.sicosoft.portprobe.R.layout.main);
        t = (TextView)findViewById(es.sicosoft.portprobe.R.id.TextView);
        t.setText((CharSequence) "Results:\n"+res); 
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try  {
                    res=es.sicosoft.PortProbe.PortProbe("3.0.1.3");
                    runOnUiThread(new Runnable() {
                        public void run() {
                            t.setText((CharSequence) "Results:\n"+res);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }
}



Tuesday, 23 October 2018, 9:08:39 am
Genero un nuevo proyecto: portprobe Para comprobar que los puertos que necesitamos están abiertos. Para arreglar el error de "Could not create plugin of type 'AppPlugin'" he actualizado la versión de gradle del proyecto. Para el script de arranque de la aplicación, he usado este howto para arrancarla, este para encender la pantalla y este para desbloquearla.
cd ~/android
. env.sh
android create project --gradle --gradle-version 1.3.1  --package es.sicosoft.portprobe --activity PortProbeActivity --target android-19 --path portprobe
cd portprobe
sed -i "s/runProguard false/minifyEnabled false/g" build.gradle 
sed -i "s/com.android.tools.build:gradle:[0-9.]*/com.android.tools.build:gradle:1.3.1/g" build.gradle
sed -i "/distributionUrl/d" gradle/wrapper/gradle-wrapper.properties
echo 'distributionUrl=http\://services.gradle.org/distributions/gradle-2.2-all.zip' >> gradle/wrapper/gradle-wrapper.properties
cat > compila.sh <<'EOF'
#!/bin/bash
. ../env.sh 2>/dev/null
./gradlew clean installDebug
EOF
cat > start.sh <<'EOF'
#!/bin/bash
adb shell input keyevent KEYCODE_WAKEUP
adb shell input swipe 300 1000 300 100
adb shell am start -n es.sicosoft.portprobe/es.sicosoft.portprobe.PortProbeActivity
EOF
chmod a+x compila.sh start.sh


Wednesday, 26 September 2018, 10:15:36 am
Actualizar remotamente el apk de un S5 Se hace de la siguiente manera (ejemplo para garcía noblejas):

1. Se pone el nuevo tcm en tctiservermoncloa:/home/metro/tctiserver/files
metro@tctiservermoncloa:~/tctiserver$ ls -l /home/metro/tctiserver/files/tcm*apk
-rw-r--r-- 1 metro metro 5639017 sep 25 11:19 /home/metro/tctiserver/files/tcm2-1.7.20180717.apk
metro@tctiservermoncloa:~/tctiserver$ cd files
metro@tctiservermoncloa:~/tctiserver/files$ sha256sum tcm2-1.7.20180717.apk
0ed23549903ffcb7e3d946714860b7001d0a90a1faef11e85d89c65c4ccb6866  tcm2-1.7.20180717.apk


2. Se mira la IP actual del equipo:
cd /home/metro/tctiserver
grep noble *.cfg
# auth_linea7.cfg:84:38:38:a3:5a:b9 354734061773467 s5.1332gnoblejas 07041 - @60704
tail -f tctiserver.log | grep 84:38:38:a3:5a:b9
# Wed Sep 26 09:50:22 2018 (UDPD): Terminal -1(17.255.18.42,?,?): Mensaje UDP "alarminfo TcmAlarmas:Android:1.2+19.1.5.20170221@00:19:56:ac:65:61 84:38:38:a3:5a:b9 17.196.58.10 00000000001537946488563487-0001"
#Wed Sep 26 09:50:22 2018 (UDPD): Terminal 138(17.255.18.42,84:38:38:a3:5a:b9,s5.1332gnoblejas): Recibido "alarminfo TcmAlarmas:Android:1.2+19.1.5.20170221@00:19:56:ac:65:61 84:38:38:a3:5a:b9 17.196.58.10 00000000001537946488563487-0001 "
^C


3. Se conecta al equipo y se actualiza:
nc 17.255.18.42 10005
# id 84:38:38:a3:5a:b9 TcmAlarmas:Android:1.2+19.1.5.20170221@00:19:56:ac:65:61 17.196.58.10 00000000001537948957437240-0001
installreboot tcm2-1.7.20180717.apk
# +installreboot
# 0ed23549903ffcb7e3d946714860b7001d0a90a1faef11e85d89c65c4ccb6866  /data/local/tmp/package.apk


4. Se comprueba que se ha actualizado correctamente:
metro@tctiservermoncloa:~/tctiserver$ grep oble *cfg
auth_linea7.cfg:84:38:38:a3:5a:b9 354734061773467 s5.1332gnoblejas 07041 - @60704
metro@tctiservermoncloa:~/tctiserver$ tail -f tctiserver.log | grep 84:38:38:a3:5a:b9
Wed Sep 26 10:07:03 2018 (UDPD): Terminal 138(17.255.18.42,84:38:38:a3:5a:b9,s5.1332gnoblejas): Recibido "alarminfo TcmAlarmas:Android:1.2+22.1.7.20180717#ADqYNQEB28ABlWrGVh2cxHFUG0oY40ADqYV4hh42@00:3a:98:35:01:01 84:38:38:a3:5a:b9 17.196.58.10 00000000001537948957437240-0001 "
Wed Sep 26 10:07:12 2018 (UDPD): Terminal -1(17.255.18.42,?,?): Mensaje UDP "alarminfo TcmAlarmas:Android:1.2+22.1.7.20180717#ADqYNQEB36ABlWrGVh35xHFUG0oY43ADqYV4hh48@00:3a:98:35:01:01 84:38:38:a3:5a:b9 17.196.58.10 00000000001537948957437240-0001"
Wed Sep 26 10:07:12 2018 (UDPD): Terminal 138(17.255.18.42,84:38:38:a3:5a:b9,s5.1332gnoblejas): Recibido "alarminfo TcmAlarmas:Android:1.2+22.1.7.20180717#ADqYNQEB36ABlWrGVh35xHFUG0oY43ADqYV4hh48@00:3a:98:35:01:01 84:38:38:a3:5a:b9 17.196.58.10 00000000001537948957437240-0001 "
^C


Thursday, 13 September 2018, 10:40:38 am
Preparo un entorno de compilación para poder hacer modificaciones ne l aaplicación de Android 4.4 (Desire C) En dario@uiharu:~/android/tcm2-android44/src.hecl

Genero un nuevo debug-key ya que la antigua estaba expirada Con clave android, siguiendo este tutorial
cd ~/android/tcm2-android44/src.hecl
mv debug.keystore debug-old.keystore
keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000


NOTA: hay que hacer algo más para que funcione


Tuesday, 17 July 2018, 9:35:26 am
Problema de compilación del tcm en android
dario@uiharu:~/android/tcm2$ ./compila.sh 
22 1.7.20180717 21 1.6.20170508
version: manifest2gradle
Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

* Where:
Build file '/home/dario/android/tcm2/cardview/build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':cardview'.
> Failed to apply plugin [id 'com.android.library']
   > Gradle version 2.2 is required. Current version is 3.2.1. If using the gradle wrapper, try editing the distributionUrl in /home/dario/.gradle/daemon/3.2.1/gradle/wrapper/gradle-wrapper.properties to gradle-2.2-all.zip
...


El problema está documentado en esta thread.

He hecho lo siguiente:
mkdir -p /home/dario/.gradle/daemon/3.2.1/gradle/wrapper/
touch /home/dario/.gradle/daemon/3.2.1/gradle/wrapper/gradle-wrapper.properties
sed -i "/distributionUrl/d" /home/dario/.gradle/daemon/3.2.1/gradle/wrapper/gradle-wrapper.properties
echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip' >> /home/dario/.gradle/daemon/3.2.1/gradle/wrapper/gradle-wrapper.properties
sed -i 's/com.android.tools.build:gradle:1.3.0/com.android.tools.build:gradle:1.5.0/g" build.gradle


Después he matado al demonio de gradle que estaba ejecutándose en 2o plano y vuelto a ejecutar el ./compila.sh


Al final he ehco un downgrade del gradle en uiharu.

Es un poco difícil por no saber cómo hacer un downgrade con el apt-get, pero a base de prueba y error... al final lo he hecho así:
dpkg -r libmaven3-core-java
dpkg -i /var/cache/apt/archives/gradle_1.5-2_all.deb /var/cache/apt/archives/libgradle-core-java_1.5-2_all.deb /var/cache/apt/archives/libgradle-plugins-java_1.5-2_all.deb /var/cache/apt/archives/libjaffl-java_0.5.9-5_all.deb /var/cache/apt/archives/libjnr-posix-java_1.1.8-2_all.deb
cd /var/cache/apt/archives/
dpkg -i /var/cache/apt/archives/libmaven-ant-tasks-java_2.1.3-3_all.deb /var/cache/apt/archives/libcodenarc-groovy-java_0.17-2_all.deb
dpkg -i libgmetrics-groovy-java_0.5-1_all.deb
dpkg -i /var/cache/apt/archives/gradle_1.5-2_all.deb /var/cache/apt/archives/libgradle-core-java_1.5-2_all.deb /var/cache/apt/archives/libgradle-plugins-java_1.5-2_all.deb /var/cache/apt/archives/libjaffl-java_0.5.9-5_all.deb /var/cache/apt/archives/libjnr-posix-java_1.1.8-2_all.deb
dpkg -i libjetty-extra-java libjetty-java_6.1.26-4_all.deb  libservlet2.5-java_6.0.45+dfsg-1~deb8u1_all.deb 
dpkg -i libjetty-extra-java_6.1.26-4_all.deb libjetty-java_6.1.26-4_all.deb  libservlet2.5-java_6.0.45+dfsg-1~deb8u1_all.deb 
dpkg -i libmx4j-java_3.0.2-14_all.deb libtomcat7-java_7.0.56-1_all.deb libgeronimo-jta-1.1-spec-java_1.1.1-3_all.deb 
dpkg -i libservlet3.0-java_7.0.56-3+deb8u11_all.deb 
dpkg -i /var/cache/apt/archives/gradle_1.5-2_all.deb /var/cache/apt/archives/libgradle-core-java_1.5-2_all.deb /var/cache/apt/archives/libgradle-plugins-java_1.5-2_all.deb /var/cache/apt/archives/libjaffl-java_0.5.9-5_all.deb /var/cache/apt/archives/libjnr-posix-java_1.1.8-2_all.deb
dpkg -i libconstantine-java_0.7-6_all.deb 
dpkg -r libjnr-constants-java
dpkg -i /var/cache/apt/archives/gradle_1.5-2_all.deb /var/cache/apt/archives/libgradle-core-java_1.5-2_all.deb /var/cache/apt/archives/libgradle-plugins-java_1.5-2_all.deb /var/cache/apt/archives/libjaffl-java_0.5.9-5_all.deb /var/cache/apt/archives/libjnr-posix-java_1.1.8-2_all.deb
dpkg -i libconstantine-java_0.7-6_all.deb 
dpkg -i libjnr-posix-java_1.1.8-2_all.deb 
dpkg -i /var/cache/apt/archives/gradle_1.5-2_all.deb /var/cache/apt/archives/libgradle-core-java_1.5-2_all.deb /var/cache/apt/archives/libgradle-plugins-java_1.5-2_all.deb /var/cache/apt/archives/libjaffl-java_0.5.9-5_all.deb /var/cache/apt/archives/libjnr-posix-java_1.1.8-2_all.deb
dpkg -i libcodenarc-groovy-java_0.17-2_all.deb libgradle-core-java_1.5-2_all.deb libjetty-extra-java_6.1.26-4_all.deb 
dpkg -r libnative-platform-java_0.11-5_all.deb 
dpkg -i libnative-platform-java_0.3~rc2-3_all.deb 
dpkg -i libcodenarc-groovy-java_0.17-2_all.deb libgradle-core-java_1.5-2_all.deb libjetty-extra-java_6.1.26-4_all.deb 
dpkg -i libtomcat7-java_7.0.56-1_all.deb 
dpkg -i libcodenarc-groovy-java_0.17-2_all.deb libgradle-core-java_1.5-2_all.deb libjetty-extra-java_6.1.26-4_all.deb 
ls | grep maven
dpkg -i maven_3.0.5-3_all.deb 
dpkg -i libaether-java_1.13.1-2_all.deb libsisu-guice-java_3.2.4-1_all.deb libsisu-ioc-java_2.3.0-5_all.deb 
dpkg -i libasync-http-client-java_1.6.5-3_all.deb 
dpkg -i libnetty-java_1%3a3.2.6.Final-2_all.deb 
dpkg -i libasync-http-client-java_1.6.5-3_all.deb 
dpkg -i libasync-http-client-java_1.6.5-3_all.deb 
dpkg -i libaether-java_1.13.1-2_all.deb libsisu-guice-java_3.2.4-1_all.deb libsisu-ioc-java_2.3.0-5_all.deb 
dpkg -i maven_3.0.5-3_all.deb 
dpkg -i libcodenarc-groovy-java_0.17-2_all.deb libgradle-core-java_1.5-2_all.deb libjetty-extra-java_6.1.26-4_all.deb 
dpkg -i /var/cache/apt/archives/gradle_1.5-2_all.deb /var/cache/apt/archives/libgradle-core-java_1.5-2_all.deb /var/cache/apt/archives/libgradle-plugins-java_1.5-2_all.deb /var/cache/apt/archives/libjaffl-java_0.5.9-5_all.deb /var/cache/apt/archives/libjnr-posix-java_1.1.8-2_all.deb


Y luego, en el directorio del tcm2:

 ./gradlew

AL FINAL BASTABA CON LLAMAR A ./gradlew en ./compila.sh (este thread me ha dado la pista).

Monday, 26 February 2018, 11:45:20 am
Explicación de cómo funcionan los fragmentos (fragments) android_guides: Creating and Using Fragments

Update 20180202: Para la comunicación entre fragmentos o fragmento-actividad se usan interfaces en la actividad: Communicating with Other Fragments

Comunicación Fagment -> Actividad

Se definen así en el fragment:
public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}


Se llaman de la siguiente manera en el fragment:
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Send the event to the host activity
        mCallback.onArticleSelected(position);
    }



Y se implementan en la actividad con esto:
public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}


Comunicación Actividad -> Fragment

Es más sencillo, ya que basta con buscar el fragmento por id usando el fragment manager y luego llamar a los métodos del fragmento directamente.
public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}


Monday, 19 February 2018, 11:58:06 am
Copiando un partición desde un tlf que admine el towelroot (4.4.2) Con ayuda de este thread

Se hace desde uiharu.

1. Se instala el towelroot
cd /data/android/s5_cd/cd1/adb/
adb uninstall com.geohot.towelroot
adb install tr.apk 


2. Se ejecuta con conexion a red para obtener root

3. Se instala un busybox:
adb shell
su
cd /sns
mkdir tmp
chmod 777 tmp
chown shell tmp
exit
exit
adb push /home/dario/android/s5_1/001_root/t/system/xbin/busybox /sns/tmp/


4. Se mira la IP wifi del terminal y se pone a escuchar
adb shell
su
/sns/tmp/busybox ifconfig
cat /dev/block/platform/msm_sdcc.1/by-name/userdata | /sns/tmp/busybox nc -l -p 8080


5. En otra ventana, se obtiene el fichero
nc 192.168.0.103 8080 > imagen.img


Y a esperar a que termine la transferencia por el wifi.

Wednesday, 14 February 2018, 9:08:14 am
Desactivo el advanced profiling en el android studio de WILLYPC Ya que me estaba dando este error:
No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId

Y la solución:
La solución es deshabilitar esa opción en:
Run Configurations > Profiling > Destildar enable advance profiling


Tuesday, 13 February 2018, 8:51:52 am
IPC síncrona en android: bound services Resulta que android sí soporta IPC síncrona (Synchronous IPC), pero hay que usar bound services (example) (teoría).

UPDATE 20180220: Hay dos ejemplos completos y funcionales de cliente y servidor usando el binder.

Wednesday, 22 November 2017, 8:56:48 am
Por qué Android es capaz de hacer un scan de redes wifi periódico aún estando conectado Vamos la razón por la que el WifiAnalizer funciona en android:

Es por la ¿ioctl? GSCAN de los drivers WiFi de Android: How Google intentionally hampers the mobile experience (XDA).

Tuesday, 21 March 2017, 11:39:01 am
TCTISERVER a Android: Notas sobre los códigos de error HTTP para el protocolo JSON REST API Error Codes 101 Básicamente recomiendan mandar un código http 400 si estás mandando un mensaje de error (por culpa del cliente), en vez del clásico 200 (found). Y un código 404 (Not Found) si es un mensaje no reconocido.
Sin embargo algunos dicen que si respondes un mensaje de error, seguir mandando un 200 en vez de un 400 porque la petición sí ha cursado hasta el servidor...

Lo recomendado es:
  • 200 - OK
  • 400 - Bad Request (Client Error) - A json with error/more details should be returned to the client.
  • 401 - Unauthorized - Client has not passed correctly the login/pass or other auth request; auth token is not valid anymore
  • 403 - Forbidden - The current authorization does not cover this API
  • 500 - Internal Server Error


Wednesday, 15 March 2017, 9:21:46 am
Native SIP Client en el S7 Han quitado las opciones de menú, pero se puede abrir la configuración del native SIP client "a mano":
am start -n com.android.phone/com.android.phone.settings.PhoneAccountSettingsActivity


Hay más settings en:
am start -n com.android.phone/com.android.phone.CallFeaturesSetting




Friday, 10 March 2017, 9:45:27 am
Problemas en el tcm2 por culpa de las peticiones http: las hace "en serie" El problema es HttpUrlConnection/HttpClient hace las peticiones en serie (habría que usar el executor interface para arreglarlo).

Thursday, 9 March 2017, 11:45:45 am
Hacer un "drop-down menu" usando un botón

Wednesday, 8 March 2017, 12:34:04 pm
Hacer un spinner con imágenes Hay que hacer un adaptador, pero por lo demás no es muy difícil

Friday, 3 March 2017, 11:02:44 am
Editor de layouts Android en HTML5 Por si no usas el editor del Android Studio: http://labs.udacity.com/android-visualizer/

Thursday, 2 March 2017, 11:51:52 am
Sobre el long-press en las notificaciones Este post me ha puesto sobre la pista de dónde se manejan los long-press, que resulta ser en el SwipeHelper.java>https://github.com/android/platform_frameworks_base/blob/master/packages/SystemUI/src/com/android/systemui/SwipeHelper.java. Sólo falta saber quién usa este helper para poner lo de info...

Parece ser especialemte interesante NotificationStackScrollLayout.java:
 ./smali/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.smali:510 ...setLongPressListener...

Finalmente, el manejo de LongPress en la notificación está en BaseStatusBar.java
    protected SwipeHelper.LongPressListener getNotificationLongClicker() {
        return new SwipeHelper.LongPressListener() {
            @Override
            public boolean onLongPress(View v, final int x, final int y) {
                if (!(v instanceof ExpandableNotificationRow)) {
                    return false;
                }
                if (v.getWindowToken() == null) {
                    Log.e(TAG, "Trying to show notification guts, but not attached to window");
                    return false;
}
...


Eso está implementado en los siguientes smali (editado para poner los números de línea):
dario@uiharu:~/android/smali/s5_modnotifications/SystemUI$ rgrep getNotificationLongClicker .
./smali/com/android/systemui/statusbar/BaseStatusBar.smali:7169: .method protected getNotificationLongClicker()Lcom/android/systemui/SwipeHelper$LongPressListener;
./smali/com/android/systemui/statusbar/BaseStatusBar$11.smali:11:    value = Lcom/android/systemui/statusbar/BaseStatusBar;->getNotificationLongClicker()Lcom/android/systemui/SwipeHelper$LongPressListener;



Friday, 24 February 2017, 8:56:23 am
Protocolos: Cómo securizar un protocolo (artículo por 1password) Three layers of encryption keeps you safe when SSL/TLS fails

Friday, 17 February 2017, 11:38:15 am
S5: Screenshots Se controla desde

La implementaciçon del handler (que es lo que tengo que modificar) está en:
 ~/android/smali/s5_modnotifications/SystemUI/smali/com/android/systemui/screenshot/TakeScreenshotService\$1.smali

Tuesday, 14 February 2017, 12:02:37 pm
Wake up device programmatically En este thread. Requiere permisos adicionales.

Friday, 3 February 2017, 3:18:52 pm
Comprobado el procedimiento para actualizar remotamente usando el nuevo TCM

Para el SecContacts:
1. Se lleva el SecContacts.apk a metro@tctiservermoncloa:~/tctiserver/files

2. Se conecta a la IP del teléfono y se hace lo siguiente para el SecContacts:
$ nc 192.168.0.110 10005
download SecContacts.apk
$ nc 192.168.0.110 10005
shell
su
busybox sh -i
mount -o rw,remount /system
cp /data/local/tmp/SecContacts.apk.orig /system/priv-app/SecContacts/SecContacts.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SecContacts@SecContacts.apk@classes.dex
sync
reboot


Y una vez que ha rearrancado se hace lo siguiente para el SystemUI.apk (NOTA: se pueden hacer los dos a la vez con un solo reboteado, de la manera obvia):
nc 192.168.0.110 10005
download SystemUI.apk
nc 192.168.0.110 10005
shell
su
busybox sh -i
mount -o rw,remount /system
cp /data/local/tmp/SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SystemUI@SystemUI.apk@classes.dex
sync
mount -o remount /data
reboot


Friday, 3 February 2017, 1:54:51 pm
Ejecutando un script en el arranque Tutorial para CM.

CM: Básicamente, en el archivo de sistema "/etc/init.d/20userinit" se especifica que se ejecuta en el arranque el script /data/local/userinit.sh (al menos en CM).

Para AOSP, es un poco diferente, ya que se usa el /init.rc.

Friday, 3 February 2017, 11:55:26 am
Hago un nuevo proyecto llamado updatehelper
cd ~/android
. env.sh
android create project --gradle --gradle-version 1.3.1  --package es.sicosoft.updatehelper --activity UpdateHelper --target android-19 --path updatehelper
cd updatehelper/
sed -i "s/runProguard false/minifyEnabled false/g" build.gradle 


Para la parte de instalar, ver post sobre pm-install y código fuente del adb.
FUN FACT: el adb sube primero el fichero a /data/local/tmp y luego lo instala (vamos, igual que lo que estaba haciendo yo).

NOTA: Hay que activarlo antes de que empiece a recibir broadcasts (google incorporó el modo "stopped" en android 3.1). Para activarlo hay que arrancarlo, o, en nuestro caso, hacer un broadcast dirigido a él:
 adb shell "am broadcast -n es.sicosoft.updatehelper/es.sicosoft.updatehelper.UpdateHelper"

Ahora solo falta saber cómo autorizarle para poner root al tcm2 recién instalado (parece difícil. En dicho post hay algo interesante pero no relacionado; para saber el directorio de una aplicación se puede hacer un:

 pm path nombrepaquete

p.ej.:

 pm path eu.chainfire.supersu


Friday, 3 February 2017, 9:18:14 am
Para conceder permisos de root a un nuevo proceso hay que hacer un "unhide" del supersu
root@klte:/ # pm unhide eu.chainfire.supersu
Package eu.chainfire.supersu new hidden state: false
# (aqui se intenta hacer una cosa de root con el TcmAlarmas)
root@klte:/ # pm hide eu.chainfire.supersu                                     
Package eu.chainfire.supersu new hidden state: true


Y para lanzar un intent:

adb shell am broadcast -a "sicosoft.tcm.POSTINSTALL"


Thursday, 26 January 2017, 8:59:30 am
Un descompilador de apk/smali (apk->smali->java) He instalado el smali2java:


Cómo instalar el Java en el wine (información en el swiki).

(he seguido lo de instalar ie8 del primer enlace y luego la instación manual del 2o., por último el poner el path del primero)

Está instalado en:
 uiharu:/data/android/smali2java/Smali2Java

Y se arranca con "./go.sh"

UPDATE 20170126: Resulta que esta herramienta está un poco antiguada. Según este thread sobre decompilación, la más adecuada en estos momentos es jadx. La instalo en
 uiharu:/data/android/smali2java/jadx

Tuesday, 24 January 2017, 10:08:28 am
Ejecutar un apk sin instalarlo Resulta que se puede hacer usando DroidPlugin. Fuente: Ars comment

Friday, 20 January 2017, 11:23:40 am
S5: Problemas para modificar SecContacts.apk Es un problema conocido

Siguiendo las instrucciones de dicho post, he hecho el siguiente script que hay que ejecutar antes de subir el apk al teléfono:
 fix-apk.sh
#!/bin/bash
cd /data/android/smali/s5_modcontacts || exit 1
rm -rf t
mkdir -p t/orig t/new
( cp SecContacts.apk.orig t/orig/SecContacts.apk )
( cd t/new && unzip ../../SecContacts/dist/SecContacts.apk )
( cd t/new && rm -rf res/raw )
( cd t/new && zip -pr ../orig/SecContacts.apk res classes.dex )
cp t/orig/SecContacts.apk SecContacts/dist/SecContacts.apk



Thursday, 19 January 2017, 11:49:04 am
Más información sobre el PKM y el mali-tct Working With .pkm and .atc Files

Básicamente son ficheros en formato textura ETC1 para OpenGL

He instalado el programa de ARM MALI que decían en el post anterior en /data/android/

Para arrancarlo:
cd /data/android/Mali_Texture_Compression_Tool_v4.3.0.b81c088_Linux_x64/
./tct


Para que sea más fácil arrancarlo, he hecho un enlace para poder arrancarlo desde cualquier sitio con:
 mali-tct

Desde ahí se pueden abrir ficheros pkm (File->Open).

Thursday, 19 January 2017, 11:06:19 am
Un post con muchos punteros para aprender smali Actualmente uso smali de forma un tanto superficial (cambiar constantes, salir prematuramente de una función, comentar llamadas).

Hay un post con información exhaustiva de recursos para profundizar en el conocimiento de smali. Hay comentarios adicionales del propio JesusFreke (el autor de baksmali).

Otros posts interesantes:

Thursday, 19 January 2017, 10:13:27 am
S5: APK de contactos El objetivo es quitar los siguientes elementos de la agenda/dialer:
  • Quitar el "..." de todas las opciones (tabs)
  • En cada contacto, en el menú "..." dejar solo el eliminar
  • "Poner la foto": quitarlo

El paquete parece ser "SecContacts.apk":
cd /data/android/smali/s5_deodex
./find-string.sh "Mover contactos del dispositivo a"
#./system.orig/priv-app/SecContacts/SecContacts.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)


NOTA: el SecContacts está ofuscado con el ProGuard y eso hace que los métodos,variables y clases anidadas tengan nombres como "a", "b", "c",..,."aa","ab",...(han hecho algo similar a lo de este post de cómo ofuscar con el ProGuard e información adicional sobre la JavaVM, la stack y las autovariables/parámetros de una función y como utilizar los descompiladores JD-GUI y Procyon).

Preparo para modificar:
mkdir /data/android/smali/s5_modcontacts
cd /data/android/smali/s5_modcontacts
cp ../s5_deodex/system/framework/framework-res.apk .
cp ../s5_deodex/system/framework/twframework-res.apk .
cp ../s5_deodex/system/priv-app/SecContacts/SecContacts.apk .
apktool-samsung if framework-res.apk
apktool-samsung if twframework-res.apk
apktool-samsung d SecContacts.apk
mv SecContacts.apk SecContacts.apk.orig
cp ../s5_modtelephony/hexid2string.sh.Telecom hexid2string.sh.SecContacts
sed -i "s/Telecom/SecContacts/g" hexid2string.sh.SecContacts


Parece que está por código, específicamente en SecContacts/smali/com/samsung/contacts/interactions/dp.smali y también en el menú SecContacts/res/menu/people_options.xml :
rgrep "Mover contactos del dispositivo a" SecContacts | grep es-rES
#SecContacts/res/values-es-rES/strings.xml:    <string name="dialog_title_move_device_contacts">Mover contactos del dispositivo a</string>
#SecContacts/res/values-es-rES/strings.xml:    <string name="menu_merge">Mover contactos del dispositivo a</string>
rgrep menu_merge SecContacts | grep -v strings.xml
rgrep menu_merge\" SecContacts | grep -v strings.xml
#SecContacts/res/values/public.xml:    <public type="string" name="menu_merge" id="0x7f0f02cf" />
#SecContacts/res/menu/people_options.xml:    <item android:id="@id/menu_merge_accounts" android:visible="false" android:title="@string/menu_merge" />
rgrep 7f0f02cf SecContacts | grep -v public.xml
#SecContacts/smali/com/samsung/contacts/interactions/dp.smali:    const v3, 0x7f0f02cf
rgrep menu_merge_accounts SecContacts
#SecContacts/res/values/public.xml:    <public type="id" name="menu_merge_accounts" id="0x7f0c03e0" />
#SecContacts/res/values/ids.xml:    <item type="id" name="menu_merge_accounts">false</item>
#SecContacts/res/menu/people_options.xml:    <item android:id="@id/menu_merge_accounts" android:visible="false" android:title="@string/menu_merge" />
rgrep 0x7f0c03e0 SecContacts
#SecContacts/smali/com/samsung/contacts/impl/aw.smali:    const v0, 0x7f0c03e0
#SecContacts/smali/com/samsung/contacts/d/a/d.smali:    const v2, 0x7f0c03e0
#SecContacts/res/values/public.xml:    <public type="id" name="menu_merge_accounts" id="0x7f0c03e0" />


Pero eso lleva a un callejón sin salida.

AÑADIR FOTO:

Otra parte más sencilla de modificar parece el icono de añadir foto al editar un contacto:
  • El icono que pone cuando no se ha subido foto es: contacts_btn_add.pkm (0x7f0200a6)
  • Eso se usa en SecContacts/smali/com/android/contacts/editor/PhotoEditorView.smali
  • La variable miembro en el que se usa es un View con nombre "a" (parece que este fuente está ofuscado, porque las valiables/métodos se llaman a, b, c, ...)
  • En la línea 412, antes del setEnabled, pruebo a hacer un "const/4 v1, 0x0", pero sigue sacando el popup :-/.

En SecContacts/smali/com/android/contacts/editor/PhotoEditorView.smali borro el setOnClickListener:
  960     invoke-direct {v1, p0}, Lcom/android/contacts/editor/cn;-><init>(Lcom/a     ndroid/contacts/editor/PhotoEditorView;)V
  961 
- 962     invoke-virtual {v0, v1}, Landroid/view/View;->setOnClickListener(Landro     id/view/View$OnClickListener;)V
  963 
  964     .line 129


MENU DE DETALLES DEL CONTACTO

Aunque el menú está definido en "SecContacts/res/menu/view_contact.xml", no es suficiente con olcultarlos ahí, ya que después pone la visibilidad por código en "SecContacts/smali/com/android/contacts/detail/ContactLoaderFragment.smali". Como la vibilibilidad de cada elemento la establece según el valor de una variable miebro boolean, lo que hago es sobreescribir el valor leido de la variable por 0x0, a partir de menu_link_contact.

Modifico el fichero poniendo un "0x0" en v1 antes de hacer el SetVisible() en los sitios que corresponden a los menús que quiero quitar:

 SecContacts/smali/com/android/contacts/detail/ContactLoaderFragment.smali
 4625 .method public onPrepareOptionsMenu(Landroid/view/Menu;)V
...
# menu_refresh 7f0c03fe
 4655     iget-boolean v1, p0, Lcom/android/contacts/detail/ContactLoaderFragment     ;->r:Z
 4656 
 4657     invoke-interface {v0, v1}, Landroid/view/MenuItem;->setVisible(Z)Landro     id/view/MenuItem;
...
# menu delete 7f0c038d
 4667     iget-boolean v1, p0, Lcom/android/contacts/detail/ContactLoaderFragment     ;->s:Z
 4668 
 4669     invoke-interface {v0, v1}, Landroid/view/MenuItem;->setVisible(Z)Landro     id/view/MenuItem;
...
# menu_link_contact 7f0c03ff
 4679     iget-boolean v1, p0, Lcom/android/contacts/detail/ContactLoaderFragment     ;->t:Z
 4680 
+4681     const v1, 0x0
+4682 
 4683     invoke-interface {v0, v1}, Landroid/view/MenuItem;->setVisible(Z)Landro     id/view/MenuItem;
...
# menu_separate_contact 7f0c0400
 4693     iget-boolean v1, p0, Lcom/android/contacts/detail/ContactLoaderFragment     ;->u:Z
 4694 
+4695     const v1, 0x0
+4696 
 4697     invoke-interface {v0, v1}, Landroid/view/MenuItem;->setVisible(Z)Landro     id/view/MenuItem;
...
#(y lo mismo con todos los setVisible del fichero a partir de esta posición)


MENU DE DETALLES DE REGISTRO DE LLAMADAS

Quito el menu_send_number y el menu_add_reject_list:

 SecContacts/smali/com/samsung/contacts/d/a/a.smali
 438     .line 113
 439     :cond_7
-440     const/4 v1, 0x1
+440     const/4 v1, 0x0
 441 
 442     invoke-interface {v6, v1}, Landroid/view/MenuItem;->setVisible(Z)Landroid/view/MenuItem;
...
 462     .line 119
-463     const/4 v1, 0x1
+463     const/4 v1, 0x10
 464 
 465     invoke-interface {v7, v1}, Landroid/view/MenuItem;->setVisible(Z)Landroi    d/view/MenuItem;


MENU DEL DIALER

Quito el menu_settings y el menu_speed_dial:

 SecContacts/smali/com/samsung/contacts/d/a/d.smali
 823     invoke-virtual {v2, v10}, Landroid/widget/ImageView;->setVisibility(I)V
 824 
 825     .line 144
-826     const/4 v2, 0x1
+826     const/4 v2, 0x0
 827 
 828     move-object/from16 v0, v21
 829 
 830     invoke-interface {v0, v2}, Landroid/view/MenuItem;->setVisible(Z)Landro     id/view/MenuItem;
 831 
+832     const/4 v2, 0x1
 833     .line 151
 834     move-object/from16 v0, p0
...
 891     if-nez v2, :cond_a
 892 
-893     const/4 v2, 0x1
+893     const/4 v2, 0x0
 894 
 895     :goto_1
 896     invoke-interface {v4, v2}, Landroid/view/MenuItem;->setVisible(Z)Landro     id/view/MenuItem;


SELECTOR DE MELODIAS

El diálogo de cambiar melodía tiene un botón con "Añadir", que resulta ser el id "ringtone_add" 0x7f0f03c7. Con eso obtengo el lugar en donde se prepara dicho cuadro de diálogo, que es "SecContacts/smali/com/android/contacts/k.smali".

Quito que aparezca el selector, haciendo que salga de la rutina sin preparar el diálogo ni devolver el intent:

SecContacts/smali/com/android/contacts/k.smali
 3969     .prologue
 3970     const/4 v3, 0x1
 3971 
+3972     const/4 v0, 0x0
+3973     return-object v0
 3974     .line 538
 3975     if-nez p0, :cond_0


Recompilar e instalar el SecContacts modificado:

cd /data/android/smali/s5_modcontacts
apktool-samsung b SecContacts
./fix-apk.sh
adb push SecContacts/dist/SecContacts.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/SecContacts.apk /system/priv-app/SecContacts/SecContacts.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SecContacts@SecContacts.apk@classes.dex
sync
mount -o remount /data
reboot



Restaurar el SecContacts original
cd /data/android/smali/s5_modcontacts
adb push SecContacts.apk.orig /sdcard/SecContacts.apk
adb shell
su
mount -o rw,remount /system
cp /sdcard/SecContacts.apk /system/priv-app/SecContacts/SecContacts.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SecContacts@SecContacts.apk@classes.dex
sync
mount -o remount /data
reboot



Wednesday, 18 January 2017, 10:27 am
Significado de los "$" en los nombres de clases Resulta que son accessors para los elementos de la clase padre desde la clase anidada. Esto es necesario porque la JVM no soporta clases anidadas (sólo clases globales). Se les llama "bridge methods" y se distinguen por el "static synthetic". Fuente: What is the meaning of “static synthetic”?. Synthetic and bridge methods.

Thursday, 12 January 2017, 10:51:15 am
Es posible que las llamadas de emergencia se puedan desactivar en el móvil Según esta thread está en Aplicaciones > Teléfono > Menú (...) > Ajustes > Ajustes de llamada > Prohibicion de llamadas. Lo he mirado en el S7 y no se pueden desactivar las llamadas de emergencia mediante menú.

Thursday, 12 January 2017, 10:24:07 am
S5: APK de la parte de telefonía: Telecom.apk Tal y como dicen en esta thread, y también visto con un zgrep:
$ find . -name "*.apk" | while read l ; do echo -n "$l:" ; zipgrep -H "Desactiva el modo.*para realizar llamadas" "$l" ; echo "" ; done | grep "." | grep -v ":\$" 
./system.orig/priv-app/Telecom/Telecom.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)
./system.orig/priv-app/TeleService/TeleService.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)
./system/priv-app/Telecom/Telecom.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)
./system/priv-app/TeleService/TeleService.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)
./old/OUTPUT/priv-app/Telecom/Telecom.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)
./old/OUTPUT/priv-app/TeleService/TeleService.apk:resources.arsc:Coincidencia en el fichero binario (entrada estándar)


Para ponerme a modificarla hago lo siguiente:
mkdir /data/android/smali/s5_modtelephony
cd /data/android/smali/s5_modtelephony
cp ../s5_deodex/system/framework/framework-res.apk .
cp ../s5_deodex/system/framework/twframework-res.apk .
cp ../s5_deodex/system/priv-app/Telecom/Telecom.apk .
apktool-samsung if framework-res.apk
apktool-samsung if twframework-res.apk
apktool-samsung d Telecom.apk
mv Telecom.apk Telecom.apk.orig
cp ../s5_deodex/system/priv-app/TeleService/TeleService.apk .
apktool-samsung d TeleService.apk 
mv  TeleService.apk  TeleService.apk.orig


Sobre la cadena, está en la variable incall_error_power_off:
cd /data/android/smali/s5_modtelephony
rgrep "Desactiva el modo A" Telecom TeleService
#Telecom/res/values-es-rES/strings.xml:    <string name="incall_error_power_off">Modo Avión activado. Desactiva el modo Avión para realizar llamadas.</string>
#TeleService/res/values-es-rES/strings.xml:    <string name="incall_error_power_off">Modo Avión activado. Desactiva el modo Avión para realizar llamadas.</string>
rgrep incall_error_power_off Telecom TeleService | grep -v strings.xml
#Telecom/res/values/public.xml:    <public type="string" name="incall_error_power_off" id="0x7f08002a" />
#TeleService/res/values/public.xml:    <public type="string" name="incall_error_power_off" id="0x7f09024a" />
rgrep 7f08002a Telecom ; rgrep 7f09024a TeleService
#Telecom/smali/com/android/server/telecom/secutils/TelecomUtils.smali:    const v0, 0x7f08002a
#Telecom/smali/com/android/server/telecom/secutils/ErrorDialog.smali:        0x7f08002a -> :sswitch_0
#Telecom/smali/com/android/server/telecom/ErrorDialogActivity.smali:    const v2, 0x7f08002a
#Telecom/res/values/public.xml:    <public type="string" name="incall_error_power_off" id="0x7f08002a" />
#TeleService/smali/com/android/phone/CarrierUtils.smali:    const v3, 0x7f09024a
#TeleService/smali/com/android/phone/CallController.smali:    const v0, 0x7f09024a
#TeleService/res/values/public.xml:    <public type="string" name="incall_error_power_off" id="0x7f09024a" />


Hay otro mensaje (el que sale cuando das al 112 con modo avión), que es "Activando radio". Este sale en TeleService:
cd /data/android/smali/s5_modtelephony
rgrep "Activando radio" Tele* | grep es-rES
#TeleService/res/values-es-rES/strings.xml:    <string name="emergency_enable_radio_dialog_message">Activando radio…</string>
rgrep emergency_enable_radio_dialog_message Telecom TeleService | grep -v strings.xml
#TeleService/res/values/public.xml:    <public type="string" name="emergency_enable_radio_dialog_message" id="0x7f09025a" />
rgrep 7f09025a TeleService | grep -v public.xml
#TeleService/smali/com/android/phone/utils/EmergencyRadioOnDialogActivity.smali:    const v1, 0x7f09025a
rgrep EmergencyRadioOnDialogActivity TeleService | grep -v EmergencyRadioOnDialogActivity.smali
#TeleService/AndroidManifest.xml:        <activity android:configChanges="keyboardHidden|orientation|screenSize" android:excludeFromRecents="true" android:launchMode="singleInstance" android:name=".utils.EmergencyRadioOnDialogActivity" android:theme="@style/Empty"/>
#TeleService/smali/com/android/services/telephony/EmergencyCallHelper.smali:    invoke-static {}, Lcom/android/phone/utils/EmergencyRadioOnDialogActivity;->finishEmergencyRadioOnDialog()V
#TeleService/smali/com/android/services/telephony/EmergencyCallHelper.smali:    invoke-static {}, Lcom/android/phone/utils/EmergencyRadioOnDialogActivity;->finishEmergencyRadioOnDialog()V
#TeleService/smali/com/android/services/telephony/EmergencyCallHelper.smali:    invoke-static {}, Lcom/android/phone/utils/EmergencyRadioOnDialogActivity;->finishEmergencyRadioOnDialog()V
#TeleService/smali/com/android/services/telephony/EmergencyCallHelper.smali:    invoke-static {}, Lcom/android/phone/utils/EmergencyRadioOnDialogActivity;->startEmergencyRadioOnDialog()V


TeleService

Para asegurarme que no se puede encender la radio, hago el siguiente cambio a TeleService/smali/com/android/services/telephony/EmergencyCallHelper.smali:
 512 .method private powerOnRadio()V
 513     .locals 4
 514 
 515     .prologue
 516     const/4 v3, 0x0
 517 
+518     return-void
 519     .line 271
 520     const-string v1, "powerOnRadio()."
 521 


Y también cambio el num. de retries de 5 a 0:
+360     const/4 v3, 0x5

 358     iget v2, p0, Lcom/android/services/telephonyEmergencyCallHelper;->mNumR    etriesSoFar:I
 359 
+360     const/4 v3, 0x0
 361 
 362     if-le v2, v3, :cond_1


Y por último cambio el timeout de 5000ms (0x1388) a 1ms:
+639     const-wide/16 v2, 0x1388

639     const-wide/16 v2, 0x1
640 
641     invoke-virtual {v0, v1, v2, v3}, Landroid/os/Handler;->sendEmptyMessageD    elayed(IJ)Z
642 
643     .line 338


Recompilar e instalar el TeleService modificado:

apktool-samsung b TeleService
adb push TeleService/dist/TeleService.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/TeleService.apk /system/priv-app/TeleService/TeleService.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@TeleService@TeleService.apk@classes.dex
sync
mount -o remount /data
reboot


Telecom

Para el dialogo de quitar el modo avión:
 Telecom/smali/com/android/server/telecom/secutils/TelecomUtils.smali
 12139     goto :goto_1
 12140 
 12141     .line 708
 12142     :sswitch_1
+12143     return-void
 12144     const v0, 0x7f08002a
 12145 
 12146     move v10, v1


Recompilar e instalar el Telecom modificado:

apktool-samsung b Telecom
adb push Telecom/dist/Telecom.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/Telecom.apk /system/priv-app/Telecom/Telecom.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@Telecom@Telecom.apk@classes.dex
sync
mount -o remount /data
reboot



Monday, 9 January 2017, 8:33:40 am
Modificando lo del 112 en el S5 El 112 quita el modo avión y activa GSM. Necesitamos que no lo haga, ya que ese número se usa para llegar a seguridad en metro. En principio está en uno de los siguientes:
  • LegacyInCallUI.apk
  • EmergencyModeService.apk
  • EmergencyLauncher.apk
  • SecContacts.apk
  • SecSettings.apk

Preparo un directorio para hacer la modificación:
mkdir /data/android/smali/s5_modseccontacts
cd /data/android/smali/s5_modseccontacts
cp ../s5_deodex/system/framework/framework-res.apk .
cp ../s5_deodex/system/framework/twframework-res.apk .
cp ../s5_deodex/system/priv-app/SecSettings/SecSettings.apk .
apktool-samsung if framework-res.apk
apktool-samsung if twframework-res.apk
apktool-samsung d SecSettings.apk
mv SecSettings.apk SecSettings.apk.orig




Wednesday, 21 December 2016, 11:12:36 am
Reflasheo de los terminales Nexus modernos (p.ej. Nexus 9) Resulta que estos terminales para poder hacer un "fastboot oem unlock" hay que haber habilitado una opción en "Ajustes > Desarrollo". Si no lo has hecho y estás en un bootloop, hay que seguir las instrucciones y ficheros de estos enlaces:


El procedimiento es:

1. Aparato apagado y desconectado
2. VolDown+Power hasta que entre en el bootloader/fastboot
3. Te mueves con VolDown hasta "RECOVERY" y das a power para seleccionar.
4. Aparece el recovery pero con un mensaje de "No command" en mitad de la pantalla
5. Se presiona y se mantiene pulsado Power y se da un click a VolUp, se suelta Power.
6. Saldrá el menú normal de recovery. Te mueves con VolUp/VolDown y se selecciona con Power.
7. Se Hace un "Wipe Cache" (a veces con esto solo se arregla, probar a reiniciar y ver si está arreglado)
8. Se Hace un "Factory reset" (a veces con esto se arregla, también probar a ver si arranca ahora)
9. Se selecciona "Apply update from ADB"
10. En el PC, se hace un sideload de la OTA. Ha de ser una versión igual o mayor que la que tiene el dispositivo (pone la versiçon del dispositivo, así como el tipo de dispositivo en las líneas de arriba de la pantalla de recovery). En nuestro caso:
 adb sideload volantis-ota-nmf26f-de961a3c.zip

Se espera a que termine el flasheo y después se hace un reboot. El terminal hará un arranque normal, que por ser la primera vez tarda muchísimo. Entonces aparecerá el asistente de primer arranque para configurar el terminal.

Thursday, 15 December 2016, 11:24:26 am
Hago un proyecto de prueba pra probar el comportamiento de forceclose repetidos En uiharu:

cd ~/android
. env.sh
android create project --gradle --gradle-version 1.3.1  --package es.sicosoft.forceclosetest --activity ForceCloseTest --target android-19 --path forceclosetest
cd forceclosetest/
sed -i "s/runProguard false/minifyEnabled false/g" build.gradle 


Para introducir el error:
  vi src/main/java/es/sicosoft/forceclosetest/ForceCloseTest.java 
Y añado las dos líneas siguientes justo detrás del "setContentView(R.layout.main);":
        String dummy=null;
        dummy.toLowerCase();


Para compilar e instalar:
cd ~/android
. env.sh
cd forceclosetest
gradle installDebug


UPDATE Resulta que los mensajes de si quieres desinstalar la aplicación son el Smart Manager. Thread con información al respecto. Hay una manera de desactivar los avisos de optimización del smart manager poniendo "sys.config.spcm_db_enable=false" en el build.prop, pero no sé si eso arregla nuestro problema con el force-close.

UPDATE Resulta que si desactivas el Smart Manager (como root), se desactiva también las "estadísticas de la batería". La solución recomendada es quitar sus notificaciones (4.4) y desactivarlo en batería:

Settings > Battery > App Optimization Details > menu > Block Notifications

NOTA: Eso tampoco quita el mensaje de desinstalar :-(


settings >sounds and notifications > App notifications > select smart manager and select hide content on lock screen

then again back to settings go to lockscreen and security >Device security >Disable KNOX active protection and deactivate the anti malware option below KNOX active protection

in lock screen and security go to other security settings > disable send security reports and go down to ussage data access> disable smart manager so after that restart your device



Wednesday, 14 December 2016, 11:12:50 am
Copiar la clave RSA del adb de un equipo a otro, y cómo modificar la lista de equipos autorizados en el teléfono Lo esplican en esta thread.

Para linux basta con copiar los ficheros
 ./.android/adbkey
 ./.android/adbkey.pub
de un ordenador a otro.
En Windows está en "C:/Users/User_name/.android/".

Wednesday, 14 December 2016, 11:09:10 am
Hacer que no se puedan desinstalar aplicaciones en un teléfono Se hace según dicen en esta thread, usando el User Manager. El código que lo implementa es este.


Friday, 2 December 2016, 10:01:55 am
Dónde se guardan los settings de diferentes partes del S.O. De este post (Android 4):


The Settings

General settings:
Settings are mostly stored in the /data subdirectory. If you're looking for something specific, start there.

Built-in apps:
Built-in apps tend to keep their settings in /data/data/com.android.* and /data/data/com.google.android.*
For example:
Contacts: /data/data/com.android.contacts
Email accounts: /data/data/com.android.email
MMS: /data/data/com.android.mms

WiFi:
WiFi settings location depends on the manufacturer, but is generally predictable.
Samsung Galaxy Pocket, S2, S3: /data/misc/wifi/wpa_supplicant.conf
Samsung Tab: /data/wifi/bcm_supp.conf
HTC Desire: /data/misc/wifi/wpa_supplicant.conf
Dell Streak: /data/misc/wifi/wpa.conf
Oneplus 2, 3: /data/misc/wifi/networkHistory.txt

Keyboard configs:
I have had to disable hardware keys, reconfigure layouts, or alter general keyboard behaviour before. The exact file name tends to be different on every phone, but I've found the config files to always be in /system/usr/keylayout/. Be careful, as breaking those could render your phone unusable.

Misc:
Most miscellaneous settings like product information, boot sounds, and enabling / disabling the on-screen nav bar are stored in /system/build.prop. Breaking this config file could bootloop your device.


Monday, 21 November 2016, 10:58:27 am
Acceder al IMEI en Android 6 Obtener el IMEI requiere permisos preguntados en el momento:

AndroidManifest.xml
...
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
...


MainActivity
private static final int PERMISSIONS_REQUEST_READ_PHONE_STATE = 999;

private TelephonyManager mTelephonyManager;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},
                PERMISSIONS_REQUEST_READ_PHONE_STATE);
    } else {
        getDeviceImei();
    }
....

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_PHONE_STATE
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        getDeviceImei();
    }
}

private void getDeviceImei() {

    mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    String deviceid = mTelephonyManager.getDeviceId();
    Log.d("msg", "DeviceImei " + deviceid);
}



Monday, 21 November 2016, 10:47:22 am
Check for Permissions (Android 6) En Android 6 los permisos se piden en el primer uso (igual que se hace en iOS). Se usa el siguiente código para vaeriguar si se tiene permiso:

NOTA: El ejemplo usa snackbars.

public class MainActivity extends SampleActivityBase
        implements ActivityCompat.OnRequestPermissionsResultCallback {

    public static final String TAG = "MainActivity";

    /**
     * Id to identify a camera permission request.
     */
    private static final int REQUEST_CAMERA = 0;

    // Whether the Log Fragment is currently shown.
    private boolean mLogShown;

    private View mLayout;

    /**
     * Called when the 'show camera' button is clicked.
     * Callback is defined in resource layout definition.
     */
    public void showCamera(View view) {
        // Check if the Camera permission is already available.
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // Camera permission has not been granted.

            requestCameraPermission();

        } else {

            // Camera permissions is already available, show the camera preview.
            showCameraPreview();
        }
    }

    /**
     * Requests the Camera permission.
     * If the permission has been denied previously, a SnackBar will prompt the user to grant the
     * permission, otherwise it is requested directly.
     */
    private void requestCameraPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.
            Snackbar.make(mLayout, R.string.permission_camera_rationale,
                    Snackbar.LENGTH_INDEFINITE)
                    .setAction(R.string.ok, new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.CAMERA},
                                    REQUEST_CAMERA);
                        }
                    })
                    .show();
        } else {

            // Camera permission has not been granted yet. Request it directly.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    REQUEST_CAMERA);
        }
    }

    /**
     * Display the {@link CameraPreviewFragment} in the content area if the required Camera
     * permission has been granted.
     */
    private void showCameraPreview() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
                .addToBackStack("contacts")
                .commit();
    }

    /**
     * Callback received when a permissions request has been completed.
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
            @NonNull int[] grantResults) {

        if (requestCode == REQUEST_CAMERA) {

            // Received permission result for camera permission.est.");
            // Check if the only required permission has been granted
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Camera permission has been granted, preview can be displayed
                Snackbar.make(mLayout, R.string.permision_available_camera,
                        Snackbar.LENGTH_SHORT).show();
            } else {
                Snackbar.make(mLayout, R.string.permissions_not_granted,
                        Snackbar.LENGTH_SHORT).show();

            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLayout = findViewById(R.id.sample_main_layout);

        if (savedInstanceState == null) {
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            RuntimePermissionsFragment fragment = new RuntimePermissionsFragment();
            transaction.replace(R.id.sample_content_fragment, fragment);
            transaction.commit();
        }
    }
}


Monday, 21 November 2016, 10:41:17 am
Getting MAC address in Android 6 Resulta que en Android 6 no se puede solicitar la dirección MAC (devuelve siempre 02:00:00:00:00:00), pero hay un workaround: usar la parte rellenada con la MAC de la dirección del interfaz ipv6:

Monday, 24 October 2016, 8:43:38 am
Cómo introducir teclas mediante shell en android Teniendo root, se hace con lo siguiente (ejemplo):
 input keyevent KEYCODE_VOLUME_UP
 input keyevent KEYCODE_VOLUME_DOWN

Fuente: Video explicativo de uso de Statefright+Drammer para un remote root exploit

Monday, 5 September 2016, 11:40:43 am
Abris actividades de otras aplicaciones Hay unos ejemplos completos (incluyendo cómo buscarlos en el "package manager") en esta thread de stackoverflow:

El ejemplo más sencillo sería:
Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication","com.xyz.myapplication.SplashScreenActivity");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


Alternativa:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


Y en caso de que no se sepa el nombre de la clase principal, hay que hacerlo de esta manera:

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent) {
    context.startActivity(appStartIntent);
}



Wednesday, 6 July 2016, 9:36:46 am
Genero el proyecto simtcmservice Es un TcmService+PortonesService standalone (es decir, manda el COMMWINDOW, responde al QUERYESTACION con la estación/FLAGS y por supuesto es capaz de abrir portones).

En dario@uiharu:
cd android
. env.sh
android create project --gradle --gradle-version 1.3.1  --package es.sicosoft.simtcmservice --activity SimTCMService --name simtcmservice --target android-19 --path simtcmservice
cd simtcmservice/
sed -i "s/runProguard false/minifyEnabled false/g" build.gradle 


UPDATE 20160905: En el ordenador de Guillermo se ha generado un nuevo proyecto en el AndroidStudio copiando los fuentes y recursos y AndroidManifest del generado en esta entrada. El proyecto se llama SimTcmService, y es el que se va a a usar para importar en el TCM.

Monday, 20 June 2016, 10:51:56 am
Para modificar el SecSettings
cp ./SystemUI/res/drawable-xxhdpi/tw_quick_panel_icon_airplane_on.png ./SecSettings/res/drawable-xxhdpi/notification_airplane_mode.pkm
mv ./SecSettings/res/drawable-xxhdpi/notification_airplane_mode.pkm ./SecSettings/res/drawable-xxhdpi/notification_airplane_mode.png


Y para recompilarlo:
apktool-samsung b SecSettings
adb push SecSettings/dist/SecSettings.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/SecSettings.apk /system/priv-app/SecSettings/SecSettings.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SecSettings@SecSettings.apk@classes.dex
sync
mount -o remount /data
reboot



Friday, 17 June 2016, 10:07:43 am
Qué el PKM Es un formato para iconos propio de android lollipop.

Thursday, 16 June 2016, 12:07:44 pm
A vueltas con el logo del avión Resulta que el logo del avión está ahora en un xml vectorial:

 /data/android/smali/s5_modnotifications_airplane/SystemUI/res/drawable/stat_sys_airplane_mode.xml

Supongo que borrando el xml y poniendo un png en su lugar...

cd /data/android/smali/s5_modnotifications_airplane
rm ./SystemUI/res/drawable/stat_sys_airplane_mode.xml
cp /data/android/smali/framework-res/stat_sys_signal_flightmode.metro.png ./SystemUI/res/drawable/stat_sys_airplane_mode.png


Wednesday, 15 June 2016, 12:09:16 pm
Poner el logo de metro en el S5
cd /data/android/smali
mkdir s5_modairplane
cd s5_modairplane/
cp ../s5_deodex/system/framework/framework-res.apk .
apktool-samsung d framework-res.apk
mv framework-res.apk framework-res.apk.orig
cp ic_lock_airplane_mode_off_am_alpha.png.metro.png ./framework-res/res/drawable-xxhdpi/ic_lock_airplane_mode_off_am_alpha.png


Y para subir las modificaciones (no hemos modificado el código, no hace falta borrar lo del cache):
adb push ./framework-res/dist/framework-res.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /storage/sdcard0/framework-res.apk /system/framework/framework-res.apk
sync
mount -o remount /data
reboot



cd /data/android/smali/s5_modnotifications_airplane/SystemUI
cp /data/android/smali/framework-res/stat_sys_signal_flightmode.metro.png ./res/drawable-xxhdpi/tw_quick_panel_icon_airplane_on.png



NOTA: tachado porque no funciona.

Wednesday, 15 June 2016, 10:55:22 am
Compilo el Wifi Analyzer (cogido de f-droid) para Android 5.0 Ya que el de f-droid estaba solo para 5.1 o superior y entonces no funcionaba en el Galaxy S5.

Está en:
 uiharu:/home/dario/android/wifianalyzer/wifianalyzer-android5.apk

Tuesday, 14 June 2016, 11:46:02 am
Vuelvo a hacer las modificaciones de la notification shade
UPDATED 20160621: Incluyo el icono de metro en vez del avión
cd /data/android/smali/
mkdir s5_modnotifications_airplane
cd s5_modnotifications_airplane/
cp ../s5_deodex/system/framework/framework-res.apk .
cp ../s5_deodex/system/framework/twframework-res.apk .
cp ../s5_deodex/system/priv-app/SecSettings/SecSettings.apk .
cp ../s5_deodex/system/priv-app/SystemUI/SystemUI.apk .
apktool-samsung if framework-res.apk
apktool-samsung if twframework-res.apk
apktool-samsung d SecSettings.apk
apktool-samsung d SystemUI.apk
mv SecSettings.apk SecSettings.apk.orig
mv SystemUI.apk SystemUI.apk.orig
cp /data/android/smali/s5_modairplane/ic_lock_airplane_mode_off_am_alpha.png.metro.png ./SystemUI/res/drawable-xxhdpi/tw_quick_panel_icon_airplane_on.png
vi ./SystemUI/res/layout/status_bar_expanded_header.xml
# (ver "Monday, 18 April 2016, 11:35:48 am")
vi ./SystemUI/res/layout/qs_panel.xml
vi ./SystemUI/res/layout/quick_connect_layout_zero.xml 
vi ./SystemUI/smali/com/android/systemui/statusbar/phone/PhoneStatusBar.smali
# (ver Monday, 25 April 2016, 10:54:36 am)
vi ./SystemUI/smali/com/android/systemui/statusbar/SignalClusterView.smali
# (ver el diff de más abajo)


El diff de SignalClusterView.smali:
--- ./SystemUI/smali/com/android/systemui/statusbar/SignalClusterView.smali     2016-06-14 11:32:14.000000000 +0200
+++ ../s5_modnotifications_airplane/SystemUI/smali/com/android/systemui/statusbar/SignalClusterView.smali       2016-06-21 10:56:47.439608094 +0200
@@ -559,7 +559,7 @@
     .line 423
     iget-object v4, p0, Lcom/android/systemui/statusbar/SignalClusterView;->mAirplane:Landroid/widget/ImageView;
 
-    iget v8, p0, Lcom/android/systemui/statusbar/SignalClusterView;->mAirplaneIconId:I
+    const v8, 0x7f0204d8
 
     invoke-virtual {v4, v8}, Landroid/widget/ImageView;->setImageResource(I)V
 


Para saber los drawables con "airplane" que se usan en el código:
/data/android/smali/s5_modnotifications_airplane$ for i in $(grep airplane `find . -name public.xml ` | grep drawable | cut -d '"' -f 6 | cut -d 'x' -f 2 | sed "s/^0*//g") ; do echo [$i] ; rgrep $i . | grep smali:; done


Y para empaquetarlo y ponerlo en el teléfono:
apktool-samsung b SystemUI
adb push SystemUI/dist/SystemUI.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SystemUI@SystemUI.apk@classes.dex
sync
mount -o remount /data
reboot


Thursday, 9 June 2016, 12:23:50 pm
IMEI/MAC de los nuevos dispositivos

MACIMEINumero "asignado"
84:38:38:96:2a:16354734061772121"2"
84:38:38:a3:57:5f354734061773996"3"
84:38:38:96:29:c5354734061772337Aula de formación

Friday, 3 June 2016, 12:07:44 pm
El wallpaper del S5 Está en el framework-res:
 uiharu:/data/android/smali/s5_modnotifications/framework-res/res/drawable-nodpi/default_wallpaper.jpg
 uiharu:/data/android/smali/s5_modnotifications/framework-res/res/drawable-sw360dp-xxhdpi/default_wallpaper.png

Thursday, 2 June 2016, 8:54:40 am
Procedimiento para flashear el firmware cerrado en un S5

Requerimientos:
  • CF-Auto-Root-klte-kltexx-smg900f.zip
  • ANE2 ROM: G900FXXU1ANE2_G900FOXX1AND3_G900FXXU1ANE2_HOME.tar.md5
  • NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar.md5 (preparado en la entrada de "Thursday, 28 April 2016, 11:33:37 am"
  • tr.apk, eu.chainfire.flash-2.apk, eu.chainfire.supersu.apk
  • El flashfire-script-sico-simple.zip (preparado en la entrada de "Friday, 13 May 2016, 11:52:49 am"), que está en 3.0.1.3:/data/android/s5-win8/flashfire-script-sico-simple/zip . Esto ha de estar en una micro-sd
  • El SYSTEM_flashfire.tar.md5 (preparado en la entrada de "Wednesday, 11 May 2016, 12:00:40 pm"), que está en 3.0.1.3:/data/android/s5-win8/rootedlollipop/ . Esto ha de estar en una microsd.
  • El SystemUI.apk original ( 3.0.1.3:/data/android/smali/s5_deodex/system/priv-app/SystemUI/SystemUI.apk ). Esto también en la microSD
  • El SystemUI.apk.cerrado ( 3.0.1.3:/data/android/smali/s5_modnotifications/SystemUI.apk.cerrado ). También se pone en la microSD
  • El Trebuchet cerrado para el S5 ( /home/dario/android/s5_1/002_trebuchet/Trebuchet.apk )
  • Las aplicaciones a instalar...

NOTA: EL TELEFONO HA DE TENER MAS DEL 50% DE BATERIA PARA PODERLO FLASHEAR

Procedimiento:
i) RESTAURAR EL FIRMWARE 4.4

1. Se Abre la caja del teléfono, se pone la batería
2. Se pone en modo Odin (teléfono apagado, VolDown+Home+Power; cuando lo solicita, se confirma con el VolUp).
3. Se enciende el PC Windows con el Odin
4. Se abre el Odin que está en:
 cd \Temp\CF-Auto-Root-kltexx-smg900f
5. Se abre el odin
 .\Odin3-v3.10.6.exe
6. Se da al botón de AP y se selecciona el kernel ANE2:
 G900FXXU1ANE2_G900FOXX1AND3_G900FXXU1ANE2_HOME.tar.md5
7. Se conecta el teléfono y una vez que lo ha detectado (ha de poner un puerto COM en la parte de arriba), se da "Start"
8. Cuando termina (el teléfono reinicia), se desconecta del PC
9. Se le quita la batería y se le vuelve a poner
10. Se entra en Recovery: se pulsa VolUp+Home+Power
11. Con VolDown/VolUp se va hasta donde pone "wipe data/factory reset", y se selecciona con Power.
12. Se baja con VolDown hasta el YES de confirmar y se selecciona con Power
13. Con VolDown/VolUp se va hasta donde pone "wipe cache", y se selecciona con Power.
14. Se pulsa Power para seleccionar "reboot system now".

ii) ROOTEAR Y FLASHEAR CON FLASHFIRE

15. Se hace el asistente de configuración inicial dando a todo "Siguiente", "Omitir" o "no gracias" EXCEPTO en: EULA (Entiendo y acepto los términos: SI, Consentimiento: NO), Google y ubicacion (Permite...: NO, Obtenga...: NO, Para mejorar...: NO)
16. "Aplicaciones", "Ajustes", "Acerca del dispositivo" y 7 clicks encima de "Número de compilación" para activar el modo desarrollador.
17. Atrás, "Opciones de desarrollador", "Depuración USB: SI" (y aceptar), "Verificar aplicaciones por USB: NO"
18. Atrás, "Seguridad", "Fuentes desconocidas: SI" (y aceptar), "Verificar aplicaciones: NO"
19. Atrás, "Pantalla", "Tiempo de espera de pantalla: 10 minutos".
20. Se conecta al USB del PC (3.0.1.3, uiharu) y se da a autorizar al PC "Siempre".
21. Se instalan los paquetes:
cd /data/android/s5-win8
adb devices ; adb install tr.apk ; adb install eu.chainfire.supersu.apk ; adb install eu.chainfire.flash-2.apk

22. Se abre el towelroot (Home, Aplicaciones, buscas "Towelroot").
23. ESTO SE HA DE HACER RAPIDO: Se abre la barra de notificaciones, pulsación larga sobre el wifi, configuras wifiap y, rápidamente, cuando veas que aparece el simbolito del wifi arriba, Atrás, "Make it rain", (ver que te dice "Thank you for using..."), bajas la barra de notificaciones y pulsas otra vez en el wifi para desactivarlo.
24. Se ejecuta el supersu (Home, Aplicaciones, buscas "SuperSU")
25. Le dices "Continuar" la instación, "Normal" en el tipo de instalación y "Nunca" en lo de desactivar/romper KNOX.
26. No queremos que reinicie, por lo que cuando te pregunte, le das a "Aceptar" (NO PULSAR reiniciar).
27. Por último, le das a "No, gracias" a lo de sígueme.
28. Se conecta por USB al PC (uiharu)
29. Se hacen los siguientes comandos, estando atento a cuando pregunte si quieres autorizar y le dices que "Permitir".

adb shell
su
exit
exit

30. En la barra de notificaciones, Pulsación larga sobre la actualización de "Samsung Apps", "Info de la aplicación", "Forzar detención".
31. Se desconecta el teléfono del USB
32. Se introduce la microSD que contiene los siguiente ficheros (se puede usar la script uiharu:/data/android/s5-win8/sdcard-prepare.sh para copiar dichos ficheros la sdcard):
  • SYSTEM_flashfire.tar.md5
  • flashfire-script-sico-simple.zip

NOTA: Si no tienes todavía preparada la SDCARD, basta con conectarla a uiharu y hacer:
mount /media/sdcard
cp /data/android/s5-win8/rootedlollipop/SYSTEM_flashfire.tar.md5 /media/sdcard
cp /data/android/s5-win8/flashfire-script-sico-simple/zip/flashfire-script-sico-simple.zip /media/sdcard/
umount /media/sdcard


34. Se pone fecha de febrero de 2016 en el terminal (barra de notificaciones, pulsar sobre la hora, quitar "fecha y hora automáticas", definir fecha, FEB 2016).
33. Se abre el flashfire
34. Se da a "Permitir" root para el flashfire
35. Se da a "Agree" en el disclaimer
36. Se da a "No thanks" en el follow me.
37. Se le da en el "+"
28. "Flash firmware"
29. Se pulsa en "Internal storage" para cambiarlo a "SD card"
30. Se selecciona "SYSTEM_flashfire.tar.md5"
31. Se da "Ok" al mensaje de que los contenidos se han verificado correctamente
32. Se da al "tick"/ok para que incluya el system
37. Se le da en el "+"
38. "Flash ZIP or OTA"
39. Se pulsa en "Internal storage" para cambiarlo a "SD card"
40. Se selecciona "flashfire-script-sico-simple.zip"
41. Se da al "tick"/ok para aceptar las opciones por defecto
42. Se pulsa en "FLASH"
43. Se da "Ok" al mensaje de que la pantalla se pondrá en negro un momento.
44. Se espera a que termine y reinicie
45. Se quita la batería y la sd card
46. Se vuelve a poner la batería
47 Se pone en modo Odin (teléfono apagado, VolDown+Home+Power; cuando lo solicita, se confirma con el VolUp).
48. Se enciende el PC Windows con el Odin
49. Se abre el Odin que está en:
 cd \Temp\CF-Auto-Root-kltexx-smg900f
50. Se abre el odin
 .\Odin3-v3.10.6.exe
51. Se da al botón de AP y se selecciona el fichero con el resto de las particiones:

 NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar.md5

52. Se conecta el teléfono y una vez que lo ha detectado (ha de poner un puerto COM en la parte de arriba), se da "Start"
53. Cuando termina (el teléfono reinicia), se desconecta del PC
54. Se deja que arranque (tarda mucho). NOTA: Al arrancar dará un error del SystemUI.apk (no aparece la barra de notificaciones) y algunas aplicaciones podrían mostrar un mensaje de force-close; eso es normal (es porque se requiere arrancar por lo menos una vez con el SystemUi.apk sin cerrar, cosa que haremos a continuación).
55. Cuando ponga "Arranque completo" en la ventana "Actualizando Android...", se espera un poquito más a que salga el escritorio.
56. Cuando se ve el escritorio por debajo de la ventana de "Actualizando Android...", se conecta al ordenador con el cable USB.
57. Se hace lo siguiente:
adb push /data/android/smali/s5_deodex/system/priv-app/SystemUI/SystemUI.apk /sdcard/
adb push /data/android/smali/s5_modnotifications/SystemUI.apk.cerrado /sdcard/
adb shell
su
pm disable com.google.android.apps.docs.editors.docs
pm disable com.google.android.googlequicksearchbox
pm disable com.google.android.play.games
pm disable com.google.android.feedback
pm disable com.google.android.onetimeinitializer
pm disable com.google.android.apps.maps
pm disable com.google.android.gm
pm disable com.google.android.gsf
pm disable com.google.android.youtube
pm disable com.google.android.apps.magazines
pm disable com.google.android.setupwizard
pm disable com.google.android.gms
pm disable com.google.android.configupdater
pm disable com.google.android.apps.books
pm disable com.google.android.gsf.login
pm disable com.google.android.marvin.talkback
pm disable com.google.android.apps.plus
pm disable com.google.android.webview
pm disable com.google.android.music
pm disable com.google.android.talk
pm disable com.google.android.videos
pm disable com.google.android.syncadapters.contacts
pm disable com.google.android.syncadapters.calendar
pm disable com.google.android.backuptransport
pm disable com.google.android.apps.docs
pm disable com.google.android.tts
pm disable com.google.android.partnersetup
pm disable com.android.vending
pm hide eu.chainfire.supersu
pm uninstall com.geohot.towelroot
pm uninstall eu.chainfire.flash
stop
mount -o rw,remount /system
cp /sdcard/SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SystemUI@SystemUI.apk@classes.dex
sync
mount -o remount /data
reboot

58. Cuando reinicie, se le da a "Cancelar" a lo de "Notificar info. diagnóst."
59. Con el teléfono conectado al USB del PC, se hace:
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/SystemUI.apk.cerrado /system/priv-app/SystemUI/SystemUI.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SystemUI@SystemUI.apk@classes.dex
sync
mount -o remount /data
rm /sdcard/SystemUI.apk /sdcard/SystemUI.apk.cerrado
reboot

60. Esperar a que reinicie
61. Se instala el trebuchet cerrado:
adb install /home/dario/android/s5_1/002_trebuchet/Trebuchet.apk

62. Se da a tecla Home
63. Se selecciona "Trebuchet"
64. Se pulsa sobre "SIEMPRE"
65. Se da "ACEPTAR" Al mensaje de información de cómo borrar los valores predeterminados.
66. Se pulsa sobre "ENTENDIDO".

iii) CONFIGURAR PANTALLA, SONIDO, GPS Y QUITAR WIFI DE SICO

67. "Aplicaciones", pones la clave, "Ajustes", "Pantalla", "Tiempo de espera de pantalla: 30 segundos"
68. botón Back, "Sonidos y notificaciones", "Vibrar cuando suene: SI", "Otros sonidos", "Sonidos táctiles: NO", "Vibración al pulsar: NO", "Teclado Samsung/Sonido al pulsar teclas: NO", "Teclado Samsung/Vibrar al pulsar teclas: NO", dar al Back dos veces
69. "Wifi", Activar
70. Abrimos la barra de notificaciones y le pulsamos encima de la hora
71. Ponemos "Fecha y hora automáticas: SI" y damos a back
72. Pulsamos encima del WifiAp de SICO
73. Le damos a "OLVIDAR"
74. Botón Back, "Modo avión", activamos
75. Botón Back, "Wifi", activamos
76. Botón Back, "Ubicación", desactivamos

iv) INSTALAR LAS APLICACIONES
77. Con el USB conectado al PC, se hace:
adb install /data/android/apks-metro/app-release_v1.0.18.apk
adb install /data/android/apks-metro/SipHome\ correo.apk
adb install /data/android/apks-metro/lockcsip.apk
adb install /home/dario/android/tcm2/tcm2/build/outputs/apk/tcm2-debug.apk
adb shell am startservice -n es.sicosoft.tcm2/es.sicosoft.tcm2.TcmAlarmas


v) CONFIGURAR EL ESCRITORIO
78. "Aplicaciones", Se mete la clave, se da en el botón locked/unlocked para dejarlo en "unlocked", botón Back
79. Se borran todos los iconos (se arrastran a la parte de arriba de la pantalla y se sueltan en el "Eliminar"), menos el de contactos
80. Se añaden iconos en este orden:
  • CSipSimple
  • Sumate
  • (botón de aplicaciones)
  • Contactos
  • Calendario
81. Vuelves a ponerlo en unlocked si es necesario ("aplicaciones", se mete la clave, se pulsa en "locked" para que quede como unlocked).
82. Añades el widget (pulsación larga en el escritorio, widgets, varias veces a la derecha hasta que lo encuentras, mantines pulsado el wigget y lo arrastras al medio de la pantalla). Le das a autorizar poner el widget.

vi) CONFIGURAR EL WIFI
83. "Aplicaciones", Se mete la clave, "Ajustes", "Wifi", scroll hacia abajo, "Añadir red Wi-Fi"
84. En el diálogo de "Atención", ponemos "Active los datos personalizados: NO", y le damos "ACEPTAR"
85. Rellenamos lo siguiente:
SSIDWTOIP
Seguridad802.1x EAP
Método EAPPEAP
Identidadtoipumi
Identidad anónima(se deja en blanco)
ContraseñaMETROumi2012
86. Le damos a "CONECTAR"
87. Le damos al botón de menú (...), "Avanzado", "Notificación de red: NO", "Passpoint: NO", Botón Back hasta llegar al escritorio.

vii) OTRAS CONFIGURACIONES
88. Desactivar optimización de apps: "Ajustes", Sistema/"Batería", "Detalle", "Activado: NO"
89. Quitar la cámara de la pantalla de bloqueo: "Ajustes", "Pantalla de Bloqueo", "Acceso directo de la cámara: NO".
90. "Subir" el lock wallwaper
adb push /home/dario/android/s5_1/004_lockwallpaper/lock_wallpaper_metro_desp.png /sdcard/

91. Abrir el explorador de archivos en el teléfono, seleccionar sdcard, pulsar encima del wallpaper (lo abrirá con el gallery), "usar como", lock wallpaper, desplazar la zona a visualizar a la parte de la izquierda del todo, guardar.
92. Se borra el archivo (ya no lo necesitamos) dando al icono de papelera dentro del "gallery".


Wednesday, 1 June 2016, 8:58:21 am
Más sobre iconos Los iconos se cogen de:
Además, para hacer el bevel, se hace con el Andriod Asset Studio.

Friday, 27 May 2016, 10:27:30 am
Cómo hacer un align-right en un layout de android en este thread dan muchos métodos, pero lo más sencillo, es:

  • Hacer un 'LinearLayout android:orientation="horizontal" android:gravity="right"' que englobe los elementos que quieres tener a la derecha.

Thursday, 26 May 2016, 11:32:45 am
Instalar el csipsimple de los HTC Desire C en los s5
adb uninstall com.csipsimple
adb install /data/phonedevel/home/dario/android/desirec2/D_CSipSimple/CSipSimple-trunk.sico/CSipSimple/bin/CSipSimple-debug.apk


adb uninstall com.csipsimple
adb install /data/phonedevel/home/dario/android/csipsimple/CSipSimple-trunk/CSipSimple/bin/CSipSimple-debug.apk



Thursday, 26 May 2016, 11:01:14 am
Recompilar el trebuchet del s5
cd /data/android/cm12.0
. env.sh
brunch klte
#(da un error de que no encuentra algunos ficheros, eso es normal)
./make-trebuchet.sh
adb install -r out/target/product/klte/system/priv-app/Trebuchet/Trebuchet.apk


Wednesday, 25 May 2016, 9:10:25 am
Sobre el volumen del micrófono Según este vídeo:

$ adb shell " cat /system/etc/mixer_paths.xml | grep -10 \\\"speaker\\\""
        <!-- end of Device -->

        <!-- ================================================================ -->
        <!-- Play Scenario  -->
        <path name="handset">
                <path name="rcv" />
                <ctl name="EAR PA Gain" value="POS_3_DB" />
                <ctl name="RX1 Digital Volume" value="84" />
        </path>

        <path name="speaker">
                <path name="spk" />
                <ctl name="RX7 Digital Volume" value="79" />
                <ctl name="SPK DRV Volume" value="8" />
                <ctl name="COMP0 Switch" value="1" />
        </path>

        <path name="headset">
                <path name="ear" />
                <ctl name="HPHL Volume" value="20" />
                <ctl name="HPHR Volume" value="20" />
$


El valor de "79" se puede subir hasta "84" (más que eso y el altavoz empieza a distorsionar).

Tuesday, 24 May 2016, 10:58:58 am
Hacer un "drop-shadows" en un widget android Se hace con un 9-patch (ver la segunda respuesta) . Hay más información y uso de backgrounds ya hechos del sistema

Material design: icons, colors, unofficial palette generator

Indigo/amber palette
Dark primary color#303f9f
Primary color#3f51b5
Light primary color#c5cae9
Text/icons#ffffff
Accent color#ffc107
Primary text#212121
Secondary text#727272
Divider color#b6b6b6

Red/Amber palette
Dark primary color#d32f2f
Primary color#f44336
Light primary color#ffcdd2
Text/icons#ffffff
Accent color#ffc107
Primary text#212121
Secondary text#727272
Divider color#b6b6b6

NOTA:Aquí hay más ejemplos de material design


Wednesday, 18 May 2016, 10:31:43 am
Probelas con la ROM cocinada: random small freezes Me pasa exactamente lo mismo que en este bug report (pero usando el TCM):
Básicamente es como si el SystemUI se quedase esperando a un timeout (unos 7 segundos), entonces el sistema registra las pulsaciones de pantalla, pero nadie las procesa. Cuando termina el freeze, procesa de golpe todas las pulsaciones de pantalla.

Friday, 13 May 2016, 11:52:49 am
Corrijo el updater-script para flashear directamente en vez de hacer un tar (fuente: flashing raw partition from updater script)
cd /data/android/s5-win8/flashfire-script-sico-simple/zip
zcat ../../userdata.img.gz > userdata.img
rm -rf data
cat > META-INF/com/google/android/updater-script <<'EOF'
                ui_print(" ");
                ui_print("Installing firmware customization");
                ui_print("for G900F, by SICOSOFT ");
                ui_print("based on work by ashyx and Tkkg");
                ui_print(" ");
ui_print("Formatting Data as ext4, please wait, this may take a minute or two...");
format("ext4", "EMMC", "/dev/block/mmcblk0p47", "0", "/data");
ui_print("Mounting Cache");
mount("ext4", "EMMC", "/dev/block/mmcblk0p46", "/cache");


ui_print("Installing New Files...");
package_extract_file("userdata.img", "/dev/block/mmcblk0p47");
ui_print("Wiping Cache");
delete_recursive("/cache");

ui_print("Umounting Partitions");
unmount("/cache");

ui_print("Please Reboot now");
EOF
zip -pr flashfire-script-sico-simple.zip META-INF  userdata.img


Friday, 13 May 2016, 11:13:23 am
Hacer un backup de userdata en caliente
adb shell
su
cd /sdcard
dd if=/dev/zero of=zero.bin bs=16384
rm zero.bin
dd if=/dev/block/platform/msm_sdcc.1/by-name/userdata  | gzip -1 > /storage/extSdCard/userdata.img.gz


Thursday, 12 May 2016, 10:38:08 am
Hacer un script de instación de "data" simplificada para el flashfire
cd /data/android/s5-win8/
mkdir -p flashfire-script-sico-simple/zip/data/../../example-zip
cd s5-win8/flashfire-script-sico-simple/example-zip/
unzip ../../IronRom\ V2.5\ T805.zip
cd ../zip/data
tar -xvf ../../../data.tar
rm -rf dalvik-cache/
cd ..
( cd ../example-zip/ && tar -cf - META-INF ) | tar -xvf -
cd META-INF/com/google/
unzip ../../../../../flashfire-example-script-ironrom/android.zip
cd android
rm -rf aroma* README.txt
cat > updater-script <<'EOF'
                ui_print(" ");
                ui_print("Installing firmware customization");
                ui_print("for G900F, by SICOSOFT ");
                ui_print("based on work by ashyx and Tkkg");
                ui_print(" ");
ui_print("Formatting Data as ext4, please wait, this may take a minute or two...");
format("ext4", "EMMC", "/dev/block/mmcblk0p47", "0", "/data");
delete_recursive("/cache");
ui_print("Mounting Data");
mount("ext4", "EMMC", "/dev/block/mmcblk0p47", "/data");
ui_print("Mounting Cache");
mount("ext4", "EMMC", "/dev/block/mmcblk0p46", "/cache");


ui_print("Installing New Files...");
package_extract_dir("data", "/data");
ui_print("Wiping Cache");
delete_recursive("/cache");

ui_print("Umounting Partitions");
unmount("/cache");
unmount("/data");

ui_print("Please Reboot now");
EOF
cd /data/android/s5-win8/flashfire-script-sico-simple/zip/
rm -f flashfire-script-sico-simple.zip
zip -pr flashfire-script-sico-simple.zip META-INF data


Wednesday, 11 May 2016, 12:00:40 pm
Convertir una imagen para Odin Realmente la queremos flashear con el flashfire, pero el procedimiento es el mismo:

El procedimiento es el de siempre, primeso se hace el backup de la partición:
adb shell
su
stop
dd if=/dev/block/platform/msm_sdcc.1/by-name/system | gzip -1 > /sdcard/system.img.gz
exit
exit


Se copia al ordenador:
cd /data/android/s5-win8/
mkdir rootedlollipop
cd rootedlollipop
adb pull /sdcard/system.img.gz .
gzip -d system.img.gz
mv system.img system.img.ext4
tar -H ustar -c system.img.ext4 > SYSTEM_flashfire.tar
md5sum -t SYSTEM_flashfire.tar >> SYSTEM_flashfire.tar
mv SYSTEM_flashfire.tar SYSTEM_flashfire.tar.md5


Friday, 29 April 2016, 11:08:42 am
S5: Preparando la script de actualizacion

En el S5 modificado se hace:
adh shell
su
stop
cd /data
tar -cvf /sdcard/data.tar data* app* dalvik*
exit
exit
adb pull /sdcard/data.tar .


Para preparar el zip de actualización con todas las cosas (req ironrom 2.5 para el Tab S y script de actualización modificada para el flashfire):

cd /data/android/s5-win8/
mkdir -p flashfire-script-sico/zip/data/../../example-zip
cd flashfire-script-sico/example-zip
unzip ../../IronRom\ V2.5\ T805.zip
cd ..
( cd example-zip/ && tar -cf - data META-INF supersu system ) | ( cd zip && tar -xvf - )
cd zip/data
mkdir t ; mv * t ; rm -rf t
tar -xvf ../../../data.tar
cd ../system
mkdir t ; mv * t ; rm -rf t
cd ..
tar -xvf /data/android/smali/s5_deodex/system.tar
( cd ../example-zip/system/ && tar -cf - bin/.ext/.su xbin/supolicy xbin/busybox xbin/sugote-mksh xbin/daemonsu xbin/su xbin/sugote ) | ( cd system && tar -xvf - )
cp /data/android/smali/s5_modnotifications/SystemUI/dist/SystemUI.apk system/priv-app/SystemUI/SystemUI.apk
cp /data/android/smali/s5_modpowermenu/android.policy.jar.out/dist/android.policy.jar system/framework/android.policy.jar
cd META-INF/com/google/
unzip ../../../../../flashfire-example-script-ironrom/android.zip
cd android
rm -rf aroma* README.txt
cd /data/android/s5-win8/flashfire-script-sico/zip/META-INF/com/google/android
cp /data/android/smali/s5_deodex/fix-rm.sh .
cp /data/android/smali/s5_deodex/fix-rmdir.sh .
cat fix-rm.sh fix-rmdir.sh | sed 's:^rm[a-z]* :delete_recursive("/:g;s:[/]*$:")\;:g' > removeold.sh
rm fix-rm.sh fix-rmdir.sh
cat >head.sh <<'EOF'
                ui_print(" ");
                ui_print("Installing firmware customization");
                ui_print("for G900F, by SICOSOFT ");
                ui_print("based on work by ashyx and Tkkg");
                ui_print(" ");
ui_print("Formatting Data as ext4, please wait, this may take a minute or two...");
format("ext4", "EMMC", "/dev/block/mmcblk0p47", "0", "/data");
delete_recursive("/cache");

ui_print("Mounting System");
mount("ext4", "EMMC", "/dev/block/mmcblk0p45", "/system");
ui_print("Mounting Data");
mount("ext4", "EMMC", "/dev/block/mmcblk0p47", "/data");
ui_print("Mounting Cache");
mount("ext4", "EMMC", "/dev/block/mmcblk0p46", "/cache");

EOF
cat > tail.sh <<'EOF'

ui_print("Installing New System Files...");
package_extract_dir("system", "/system");
package_extract_dir("data", "/data");

ui_print("Misc binaries...");
symlink("/system/xbin/busybox", "/system/bin/busybox");
symlink("/system/xbin/su", "/system/bin/su");

ui_print("Setting permissions");
set_metadata_recursive("/system", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0644, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata_recursive("/system/bin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/bin/run-as", "uid", 0, "gid", 2000, "mode", 0750, "capabilities", 0x0, "selabel", "u:object_r:runas_exec:s0");
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/bin/.ext", "uid", 0, "gid", 0, "mode", 0777, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/bin/.ext/.su", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/xbin/daemonsu", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/xbin/su", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/xbin/sugote", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:zygote_exec:s0");
set_metadata("/system/xbin/sugote-mksh", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata("/system/xbin/supolicy", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");

ui_print("Rooting device");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");
package_extract_dir("supersu", "/tmp/supersu");
run_program("/sbin/busybox", "unzip", "/tmp/supersu/supersu.zip", "META-INF/com/google/android/*", "-d", "/tmp/supersu");
run_program("/sbin/busybox", "sh", "/tmp/supersu/META-INF/com/google/android/update-binary", "dummy", "1", "/tmp/supersu/supersu.zip");

ui_print("Wiping Cache");
delete_recursive("/cache");

ui_print("Umounting Partitions");
unmount("/system");
unmount("/cache");
unmount("/data");

ui_print("Please Reboot now");
EOF
cat head.sh removeold.sh tail.sh > updater-script
rm head.sh removeold.sh tail.sh
cd /data/android/s5-win8/flashfire-script-sico/zip
rm -f flashfire-script-sico.zip
zip -pr flashfire-script-sico.zip META-INF data supersu system



Thursday, 28 April 2016, 11:33:37 am
S5: Documentando el procedimiento de instalación sin romper KNOX
Modo fastboot: teléfno apagado, vol abajo, power y se suelta power cuando aparece el diálogo de confirmación. vol arriba para confirmar.
Modo recovery: teléfono apagado, vol arriba, power, y se suelta power cuando dice BOOTING RECOVERY.

Preparar el tar.md5 SIN system:
cd /data/android/s5-win8
rm -rf ttt
mkdir ttt
cd ttt
unzip ../G900FXXS1BPC3_G900FPHE1BOJ1_PHE.zip
if [ ! -e ../G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar.md5 ] ; then unzip ../G900FXXS1BPC3_G900FPHE1BOJ1_PHE.zip ; mv G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar.md5 .. ; fi
tar -xvf ../G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar.md5
rm system.img.ext4 
tar -H ustar -c * > ../NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar
cd ..
md5sum -t NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar >> NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar
mv NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar NOSYSTEM_G900FXXS1BPC3_G900FPHE1BOJ1_G900FXXU1BOJ1_HOME.tar.md5


Instrucciones:
1. Odin y se flashea el 4.4.2 spain ANE2
2. Se entra en recovery y se hace un factory reset
3. En el 1st time boot no se pone nada
4. Activar modo desarrollador (Ajustes, Informacion, 7 clicks en número de compilación), activar adb (Ajustes, Desarrollador, activar depuración adb, desactivar verificar aplicaciones por usb), activar fuentes desconocidas (Ajustes, aplicaciones, activar fuentes desconocidas, desactivar verificar aplicaciones), maximizar el tiempo de pantalla encendida (ajustes, pantalla, tiempo de espera de pantalla 10 minutos).
5. instalar con el adb el tr.apk, supersu.apk y flashfire
 adb devices ; adb install tr.apk ; adb install eu.chainfire.supersu.apk ; adb install eu.chainfire.flash-2.apk
6. Si no está, poner la tarjeta con el 5.0 spain
7. Se arranca el towelroot, se activa el wifi (preferente uno lento, p.ej. un punto de acceso portátil de un móvil), se hace el root y se desactiva el wifi
8. Se ejecuta el supersu con instalación normal y se le dice que no desactive knox (NUNCA).
9. Autorizamos los shell de root:
 adb shell
 su
 exit
 exit
10. Si está descargando una actualización de las samsung apps, pulsación larga en la notificación y "detener aplicación".
11. se ejecuta el flashfire y se hace un flash SOLO de la particion system, y se añade el zip de flashfire-script-sico.zip (ver entrada más reciente a esta).
12. Desde el odin, se flashea todo menos la particion SYSTEM.

Tuesday, 26 April 2016, 11:55:25 am
S5: Más métodos de instalar root

Monday, 25 April 2016, 10:54:36 am
S5: Quitar "correctamente" el QuickConnect de la barra de notificaciones Se sigue este tutorial:

cd /data/android/smali/s5_modnotifications/SystemUI/smali/com/android/systemui/statusbar/phone
vi PhoneStatusBar.smali
En la <tt>.line 6249</tt> Se comprueba que la condicion es cond_5:
<code>
.line 6249
    .end local v0    # "currentUserId":I
    .end local v1    # "hide":Z
    .end local v2    # "isKioskEnabled":Z
    .end local v4    # "qconnectServiceEnabled":Z
    :cond_5
    :goto_2
    return-void



A continuación del ".line 6178"

se modifica el primer ":cond_0" por un ":cond_5" (quedando cond_5, cond_5 y cond5).
    .line 6178
    iget-boolean v8, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mShowSFinderQConnectView:Z

    if-eqz v8, :cond_5

    iget-object v8, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mQconnectSfinderView:Lcom/android/systemui/statusbar/QconnectSfinderView;

    if-nez v8, :cond_5

    iget-object v8, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mQsQConnectView:Landroid/view/View;

    if-eqz v8, :cond_5

    .line 6179
    :cond_0


Para quitar lo del recents->task_manager: El icono está en ./SystemUI/res/drawable-xxhdpi/tw_recent_panel_icon_task_manager_holo_dark.png, con id 0x7f020572. Se usa en SystemUI/res/layout/results.xml, que es donde lo comento:

 SystemUI/res/layout/results.xml
  37     <LinearLayout android:gravity="bottom" ...
+ 38         <LinearLayout android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" >
 39         <Button android:textSize="@dimen/tw_status_bar_recent_panel_button_text_size_port" ...
+ 40         </LinearLayout>
  41         <LinearLayout android:orientation="horizontal" ...
...
  44     <LinearLayout android:gravity="bottom" ...
+ 45         <LinearLayout android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" >
  46         <ImageButton android:id="@id/recents_launch_button_kk" ...
+ 47         </LinearLayout>
  48         <LinearLayout android:orientation="horizontal" ...


Para quitar el screenshot:

 SystemUI/smali/com/android/systemui/screenshot/TakeScreenshotService\$1.smali
 36 .method public handleMessage(Landroid/os/Message;)V
 37     .locals 8
 38     .param p1, "msg"    # Landroid/os/Message;
 39 
 40     .prologue
 41     const/4 v2, 0x1
 42 
 43     const/4 v3, 0x0
 44 
+45     return-void
 46     .line 38
 47     iget v1, p1, Landroid/os/Message;->what:I


Para quitar la pulsación larga en las notificaciones:
 SystemUI/smali/com/android/systemui/statusbar/BaseStatusBar\$11.smali 

 39 .method public onLongPress(Landroid/view/View;II)Z
 40     .locals 10
 41     .param p1, "v"    # Landroid/view/View;
 42     .param p2, "x"    # I
 43     .param p3, "y"    # I
 44 
 45     .prologue
 46     const/4 v8, 0x0
 47 
+48     return v8
 49     .line 1633


Luego hago:

cd /data/android/smali/s5_modnotifications/
apktool-samsung b SystemUI
cp SystemUI/dist/SystemUI.apk .
adb push SystemUI/dist/SystemUI.apk /sdcard/
adb shell
su
stop
mount -o rw,remount /system
cp /sdcard/SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SystemUI@SystemUI.apk@classes.dex
echo rm -rf /data/dalvik-cache
sync
mount -o remount /data
reboot



Friday, 22 April 2016, 11:41:18 am
Instalar el develsu Para poder borrar el supersu, he preparado un archivo para poderlo reinstalar usando estas instrucciones:
cd /data/android/s5-win8
adb push develsu.tar /storage/extSdCard
adb shell
su
cd /
mount -o remount,rw /system
tar xvf /storage/extSdCard/develsu.tar
cd system/.develsu
./postinst.sh
cd /
mount -o remount,ro /system


Entonces se puede desinstalar sin problema el supersu.

Para volver a instalar el supersu, basta con hacer:

adb shell
cd /system/.develsu
./develsu
./root.sh


Updated 20160426 Modifico las instrucciones de esta entrada para que se correspondan a la versión actual del develsu.

Friday, 22 April 2016, 10:54:42 am
S5: Hacer un backup y flashear el teléfono "a mano" La lista de particiones es la siguiente:
adb shell
su
cd /dev/block/platform/msm_sdcc.1/by-name
ls -l
lrwxrwxrwx root root 2014-01-08 10:57 aboot -> /dev/block/mmcblk0p6
lrwxrwxrwx root root 2014-01-08 10:57 apnhlos -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 2014-01-08 10:57 backup -> /dev/block/mmcblk0p18
lrwxrwxrwx root root 2014-01-08 10:57 boot -> /dev/block/mmcblk0p15
lrwxrwxrwx root root 2014-01-08 10:57 cache -> /dev/block/mmcblk0p24
lrwxrwxrwx root root 2014-01-08 10:57 dbi -> /dev/block/mmcblk0p4
lrwxrwxrwx root root 2014-01-08 10:57 ddr -> /dev/block/mmcblk0p5
lrwxrwxrwx root root 2014-01-08 10:57 efs -> /dev/block/mmcblk0p12
lrwxrwxrwx root root 2014-01-08 10:57 fota -> /dev/block/mmcblk0p17
lrwxrwxrwx root root 2014-01-08 10:57 fsc -> /dev/block/mmcblk0p19
lrwxrwxrwx root root 2014-01-08 10:57 fsg -> /dev/block/mmcblk0p9
lrwxrwxrwx root root 2014-01-08 10:57 hidden -> /dev/block/mmcblk0p25
lrwxrwxrwx root root 2014-01-08 10:57 modem -> /dev/block/mmcblk0p2
lrwxrwxrwx root root 2014-01-08 10:57 modemst1 -> /dev/block/mmcblk0p13
lrwxrwxrwx root root 2014-01-08 10:57 modemst2 -> /dev/block/mmcblk0p14
lrwxrwxrwx root root 2014-01-08 10:57 pad -> /dev/block/mmcblk0p10
lrwxrwxrwx root root 2014-01-08 10:57 param -> /dev/block/mmcblk0p11
lrwxrwxrwx root root 2014-01-08 10:57 persdata -> /dev/block/mmcblk0p22
lrwxrwxrwx root root 2014-01-08 10:57 persist -> /dev/block/mmcblk0p21
lrwxrwxrwx root root 2014-01-08 10:57 recovery -> /dev/block/mmcblk0p16
lrwxrwxrwx root root 2014-01-08 10:57 rpm -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 2014-01-08 10:57 sbl1 -> /dev/block/mmcblk0p3
lrwxrwxrwx root root 2014-01-08 10:57 ssd -> /dev/block/mmcblk0p20
lrwxrwxrwx root root 2014-01-08 10:57 system -> /dev/block/mmcblk0p23
lrwxrwxrwx root root 2014-01-08 10:57 tz -> /dev/block/mmcblk0p8
lrwxrwxrwx root root 2014-01-08 10:57 userdata -> /dev/block/mmcblk0p26


Entonces, para hacer un backup completo, bastaría copiar el system,data y cache:

adb shell
su
stop
dd if=/dev/block/mmcblk0p23 of=/storage/extSdCard/system.img bs=16384
echo mount -o remount,ro /data
echo dd if=/dev/block/mmcblk0p26 of=/storage/extSdCard/data.img bs=16384
mount -o remount,ro /cache
dd if=/dev/block/mmcblk0p24 of=/storage/extSdCard/cache.img bs=16384


Thursday, 21 April 2016, 11:39:52 am
Desactivar el "shortcut" a la cámara de la pantalla de bloqueo en el S5 Se hace como dicen en aquí: Ajustes, Pantalla de bloqueo, desactivar "Acceso directo de la cámara".

Thursday, 21 April 2016, 11:00:03 am
Crear imágenes del filesystem flasheable con el Odin [HOW-TO]Create Custom ODIN Images for Backup/Restore

Tuesday, 19 April 2016, 11:01:17 am
S5: Cambio el res para quitar el settings del "notifications shade"
En el fichero
 /data/android/smali/s5_modnotifications/t/System/res/layout/status_bar_expanded_header.xml
Oculto una parte del interfaz usando un LinearLayout no visible:
<LinearLayout android:visibility="gone" android:layout_width="48.0dip" android:layout_height="48.0dip" >
...
</LinearLayout>

La primera parte que comento así es la línea que empieza por
<ImageButton android:id="@id/settings_button2" ...

Un poco más abajo encierro en otro LinearLayout de esos las tres líneas que dicen:
<TextView android:textSize="14.0dip" ...
<ImageView android:id="@id/basic_settings_button" ...
<ImageView android:id="@id/settings_edit_button" ...

Y por último hacer la mismo con las dos líneas que dicen:
<ImageView android:id="@id/settings_button" ...
<ImageView android:id="@id/notification_button" ...


En el SystemUI/res/layout/status_bar_expanded.xml Cambiamos los márgenes en la línea 14 para quitar la parte del quick settings:
-                <include android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/notification_side_padding" android:layout_marginTop="@dimen/status_bar_header_height_expanded" android:layout_marginRight="@dimen/notification_side_padding" layout="@layout/qs_panel" />
+                <include android:layout_width="fill_parent" android:layout_height="0.0dip" android:layout_marginLeft="@dimen/notification_side_padding" android:layout_marginTop="-97.0dip" android:layout_marginRight="@dimen/notification_side_padding" android:layout_marginBottom="-47.0dip" layout="@layout/qs_panel" />


Y con el SystemUI/res/layout/qs_panel.xml hago lo mismo pero poniendo como tamaño wrap_content (no 48dip), quedando:
 <?xml version="1.0" encoding="utf-8"?>
 <FrameLayout android:id="@id/quick_settings_container" ...
+    <LinearLayout android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" >
    <HorizontalScrollView android:id="@id/quicksetting_scroller" ...
        <com.android.systemui.qs.QSPanel android:id="@id/quick_settings_panel" ...
    </HorizontalScrollView>
+    </LinearLayout>
    <include android:visibility="gone" layout="@layout/quick_settings_brightness_dialog" />
    <include android:visibility="gone" layout="@layout/quick_connect_layout_zero" />
</FrameLayout>


Y comento todo en el SystemUI/res/layout/quick_connect_layout_zero.xml usando wrap_content:
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout android:orientation="vertical" ...
+    <LinearLayout android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" >
...
+     </LinearLayout>
 </LinearLayout>


Se quitan margenes en la línea 15 del SystemUI/res/layout/msim_status_bar_expanded.xml (este en principio no se usa por ser para multisim, pero por si acaso)
-                <include android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/notification_side_padding" android:layout_marginTop="@dimen/status_bar_header_height_expanded" android:layout_marginRight="@dimen/notification_side_padding" layout="@layout/qs_panel" />
+                <include android:layout_width="fill_parent" android:layout_height="0.0dip" android:layout_marginLeft="@dimen/notification_side_padding" android:layout_marginTop="-97.0dip" android:layout_marginRight="@dimen/notification_side_padding" android:layout_marginBottom="-47.0dip" layout="@layout/qs_panel" />


Luego hago:
apktool-samsung b SystemUI
cp SystemUI/dist/SystemUI.apk .
adb push SystemUI/dist/SystemUI.apk /storage/extSdCard/
adb shell
su
stop
mount -o rw,remount /system
cp /storage/extSdCard/SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
mount -o ro,remount /system
rm -rf /data/dalvik-cache/arm/system@priv-app@SystemUI@SystemUI.apk@classes.dex
echo rm -rf /data/dalvik-cache
sync
mount -o remount /data
reboot


Tuesday, 19 April 2016, 9:56:27 am
Buscar todas las views en un apk (smali) Se hace con el siguiente código:
cd /data/android/smali/s5_modnotifications/SystemUI/
rgrep ";->[a-zA-Z]*:Landroid/view/View;" . | sed "s@^.*\(L[a-zA-Z/\$]*;->[a-zA-Z]*:Landroid/view/View;\).*@\1@g" | sort | uniq


Y para ver todas las ViewGroup
rgrep ";->[a-zA-Z]*:Landroid/view/ViewGroup;" . | sed "s@^.*\(L[a-zA-Z/\$]*;->[a-zA-Z]*:Landroid/view/ViewGroup;\).*@\1@g" | sort | uniq | less


Tuesday, 19 April 2016, 9:41:35 am
Tutorial: Mostrar/ocultar el "brightness slider" en la notification bar/quick settings [Guide][tut][UP 21/JAN/15] Show/Hide Brightness Slider on notification Quick settings.

Para hacer un hide de un elemento, hay que poner el puntero al objeto (View) en v1, y un bool en v2, y entonces hacer:

 invoke-virtual {v1, v2}, Landroid/view/View;->setVisibility(I)V

Para conseguir el puntero al objeto, suponiendo que en p0 está el "this" y el view es un field del objeto actual, ejemplo para mBrightnessView:

 iget-object v1, p0, Lcom/android/systemui/qs/QSPanel;->mBrightnessView:Landroid/view/View;

Monday, 18 April 2016, 11:35:48 am
Samsung S5: Modifico SecSettings.apk para el "notifications shade"
mkdir /data/android/smali/s5_modnotifications
cd /data/android/smali/s5_modnotifications
cp ../s5_deodex/system/framework/framework-res.apk .
cp ../s5_deodex/system/framework/twframework-res.apk .
cp ../s5_deodex/system/priv-app/SecSettings/SecSettings.apk .
cp ../s5_deodex/system/priv-app/SystemUI/SystemUI.apk .
apktool-samsung if framework-res.apk
apktool-samsung if twframework-res.apk
apktool-samsung d SecSettings.apk
apktool-samsung d SystemUI.apk
mv SecSettings.apk SecSettings.apk.orig
mv SystemUI.apk SystemUI.apk.orig


Monday, 18 April 2016, 9:19:53 am
Samsung S5: Modifico el android.policy.jar para el power menu Utilizando estas instrucciones para el power menu, dalvik opcodes, dalvik registers, dalvik type methods and fields, small primer to codifying smali files (example:how to add a Log.e):
mkdir -p /data/android/smali/s5_modpowermenu
cd /data/android/smali/s5_modpowermenu
cp ../s5_deodex/system/framework/android.policy.jar .
apktool-samsung d android.policy.jar 
mv android.policy.jar android.policy.jar.orig


Las acciones del menú se ponen en
 smali/com/android/internal/policy/impl/GlobalActions.smali
Y en dicho fichero, en en el método
 .method private createDialog()Lcom/android/internal/policy/impl/GlobalActions$GlobalActionsDialog;

En dicho método va instanciando un objeto que define cada acción y luego los añade. Por ejemplo, el Power es en la línea que tiene
 Lcom/android/internal/policy/impl/GlobalActions$8;
(buscar con el vi "Lcom.android.internal.policy.impl.GlobalActions.8;")

Para quitar el airplane mode, se abre el
 /smali/com/android/internal/policy/impl/GlobalActions.smali
Se busca la ".line 1193"
Y se borra
invoke-direct {v0, v2, v3, v4, v5}, Lcom/android/internal/policy/impl/GlobalActions;->addDialogItemsIfEnabled(ILcom/android/internal/policy/impl/GlobalActions$Action;Ljava/util/ArrayList;Z)Z


Para quitar el emergency, se busca la ".line 1195"
Y se borra
invoke-direct {v0, v2, v3, v4, v5}, Lcom/android/internal/policy/impl/GlobalActions;->addDialogItemsIfEnabled(ILcom/android/internal/policy/impl/GlobalActions$Action;Ljava/util/ArrayList;Z)Z


Como lo anterior no es suficiente, hay que quitarlos de otro array. En
 /smali/com/android/internal/policy/impl/GlobalActions.smali
Para el Airplane Se busca la ".line 1244" y se borra
invoke-virtual {v2, v3}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z


Para el Emergency Se busca la ".line 1254" y se borra
invoke-virtual {v2, v3}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z



Por último, para reempaquetar:
 apktool-samsung b android.policy.jar.out
 cp ./android.policy.jar.out/dist/android.policy.jar .

Y se copia el android.policy.jar otra vez al teléfono:
adb push android.policy.jar /storage/extSdCard/
adb shell
su
stop
mount -o rw,remount /system
cp /storage/extSdCard/android.policy.jar /system/framework/android.policy.jar
mount -o ro,remount /system
rm -rf /data/dalvik-cache
sync
mount -o remount /data
reboot


Thursday, 14 April 2016, 9:26:30 am
Vuelvo a hacer un deodex, esta vez de la nueva rom
mkdir -p /data/android/smali/s5_deodex/
cd /data/android/smali/s5_deodex/
mkdir old2
mv * old2
mv old2 old
wget https://github.com/mikevelasquez02/lollipop_deodexer_linux/archive/master.zip -O lollipop_deodexer_linux.zip
unzip lollipop_deodexer_linux.zip
cd lollipop_deodexer_linux-master/JoelDroidLollipopBatchDeodexer/
sed -i 's:SEVENZIP_PATH =.*:SEVENZIP_PATH = "/usr/bin/7za";:g' ToolPaths.cs
sed -i 's:ZIPALIGN_PATH =.*:ZIPALIGN_PATH = "/usr/bin/zipalign";:g' ToolPaths.cs
sed -i 's:OAT2DEXJAR_PATH =.*:OAT2DEXJAR_PATH = "/data/android/smali/oat2dex/oat2dex.jar";:g' ToolPaths.cs
cp /usr/bin/7za /usr/bin/zipalign /data/android/smali/oat2dex/oat2dex.jar tools/
xbuild /p:Configuration=Release JoelDroidLollipopBatchDeodexer.csproj
cp bin/Release/JoelDroidLollipopBatchDeodexer.exe ../../JoelDroidLollipopBatchDeodexer
cd ../..
mkdir system
cd system
adb pull /system 
cd ..


Para añadir algunas utilidades que faltan (tar, find):
adb push /data/android/cm11_utils/tar /storage/extSdCard
adb push /data/android/cm11_utils/find /storage/extSdCard
adb shell
su
mount -o remount,rw /system
cd /system/xbin
cp /storage/extSdCard/tar .
cp /storage/extSdCard/find .
chmod 755 tar find
cd /
mount -o remount,ro /system
exit
exit


Para averiguar los permisos (el adb pull no preserva los permisos, tendremos que ponerlos nosotros mismos)
adb shell 'find system -type f | while read l ; do echo -n $l: ; ls -l $l ; done' | strings | tee perms-list.txt
sed -i "/Permission denied/d" perms-list.txt
cat perms-list.txt | while read l ; do nombre=`echo $l | cut -d ':' -f 1` ; perm=`echo $l | cut -d ':' -f 2 | cut -d ' ' -f 1 | \
sed "s/^.//g" | sed "s/rwxr-s---/2750/g" | sed "s/--x/1/g;s/-w-/2/g;s/-wx/3/g;s/r--/4/g;s/r-x/5/g;s/rw-/6/g;s/rwx/7/g" | sed "s/---/0/g"` ; echo chmod $perm $nombre ; done > perms.sh


Ponemos los permisos (y los binarios que no estaban en el momento de hacer el pull):
cp /data/android/cm11_utils/tar system/xbin
cp /data/android/cm11_utils/find system/xbin
bash perms.sh


Perparamos un script para poner los usuarios:
cat perms-list.txt | while read l ; do nombre=`echo $l | cut -d ':' -f 1` ; group=`echo $l | expand | sed "s/  */ /g" | \
cut -d ':' -f 2 | cut -d ' ' -f 2,3 | tr ' ' ':'` ; echo chown $group /$nombre ; done > fix-chown.sh



Hacemos una copia de seguridad del system tal y como está ahora:
tar -cvzf s5_system_odex.tgz system/
mv system system.orig
tar -xvzf s5_system_odex.tgz


Hacemos el deodex; para eso, arrancamos el programa:
./JoelDroidLollipopBatchDeodexer


Le damos a "Browse", elegimos el directorio donde está system (My computer, sda1, /data/android/smali/s5_deodex/system), y le damos a "Start Process".

Esperamos a que deodexe la ROM.

Volvemos a poner los permisos
bash perms.sh


Hacemos un script para borrar los ficheros antiguos y un listado de ficheros a meter en el tar:
rsync -aHSvn --delete system.orig/ system/ | sed "/\/\$/d"  | grep '/' | grep -v ' ' > newandchanged.list
rm -f fix-rm.sh changed.list ; for i in `cat newandchanged.list` ; do if [ ! -e system/$i ] ; then echo rm system/$i >> fix-rm.sh ; else echo system/$i >> changed.list ; fi ; done
rm -f system.tar ; tar -cv -T changed.list -f system.tar
rsync -aHSvn --delete system.orig/ system/ | grep "/\$" | sed "s:^:rmdir system/:g" | grep arm > fix-rmdir.sh



Sacamos la tarjta SD y la ponermos en el lector de tarjets de uiharu.

Copiamos el directorio a un tar en la tarjeta sd (junto al fix-chown.sh):
mount /media/sdcard && rm -f /media/sdcard/fix-rm.sh /media/sdcard/fix-rmdir.sh /media/sdcard/system.tar && cp fix-rm.sh fix-rmdir.sh system.tar /media/sdcard/ ; umount /media/sdcard


Volvemos a poner la tarjeta sd en el telefono y esperamos a que la monte.

Instalamos los ficheros "deodexed":
adb shell
su
stop
mount -o rw,remount /system
cd /system/xbin
cp /storage/extSdCard/tar /system/xbin/busybox
chmod 755 /system/xbin/busybox
ln -s busybox tar
cd /
sh /storage/extSdCard/fix-rm.sh
sh /storage/extSdCard/fix-rmdir.sh
tar xvf /storage/extSdCard/system.tar
mount -o ro,remount /system
rm -rf /data/dalvik-cache
sync
mount -o remount /data
reboot


Arrancar normalmente y esperar a que regenere todo.

Ir a "Ajustes, Gestor de aplicaciones, Todo, Google Play Store" Y dar a "Detener, Borrar cache, borrar datos, deshabilitar". Y lo mismo (detener, borrar cache, borrar datos) con "Aplicación Google", "Drive", "Gmail", "Google+", "Google Play Juegos", "Google Play Kiosco", "Google Play Libros", "Google Play Musica", "Google Play Películas", "Hangouts", "Maps", "Marco de servicios de Google"

NOTA: También se pueden deshabilitar aplicaciones y servicios desde el adb (la sintaxis es "pm { hide | unhide | disable | enable } packagename". Para ver la lista de los servicios a deshabilitar:
adb shell pm list packages | sed "s/^package://g" |  grep oogle | while read l ; do echo "pm disable $l" ; done


Y después se usa, por ejemplo en nuestro caso es:
adb shell
su
pm disable com.google.android.apps.docs.editors.docs
pm disable com.google.android.googlequicksearchbox
pm disable com.google.android.play.games
pm disable com.google.android.feedback
pm disable com.google.android.onetimeinitializer
pm disable com.google.android.apps.maps
pm disable com.google.android.gm
pm disable com.google.android.gsf
pm disable com.google.android.youtube
pm disable com.google.android.apps.magazines
pm disable com.google.android.setupwizard
pm disable com.google.android.gms
pm disable com.google.android.configupdater
pm disable com.google.android.apps.books
pm disable com.google.android.gsf.login
pm disable com.google.android.marvin.talkback
pm disable com.google.android.apps.plus
pm disable com.google.android.webview
pm disable com.google.android.music
pm disable com.google.android.talk
pm disable com.google.android.videos
pm disable com.google.android.syncadapters.contacts
pm disable com.google.android.syncadapters.calendar
pm disable com.google.android.backuptransport
pm disable com.google.android.apps.docs
pm disable com.google.android.tts
pm disable com.google.android.partnersetup
pm disable com.android.vending
pm hide eu.chainfire.supersu
exit
exit


Thursday, 14 April 2016, 8:42:29 am
Flashear lollipop rooteado usando el autoroot/cf-root Siguiendo las instrucciones de este vídeo.
1. Descomprimir G900FXXS1BPC3_G900FPHE1BOJ1_PHE.zip (20160325.Spain.5_0.G900FXXS1BPC3.G900FPHE1BOJ1) y flashear el tar.md5 con el Odin
2. Descomprimir CF-Auto-Root-klte-kltexx-smg900f.zip y flashear con el Odin el CF-Auto-Root-klte-kltexx-smg900f.tar.md5

NOTA: He usado el Odin que viene dentro del zip del CF-Auto-Root

Tuesday, 12 April 2016, 10:46:19 am
Rotear directamente Android 5 y un Updater script para flashfire (ejemplo para el galaxy tab s) Está aquí. APKs requeridos:


CF-ROOT para el flashfire (instrucciones no oficiales) Es este:

Download auto-root (el que hay que coger es el G900F)

En el flashfire se pone:

1. Añades el firmware del 5.0 pero sin cache ni recovery
2. Añades el auto root
3. Quitas el everoot
4. Pones que arranque a modo download

FALTA PROBAR: poner sólo el recovery/cache (y el resto desde el odin)

Para hacer el .tar.md5 que hay que flashear desde odin:

mkdir norecovery
cd norecovery/
tar -xvf ../G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5
rm recovery.img cache.img.ext4 
tar -H ustar -c * > ../NORECOVERY_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar
cd ..
md5sum -t NORECOVERY_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar >> NORECOVERY_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar 
mv NORECOVERY_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar NORECOVERY_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5


Para saber si es kltedx o kltexx se puede usar el Phone Info Samsung (xda thread, dl).


Thursday, 7 April 2016, 11:25:29 am
Otro intento con el lollipop_decoder_linux (JoelDroidLollipopBachDeodexer)

apt-get install mono-complete p7zip-full zipalign


Primero compilamos el programa (poniendo los paths de las utilidades como las tengo en este equipo):

mkdir -p /data/android/smali/s5_deodex/
cd /data/android/smali/s5_deodex/
mkdir old2
mv * old2
mv old2 old
wget https://github.com/mikevelasquez02/lollipop_deodexer_linux/archive/master.zip -O lollipop_deodexer_linux.zip
unzip lollipop_deodexer_linux.zip
cd lollipop_deodexer_linux-master/JoelDroidLollipopBatchDeodexer/
sed -i 's:SEVENZIP_PATH =.*:SEVENZIP_PATH = "/usr/bin/7za";:g' ToolPaths.cs
sed -i 's:ZIPALIGN_PATH =.*:ZIPALIGN_PATH = "/usr/bin/zipalign";:g' ToolPaths.cs
sed -i 's:OAT2DEXJAR_PATH =.*:OAT2DEXJAR_PATH = "/data/android/smali/oat2dex/oat2dex.jar";:g' ToolPaths.cs
cp /usr/bin/7za /usr/bin/zipalign /data/android/smali/oat2dex/oat2dex.jar tools/
xbuild /p:Configuration=Release JoelDroidLollipopBatchDeodexer.csproj
cp bin/Release/JoelDroidLollipopBatchDeodexer.exe ../../JoelDroidLollipopBatchDeodexer
cd ../..


Ponemos el system y procesamos los ficheros:
unzip s5system-odex.zip
./JoelDroidLollipopBatchDeodexer


Le damos a "Browse", elegimos el directorio donde está system (My computer, sda1, /data/android/smali/s5_deodex), y le damos a "Start Process".

Esperamos a que deodexe la ROM.

Una vez que termina, preparamos un tar:
mv system OUTPUT
cd OUTPUT
tar -cvf ../OUTPUT.tar .
cd ..


Lo descomprimimos en la tarjeta de memoria del teléfono (preferente usando el lector de tarjetas):
mount -t auto /dev/sdf1 /media/floppy
cd /media/floppy && rm -f OUTPUT.tar
cp /data/android/smali/s5_deodex/OUTPUT.tar .
cp /data/android/s5_1/000_backupsystem/tar .
cd /tmp
umount /media/floppy



Arancamos el teléfono con la tarjetay hacemos el siguiente procedimiento para instalar lo nuevo:

su
stop
mount -o rw,remount /system
cp /storage/extSdCard/tar /system/xbin
chmod 755 /system/xbin/tar
rm /system/app/*/arm/*odex
rm /system/app/*/arm/*odex.xz
rm /system/framework/arm/*.odex
rm /system/framework/arm/*.odex.xz
rm /system/priv-app/*/arm/*.odex
rm /system/priv-app/*/arm/*.odex.xz
cd /system
tar xvf /storage/extSdCard/OUTPUT.tar
mount -o ro,remount /system
reboot



Thursday, 7 April 2016, 10:37:53 am
Actualizo uiharu a java v8 (para que funcione el último oat2dex.jar) Usando este tutorial:
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" > /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" >> /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer
java -version
rm /etc/apt/sources.list.d/webupd8team-java.list
apt-get update


Con esto el java dice lo siguiente:
$ java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)


Thursday, 7 April 2016, 9:38:35 am
Otro tutorial de deodex para Android 5.0 (es la guia original) [GUIDE][TOOL] Android L 5.0 (Lollipop) deodex tool for windows! Oat2dex convertor. y el baksmali para android lollipop y el oat2dex (v0.6) (No encuentro el post original de @_riddle :-?).

Hay otra utilidad para hacerlo de forma automática:

Bugs: Hay que tener cuidado con la versión del oat2dex que se usa, ya que versiones antiguas sufrian este bug del oat2dex
Hay un oat2dex que lo arregla (v0.81)

Para bajar el baksmali v2.2.1:

mkdir -p ~/android/smali/baksmali
cd ~/android/smali/baksmali
wget https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.1.1.jar -O baksmali-2.1.1.jar
wget https://bitbucket.org/JesusFreke/smali/downloads/smali-2.1.1.jar -O smali-2.1.1.jar
echo '#!/bin/bash' > ~/bin/baksmali
echo 'exec java -jar ~/android/smali/baksmali/baksmali-2.1.1.jar -JXmx512m "$@"' >> ~/bin/baksmali
chmod 755 ~/bin/baksmali
echo '#!/bin/bash' > ~/bin/smali
echo 'exec java -jar ~/android/smali/baksmali/smali-2.1.1.jar -JXmx512m "$@"' >> ~/bin/smali
chmod 755 ~/bin/smali


Para bajar el oat2dex v0.81 (req. java8)
mkdir -p ~/android/smali/oat2dex
cd ~/android/smali/oat2dex
wget https://github.com/testwhat/SmaliEx/raw/d6462e5476d0bce4675ee4e46a78ed6e872ca261/smaliex-bin/oat2dex.jar -O oat2dex.jar
echo '#!/bin/bash' > ~/bin/oat2dex
echo 'exec java -jar ~/android/smali/oat2dex/oat2dex.jar -JXmx512m "$@"' >> ~/bin/oat2dex
chmod 755 ~/bin/oat2dex



Wednesday, 6 April 2016, 12:06:48 pm
Procedimiento rápido de root en S5

0. preparativos previos:
mkdir all
cd all
tar -xvf ../G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5
rm system.img.ext4 
tar -H ustar -c * > ../ALLPROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar
md5sum -t ALLPROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar >> ALLPROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar 
mv ALLPROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar ALLPROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5


1. Entrar en recovery (Vol_up, home y power al mismo tiempo), hacer un "factory reset" y luego "enter bootloader". Con eso entrará en modo download.

2 . Con el Odin, flashear
 G900FXXU1ANE2_G900FOXX1AND3_G900FXXU1ANE2_HOME.tar.md5

3. Arrancar normalmente y dar a todo por defecto (inglés, omitir todo, no autorizar localización ni otras cosas de google, no mandar informes a samsung).

4. Esperar 10 minutos a que el teléfono se estabilice. Luego, entrar en Settings y cambiar:

4.1 Settings->Screen: apagado en 10min
4.2 Settings->Security: habilitar orígenes desconocidos y desactivar verificar aplicaciones.
4.3 Settings->Info: 7 clicks sobre "build number" (número de compilación)
4.4 Settings->Developer: habilitar USB debugging

5. Conectar al PC e instalar las aplicaciones
cd /data/android/s5-win8
adb shell exit
adb install -r tr.apk
adb install -r eu.chainfire.flash-2.apk
adb install -r eu.chainfire.supersu.apk


6. Abrir la barra de notificaciones y activar el wifi (pulsación larga sobre el icono de wifi, pinchar en la red y poner la clave)

7. Ejecutar el TowelRoot y darle a rootear

8. Desactivar el wifi (barra de notificaciones y pulsación corta en el icono de wifi)

9. Ejecutar el supersu para instalarlo (En sitio Normal (NO twrp), "Nunca" tocar el knox).

10. Permitir el root del shell (poner la siguiente línea y autorizarlo en la pantalla del teléfono)
 adb shell su

11. Ejecutar el flashfire

12. Seleccionar el G900FXUUPOK5_G900FPHN1POPK1_G900FXXU1POJ1_HOME.tar.md5

13. Aceptar la selección de particiones por defecto

14. Desconectar el teléfono del cable USB

15. Dar al botón de Flash

16. Esperar a que flashee, cuando termine (que ponga en pantalla el "Rebooting...", quitar la batería

17. Arrancar en modo download (Vol_down, home y power al mismo tiempo, luego Vol_up para confirmar)

18. Con el Odin, flashear ALLPROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5

19. Cuando termine, quitar el cable y la batería

20. Arrancar en modo recovery (Vol_up, home y power al mismo tiempo). Hay que entrar en el recovery dos veces, ya que en la primera reinicia antes de dejarte usar el menú.

21. borrar la partición cache con "clear cache" y reiniciar

22. Arrancar normalmente el teléfono y esperar a que termine de hacer sus preparativos.
NOTA: Si no te arranca, volver a flasear el módem.
NOTA2: Si sigue sin arrancar, abrir un shell (debería funcionar) y borrar el dalvik-cache haciendo:
adb shell
su
rm -rf /data/dalvik-cache
reboot


23. Conectar el cable USB y comprobar que sigue fucionando el root haciendo un
adb shell
su


24. Desinstalar el towelroot


Monday, 4 April 2016, 11:27:26 am
Guía para hacer un DEODEX del Samsung S5 lollipop ROM (try 2: "a mano") Se usan las instrucciones de deodex desde línea de comandos usando el oat2dex.jar y el oat2dex.jar extraido del lollipop deodexer.


mkdir -p ~/android/smali/s5_deodex
cd ~/android/smali/s5_deodex
mkdir old
mv  old
wget https://github.com/mikevelasquez02/lollipop_deodexer_linux/archive/master.zip -O lollipop_deodexer_linux.zip
unzip lollipop_deodexer_linux.zip
cp lollipop_deodexer_linux-master/JoelDroidLollipopBatchDeodexer/tools/oat2dex.jar .
rm -rf lollipop_deodexer_linux-master lollipop_deodexer_linux.zip 
cp ../samsung_s5_orig/system/framework/arm/boot.oat .
java -Xmx512m -jar oat2dex.jar boot boot.oat




Friday, 1 April 2016, 10:20:29 am
Guía para hacer un DEODEX del Samsung S5 lollipop ROM Instrucciones de deodex. Instrucciones de deodex desde línea de comandos usando el oat2dex.jar.

NOTA: El lollipop deodexer ha sido portado a linux y se descarga aquí (pero no me ha funcionado, ver apartado 7).

NOTA2: Si un archivo .jar tiene 309 bytes, es que el deodexer ha fallado y no ha sido capaz de extraer las clases correspondientes del Boot.oat (por mucho que diga success en el log del deodexer).

1. Se instala el runtime de mono y el p7zip:
apt-get install mono-complete p7zip-full


2. Se descarga el deodexer
wget https://github.com/mikevelasquez02/lollipop_deodexer_linux/archive/master.zip -O lollipop_deodexer_linux.zip


3. Se desempaqueta y se compila:
unzip lollipop_deodexer_linux.zip
cd lollipop_deodexer_linux-master/JoelDroidLollipopBatchDeodexer/
xbuild /p:Configuration=Release JoelDroidLollipopBatchDeodexer.csproj
cp bin/Release/JoelDroidLollipopBatchDeodexer.exe ../../JoelDroidLollipopBatchDeodexer
cd ../..


4. Se copian los archivos a hacer un deodex
mkdir system
cd system
adb pull /system/app app/
adb pull /system/priv-app/ priv-app/
adb pull /system/framework framework/
cd ..


5. Se ejecuta el deodexer
./JoelDroidLollipopBatchDeodexer


6. Se pulsa en "Browse" y se elige la carpeta system

7. Se da en "Start Process"

Y como da un "Boot.oat Extraction Failed", lo recomendado es usar una utilidad alternativa: DeodexForART (old DeodexForART v221

Sin embargo, si se usa el LBD2.5.zip en windows, sí que funciona bien :-?

ASUMIENDO QUE HAS HECHO EL DEODEX EN WINDOWS (bajado el LBD2.5.zip, ejecutado, pulsado "Browse" para ponerle el directorio system preparado anteriormente y luego dado a "Start Process" para que realice el deodexing), el proceso continúa así:
NOTA: en windows me falla el deodex de un archivo: "Maps" (una de las System Apps)

8. Copias el resultado (para evitar errores, el directorio system que ha sido deodexed a "OUTPUT") en la sdcard del teléfono

9. Sigues el siguiente procedimiento para sustituir los archivos del sistema por los "deodexed":
su
stop
mount -o rw,remount /system
rm /system/app/*/arm/*odex
rm /system/app/*/arm/*odex.xz
rm /system/framework/arm/*.odex
rm /system/framework/arm/*.odex.xz
rm /system/priv-app/*/arm/*.odex
rm /system/priv-app/*/arm/*.odex.xz
cp -R /storage/extSdCard/OUTPUT/app/* /system/app/
cp -R /storage/extSdCard/OUTPUT/framework/* /system/framework/
cp -R /storage/extSdCard/OUTPUT/priv-app/* /system/priv-app/

mount -o ro,remount /system
reboot


Wednesday, 30 March 2016, 11:10:34 am
Las guías de xda para hacer mods al S5 xda-developers.com: GALAXY S5 UNIFIED MODS THREAD - GUIDES & LINKS

Según eso, para el panel de quicksettings habrá que editar:
 SecSettings.apk
 smali\com\android\settings\NotificationPanelMenu.smali

específicamente en el método:
 .method private makeConvertPanelName()V

También hay una guía para modificar el power menu.

Tuesday, 29 March 2016, 8:27:04 am
Desactivar las actualizaciones de sistema en el HTC M8 Según esta thread, hay que hacer dos cosas:
1. Para quitar de las notificaciones de actualziación que ya están en la barra de notificaciones, basta con empezar la descarga de la notificación y luego cancelarla.
2. Para que no vuelvan a aparecer, hay que:
a) Abrir "Ajustes","Aplicaciones","Todas"
b) Darle a "Actualizador"
c) "Borrar datos"
d) Quitar lo de "Mostrar notificaciones", y dar "Forzar detención"

Monday, 28 March 2016, 11:51:27 am
Empiezo a modificar el firmware del S5 con el smali Siguiendo las instrucciones de "Friday, 3 July 2015, 11:15:38 am", hago lo siguiente:

cd /home/dario/android
mkdir -p s5_framework-res
cd s5_framework-res
apktool-samsung if ../samsung_s5_orig/system/framework/framework-res.apk
apktool-samsung if ../samsung_s5_orig/system/framework/twframework-res.apk 
apktool-samsung d ../samsung_s5_orig/system/priv-app/SystemUI/SystemUI.apk


mkdir -p ~/android/smali/s5_deodex/deodex-smali
cd ~/android/smali/s5_deodex/deodex-smali
cp ../OUTPUT/system/framework/framework-res.apk .
cp ../OUTPUT/system/framework/twframework-res.apk .
cp ../OUTPUT/system/priv-app/SystemUI/SystemUI.apk .
apktool-samsung if framework-res.apk 
apktool-samsung if twframework-res.apk 
apktool-samsung d SystemUI.apk 


Update 20150331 Actualizo las instrucciones para que use el apktool para samsung.
Update 20150404 Actualizo las instrucciones para que use como origen los archivos "deodexed"

Wednesday, 23 March 2016, 8:35:44 am
Root en terminales modernos (Hasta Samsung S6) Hay un artículo sobre las diferentes app de root. Para los samsung S5/S6 está el PingPongRoot (es una alternativa al downgrade a 4.4, root, upgrade con flashfire). También es posible que funcione el KingRoot.

Friday, 18 March 2016, 9:19:14 am
Compilo cm12.0 para el S5 Ya que no hay manera con el 12.1... uso el parche trebuchet-sico.diff trebuchet-sico-v2.diff (Update 20150626: actualización al parche trebuchet-sico-v2.diff , que bloquea también el botón de menú en la pantalla principal).
mkdir cm12.0
cd cm12.0/
repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0
repo sync
. build/envsetup.sh
breakfast klte
cd device/samsung/klte
./extract-files.sh
cd ../../..
adb pull /system/app/TimeService/TimeService.apk vendor/samsung/klte-common/proprietary/app/TimeService.apk
sed -i "198,198s/\(..error.stop\)/#\1/g" build/core/main.mk
brunch klte
#(te da un error)
wget http://3.0.1.46:8000/Diarios/uploads/122/trebuchet-sico-v2.diff
(cd packages && patch -p1 < ../trebuchet-sico-v2.diff )
for i in RECEIVE_LAUNCH_BROADCASTS WRITE_SETTINGS READ_SETTINGS ; \
do  sed -i "0,/$i/{s/$i/${i}_TREBUCHET/g}" ./packages/apps/Trebuchet/AndroidManifest.xml ; \
done
make -j2 Trebuchet
adb install -r out/target/product/klte/system/priv-app/Trebuchet/Trebuchet.apk


Para comprobar que funciona:
adb install -r out/target/product/klte/system/priv-app/Trebuchet/Trebuchet.apk
adb uninstall com.cyanogenmod.trebuchet


NOTA: pongo en /system/xbin el ejecutable "find" para android (cogido del CM11 de mi S3), que tengo en uiharu:/home/dario/android/android-executables/find

Thursday, 17 March 2016, 10:16:51 am
Compilo CM12.1 a ver si tengo más suerte con el trebuchet en el s5 CM para el S5 e instrucciones para compilarlo (también ver entrada "Wednesday, 24 June 2015, 10:08:43 am"):
mkdir /data/android/cm12.1
cd ~/android
ln -s /data/android/cm12.1
cd cm12.1
repo init -u https://github.com/CyanogenMod/android.git -b cm-12.1
repo sync
export USE_CCACHE=1
mkdir bin
cp ./.repo/repo/repo bin/repo
cat <<'EOF' > env.sh
#!/bin/bash
export PS1='\u@\h:`pwd`$ '
export HOME=/home/dario/android/cm12.1
export PATH=$HOME/bin:$PATH
. build/envsetup.sh 
EOF
. env.sh
croot
brunch klte


Si se para con un error de You asked for an OpenJDK 7 build but your version is... Hay que evitar que se salga con ese error:
vi build/core/main.mk
:197
# comentar el "$(error stop)" poniendo una almohadilla
:wq


Y volver a hacer el
 brunch klte

Si se para con un No rule to make target libtime_genoff.so
breakfast klte
wget https://gist.githubusercontent.com/lindwurm/1f72326bced0887c5eab/raw/39bfa751ec2e52a372dbd070d5fec8083a498481/roomservice.xml -O .repo/local_manifests/roomservice.xml


Y volver a hacer el
 brunch klte


Monday, 14 March 2016, 11:51:47 am
Corregir el Trebuchet para el S5 (problemas de permisos duplicados) Resulta que hay permisos duplicados entre el trebuchet y el launcher de google now modificado para touchwiz. No se deja instalar el paquete como sistema (simplemente lo ignora), y si se instala como usuario, da el siguiente error:

$ adb install -r Trebuchet.apk
5173 KB/s (3497817 bytes in 0.660s)
pkg: /data/local/tmp/Trebuchet.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS pkg=com.google.android.googlequicksearchbox]


El problema es que googlequicksearchbox (que no sé quién aporta dicho sub-paquete, ya que como paquete independiente no está instalado), usa dicho permiso y como está firmado con una firma diferente de la del launcher, no deja instalar el launcher (ya que provocarçia un conflicto con un paquete instalado anteriormente y lo rompería).

Como no funciona lo de cambiar manifest del Trebuchet el "signature" por "signatureOrSystem", he optado por cambiar el nombre a RECEIVE_LAUNCH_BROADCASTS_TREBUCHET. Es decir:
    <permission
        android:name="com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS"
        android:protectionLevel="signature"
        />

por
    <permission
        android:name="com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS_TREBUCHET"
        android:protectionLevel="signature"
        />


Y lo mismo con "com.android.launcher3.permission.WRITE_SETTINGS" y "READ_SETTINGS".

PROBLEMA: Ahora no instala por un error diferente:
Failure [INSTALL_FAILED_DEXOPT]


En el logcat aparece que es un error de dexopt:
D/PackageManager( 1015): Running dexopt on: /data/app/com.cyanogenmod.trebuchet-1/base.apk pkg=com.cyanogenmod.trebuchet isa=arm vmSafeMode=false interpret_only=false
...
I/dex2oat ( 7802): /system/bin/dex2oat --zip-fd=11 --zip-location=/data/app/com.cyanogenmod.trebuchet-1/base.apk --oat-fd=12 --art-fd=-1 --oat-location=/data/dalvik-cache/arm/data@app@com.cyanogenmod.trebuchet-1@base.apk@classes.dex --instruction-set=arm --instruction-set-features=div --runtime-arg -Xms64m --runtime-arg -Xmx512m
E/dex2oat ( 7802): Failed to open dex from file descriptor for zip file '/data/app/com.cyanogenmod.trebuchet-1/base.apk': Entry not found





Wednesday, 9 March 2016, 10:35:32 am
Rooteado del Samsung Galaxy S5 Sabiendo la combinación de teclas para modo download/odin y recovery, se sigue esta guía.

Requerimientos:

Downgrade a 4.4.2

1. Se arranca el movil en modo download/odin (apagado, voldown+home+power, soltar en el logo, volup para confirmar)
2. Se conecta al PC
3. Se arranca en el PC el Odin
4. Se dejan marcadas las opciones por defecto (Auto-reboot y f.reset-time)
5. Se marca la casilla de "AP", se selecciona el botón de "AP" y se coge el .tar.md5 que había en el zip del 4.4.2 descargado de sammobile: G900FXXU1ANE2_G900FOXX1AND3_G900FXXU1ANE2_HOME.tar.md5
6. Se da a start y se espera a que flashee completamente el terminal
7. En el siguiente arranque se da Vol-up+home-power (si no llegas a tiempo, quitas la batería y lo vuelves a intentar) para entrar en el recovery
8. En el recovery usas vol+down para bajar a factory reset y power para seleccionar. Confirmas que quieres hacerlo y espera a que termine
9. Vuelves a arrancar el teléfono con la opción de reboot en el recovery

Prepaciones antes de instalar el kernel rooteable

10. Arrancas el teléfono normalmente, configurando el wifi cuando te lo pregunte.
11. Desactivas el reactivation lock: "Settings>Security>Reactivation Lock should be UNCHECKED" (es la opción por defecto; recién flasheado debería estar así).
12. También en seguridad, desactivar "verificar aplicaciones" y activar "fuentes desconocidas".
13. Se instala el towelroot y el supersu (p.ej. con el adb; ajustes, "acerca del dispositivo", 10 clicks en "Número de compilación", atrás, "Opciones de desarrollo", "Depuración USB") y también se dan permisos de root para el shell:
cd /home/dario/android/s5-win8
adb install -r eu.chainfire.supersu.apk
adb install -r tr.apk
adb shell su


Rootear
14. Se rearranca el terminal
15. Te conectas al wifi
16. Ejecutas el towelroot

Instalas el supersu
17. arrancas con el kernel normal
18. Ejecutas el supersu que ya debería estar instalado en el teléfono (ya que lo instalamos antes), para que actualice lo que tenga que actualizar. CUando pregunta el tipo de instalación, dar "Normal" (NO en recovery/TWRP). CUando pregunte si desactivar Knox decir "Nunca".

Actualización a Android 5 sin perder root
19. Pones el timeout de blanqueo de pantalla a 10 minutos ("Ajustes", "Pantalla", "Tiempo de espera de pantalla", "10 minutos")
20. Instalas el FlashFire
 adb install -r eu.chainfire.flash-2.apk
21. Copias el tar.md5 de la rom en la sd externa (pones primero una microSD en el teléfono y luego haces la copia):
 adb push G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5 /storage/extSdCard
22. Ejecutas el flashfire en le terminal (ver thread con instrucciones detalladas de uso del flashfire en el s5)
23. Le das al "+"
24. "Flash Firmware"
25. Dejas todo por defecto
26. Le das a Flash y al OK para instalar la ROM.
27. Esperas entre 2 y 15 minutos (Se quedará durante ese tiempo en la pantalla del logo del terminal). Se quita la baería cuando ponga "Rebooting..." (ANTES de que rearranque en el recovery).

Preparación de una imagen del odin para las partes que faltan
28. En uiharu:
mkdir all
cd all
tar -xvf ../G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5
rm boot.img recovery.img system.img.ext4 cache.img.ext4
tar -H ustar -c * > ../PROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar
cd ..
md5sum -t PROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar >> PROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar
mv PROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar PROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5

29. Se copia el tar.md5 generado al directorio del Odin

Instalas las partes que faltan con e Odin
30. Se arranca el movil en modo download/odin (apagado, voldown+home+power, soltar en el logo, volup para confirmar)
31. Se conecta al PC
32. Se arranca en el PC el Odin
33. Se dejan marcadas las opciones por defecto (Auto-reboot y f.reset-time)
34. Se marca la casilla de "AP", se selecciona el botón de "AP" y se coge el .tar.md5 que hemos preparado antes, el PROTECTED_G900FXXU1POK5_G900FPHN1POK1_G900FXXU1POJ1_HOME.tar.md5
35. Se da a start y se espera a que flashee completamente el terminal

Comprobación de que está rooteado
36. Se deja que arranque el terminal
37. Se arranca la aplicación supersu que debería estar instalada, y se ve que sale todo bien.




Monday, 15 February 2016, 10:21:44 am
Cambiar el color de un drawable (android 5+) Se hace con el siguiente procedimiento:

==CUT===
You can achieve coloring the drawableleft on a button with this method:

Step 1: Create a drawable resource file with bitmap as parent element as shown below and name it as ic_action_landscape.xml under the drawable folder

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@android:drawable/ic_btn_speak_now"
    android:tint="@color/white" />

Step 2: Create your Button control in your layout as below

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/md_light_green_500"
        android:drawableLeft="@drawable/ic_action_landscape"
        android:drawablePadding="8dp"
        android:fontFamily="sans-serif"
        android:gravity="left|center_vertical"
        android:stateListAnimator="@null"
        android:text="@string/drawer_quizzes"
        android:textColor="#fff"
        android:textSize="12dp" />

The button gets the drawable from the ic_action_landscape.xml from the drawable folder instead of @android:drawable or drawable png(s).

==CUT===

Friday, 22 January 2016, 11:33:35 am
Quitar la notificación de "No hay SIM" en el Samsung S5 Según êste thread>http://www.preguntandroid.com/pregunta/4191/quitar-no-hay-tarjeta-sim-en-el-telefono-mensaje, hay que editar el build.prop (req. root) y añadir:
 ro.config.donot_nosim= true
Y si aún así sigue saliendo, quitar:
 ro.config.tima=1

Si no se tiene root, como solución temporal, se puede hacer lo siguiente:
1. pulsación larga sobre la notificación
2. darle al botón de información que sale
3. detener el ""UI Sistema" (no hay peligro).
La descventaja de este método es que aparecerá de nuevo en cuanto el teléfono reciba una llamada (o se reinicie).

Monday, 21 December 2015, 10:06:07 am
Descargar paquetes de google play sin cuenta google Se puede hacer desde los siguiente sitios

Monday, 21 December 2015, 9:42:59 am
Genero una nueva aplicación para probar lo del NFC Para la versión de gradle he mirado aquí (tal y como recomiendan en esta thread):
cd ~/android
. env.sh
android create project --gradle --gradle-version 1.3.1 \
 --package es.sicosoft.nfctest --activity NfcTest \
 --name nfctest --target android-19  --path nfctest
sed -i "s/runProguard false/minifyEnabled false/g" build.gradle 


Update 20151222 Para que la aplicación reciba el intent hay que poner unas cuantas cosas en el AndroidManifest, tal y como dicen aquí, y poner el xml del tech-list en res/xml/ (más info). Y otro thead sobre NXP ICODE en android.

Friday, 18 December 2015, 8:55:31 am
Leer códigos sin conacto ICODE con el NFC del móvil Hay un ejemplo que habría que probar (búsqueda):

Wednesday, 16 December 2015, 11:27 am
Parando un proceso y limpiando sus datos SIN reinstalar Se hace según este post:

Método 1:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill


Método 2:
adb shell am force-stop com.my.app.package


Para limpiar los datos:
adb shell pm clear com.my.app.package


Friday, 11 December 2015, 11:06:13 am
Modificar la ROM del Galaxy S5 (G900F) para cerrarlo Sí se puede hacer. Hay información de :

Thursday, 12 November 2015, 11:16:35 am
Borrar el cache de la webview Se hace según este post:
context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");
mWebView.clearHistory();
mWebView.clearFormData();
mWebView.clearCache(true);


Thursday, 12 November 2015, 8:38:54 am
Cambiar el User Agent en una WebView Se hace así:

mWebView.getSettings().setUserAgentString("user-agent-string");


Y para obtener el UA actual:

mWebView.getSettings().getUserAgentString();


Friday, 6 November 2015, 10:55:38 am
Finalmente uso gradle para compilar el tcm2 Ya que es la única manera que he encontrado para que funcione elCardView/AppCompatV7 que usa ProximoMetro.

Se compila en uiharu, como dario, haciendo:
cd /home/dario/StudioProjects/tcm2
./compila.sh


Tuesday, 3 November 2015, 9:31:26 am
Arreglado lo de las librerías de design en tcm2 Después de ver esta thread, resulta que para que funcione hay que:
1. Usar las build tools 23.x
2. Tener el SDK 23
3. volver a copiar los jar al directorio libs (salen errores si usas jar antiguos, aunque tengan el mismo nombre los han actualizado)

Thursday, 29 October 2015, 9:28:30 am
Comunicación estre threads en android (runOnUiThread, LOOPER, AsyncTask, Handler) Un post muy claro sobre uso de Handlers, AsyncTasks, etc>http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper-prepare.

Thursday, 29 October 2015, 9:26:12 am
Más sobre las AsyncTasks Ejemplos de uso de Async tasks y explicaciones varias.

Thursday, 29 October 2015, 9:21:11 am
Sincronización entre threads Una manera sencilla es usar CountDownLatch:
// En la funcion que llama
CountDownLatch doneSignal = new CountDownLatch(1);
new Thread(new Worker(doneSignal)).start();
doneSignal.await();

// En la async task
class Worker implements Runnable {
private final CountDownLatch doneSignal;
   Worker(CountDownLatch doneSignal) {
     this.doneSignal = doneSignal;
   }
   public void run() {
     try {
       doWork();
       doneSignal.countDown();
     } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }}


Thursday, 29 October 2015, 9:17:54 am
Obtener un documento por HTTP en API 21 Se hace según este ejemplo, que usa HttpURLConnection.

Monday, 26 October 2015, 10:18:29 am
Complicaciones con el app:layout_behavior Hay un post sobre ello. Pasos seguidos:

1. Definir una string en el strings.xml y usar esa:
res/values/strings.xml:<string name="appbar_scrolling_view_behavior">android.support.design.widget.AppBarLayout$ScrollingViewBehavior</string>


2. Decirle al proguard que no toque las clases del appcompat; en el proguard.cfg se añade al final:
 -keep class android.support.design.widget.** { *; }
 -keep interface android.support.design.widget.** { *; }
 -dontwarn android.support.design.** 


3. Hacer que el proguard no ofusque, añadiendo como primera línea al proguard.cfg lo siguiente:
-dontobfuscate


4. Por último (y MUY IMPORTANTE), asegurarte que en el AndroidManifest tienes:
 <application android:theme="@style/AppTheme" >


Friday, 23 October 2015, 9:20:04 am
Hacer que al appcompat funcione con el tcm2 (daba un error de no encontrar el build.xml) Dicen cómo hacerlo en este thread y este otro, y esto otro para el soporte del design library y este otro para el aar. He hecho lo siguiente:

. ~/android/env.sh 
android update lib-project --target android-21 --path /data/android-sdk-linux/extras/android/support/v7/appcompat
echo "android.library=true" >> /data/android-sdk-linux/extras/android/support/v7/appcompat/project.properties
echo "android.library.reference.1=../../../../../../../data/android-sdk-linux/extras/android/support/design" >> /data/android-sdk-linux/extras/android/support/v7/appcompat/project.properties
android update lib-project --target android-21 --path /data/android-sdk-linux/extras/android/support/v7/cardview
echo "android.library=true" >> /data/android-sdk-linux/extras/android/support/v7/cardview/project.properties
android update lib-project --target android-21 --path /data/android-sdk-linux/extras/android/support/design
echo "android.library=true" >> /data/android-sdk-linux/extras/android/support/design/project.properties
android update lib-project --target android-21 --path /data/android-sdk-linux/extras/android/support/v7/recyclerview
echo "android.library=true" >> /data/android-sdk-linux/extras/android/support/v7/recyclerview/project.properties
cd ~/android/tcm2
echo "android.library.reference.1=../../../../data/android-sdk-linux/extras/android/support/v7/appcompat" >> project.properties
echo "android.library.reference.2=../../../../data/android-sdk-linux/extras/android/support/v7/cardview" >> project.properties
echo "android.library.reference.3=../../../../data/android-sdk-linux/extras/android/support/design" >> project.properties
cp /data/android-sdk-linux/extras/android/support/design/libs/android-support-design.jar libs
cp /data/android-sdk-linux/extras/android/support/v7/recyclerview/libs/android-support-v7-recyclerview.jar libs
cp /data/android-sdk-linux/extras/android/support/v7/cardview/libs/android-support-v7-cardview.jar libs/


Para las dependencias adicionales introducidas:
cd ~/android/tcm2/libs
cp /data/android-sdk-linux/extras/android/support/annotations/android-support-annotations.jar .
cp /data/android-sdk-linux/extras/android/support/v7/cardview/libs/android-support-v7-cardview.jar .


Y además hay que hacer que compile con compatibilidad de Java7 (error de "error: diamond operator is not supported in -source 1.5"):
echo "java.source=7" >> ant.properties
echo "java.target=7" >> ant.properties


O bien compilar con:
 ant debug -Djava.source=7 -Djava.target=7


Thursday, 22 October 2015, 11:12:15 am
Generador de iconos para Android Android Asset Studio

Tuesday, 20 October 2015, 11:57:54 am
Cómo descargar un fichero por http en android Hay un post con varios ejemplos aquí y uso con bytearray (otro ejemplo).

===CUT===
String getjson(String serverip)
{
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(""+serverip+":10001/ListasTrenes.mem");
HttpResponse response = client.execute(get);
byte[] content = EntityUtils.toByteArray(response.getEntity());
byte[] off=new byte[] {-13,-23,-29,-17,-13,-17,-26,-12};
int i,k,a;
for(i=0;i<off.length;i++) 
     off[i]=off[i]&0x7f;
for(i=0,k=0;i<content.length;i++,k++,k%=off.length) {
     a=((int)(buf[i]&0x7f))+((buf[i]&(((byte)0x80)))?128:0);
     buf[i]=(byte)((a+256-off[k])%256);
}
String decoded = new String(content, "UTF-8");
return decoded;
}

===CUT===

Para obtener un InputStream desde los bytes es "trivial":

 InputStream stream = new ByteArrayInputStream(content);

Para descomprimir, se hace con Inflate:

 import java.io.ByteArrayOutputStream;  
 import java.io.IOException;  
 import java.util.zip.DataFormatException;  
 import java.util.zip.Inflater;
//...
  public static byte[] decompress(byte[] data) throws IOException, DataFormatException {  
   Inflater inflater = new Inflater();   
   inflater.setInput(data);  
   ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);  
   byte[] buffer = new byte[1024];  
   while (!inflater.finished()) {  
    int count = inflater.inflate(buffer);  
    outputStream.write(buffer, 0, count);  
   }  
   outputStream.close();  
   byte[] output = outputStream.toByteArray();  
   return output;  
  }  
 }


Tuesday, 20 October 2015, 8:50:58 am
Actualización de los iconos de TCM/hecl Se hace muy parecido a la entrada del "Friday, 8 May 2015, 11:15:10 am", en el chroot de phonedevel que hay en nas.

Primero se copian los iconos de la paleta a icons_subs:

scp OperInterUp.icon OperInterDn.icon root@nas:/sharedunix/chroots/phonedevel/home/dario/src.hecl/icons_subs

Y los iconos del plano a a icons_inst (el Dn no es necesario, pero bueno):

scp OperInterUp.icon OperInterDn.icon root@nas:/sharedunix/chroots/phonedevel/home/dario/src.hecl/icons_inst

Acto seguido, se regeneran los iconos y se copian a uiharu:

ssh root@nas
phonedevel
cd src.hecl
cd icons_inst/
./inst2tcmres.sh 
cd ..
cd icons_subs/
./subs2tcmres.sh 
cd ..
cd tcm.assets
scp -r * dario@3.0.1.3:/home/dario/android/tcm2/assets/
exit
exit


Por último, se recompila en uiharu
. ~/android/env.sh
cd ~/android/tcm2
ant clean debug install


Update 20161110 Ahora se hace en uiharu:/home/dario/android/tcm2/original_icons

Thursday, 15 October 2015, 10:25:30 am
Hacer que un webview manipule los html/png/etc antes de procesarlos Se puede hacer usando WebViewClient.shouldOverrideUrlLoading().

Hay un ejemplo básico de cómo se usan esas funciones (shouldInterceptRequest y cía) en stackoverflow.

Wednesday, 2 September 2015, 11:23:30 am
Preparo para poder compilar el tcm/hecl con la nueva toolchain (la de uiharu) Tengo que hacer una pequeña modificación en el sdk:
cd /data/android-sdk-linux/platforms/android-21/
ln -s ../../build-tools/21.1.2/ tools


Con eso ya puedo hacer un
cd /phonedevel/home/dario/src.hecl
rm build.log ; ( bash -x ./build.sh tcm.hcl 2>&1 ) | tee build.log
cp /phonedevel/home/dario/src.hecl/t/hecl/android/Hecl.jar /tmp/
cd /tmp/
mkdir t12
cd t12
unzip ../Hecl.jar 
rm ../Hecl.jar 
zip -pr ../Hecl.jar META-INF/ org/
cd ~/android/tcm2/libs
cp /tmp/Hecl.jar .


Por último copio los fuentes (src/tcm/*) y dependencias (res) del tcl/hecl en tcm2. Corrijo los fuentes del TcmHecl para que use como R el es.sicosoft.tcm2.R y compile correctamente.

Así ya está integrado todo (geotcm, servicio, widget, portones, tcmhecl) en el tcm2.apk.

Tuesday, 1 September 2015, 10:14:23 am
Renombro tcmalarmas a tcm2 e intento integrar el resto de los apks
cd ~/android
. env.sh
mv tcmalarmas tcm2
cd tcm2
android update project -p ./ --target android-21


Update Ya he integrado el TcmWidget y el TcmPortones. FALTA el tcm/hecl.

Wednesday, 26 August 2015, 11:53:48 am
Actualizo los fuentes de tcmalarmas de uiharu para empezar a integrar el GeoTcm En uiharu, como dario, he hecho lo siguiente:
cd ~/android/
. env.sh
cd ~/android/tcmalarmas
android update project -p ./ --target android-21


Ahora solo falta integrar lo de "~/AndroidStudioProjects/GeoTcm" en el tcmalarmas.

update: Integrado, no ha sido tan difícil.

Wednesday, 29 July 2015, 10:47:08 am
Particiones del HTC M8

NOTA: /sdcard es un bind-mount de /data/media/0/ (es decir, es una parte de la partición userdata)

/dev/block/platform/msm_sdcc.1/by-name # df
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                   933600        20    933580   0% /dev
tmpfs                   933600        16    933584   0% /tmp
/dev/block/mmcblk0p46
                        386848      6224    380624   2% /cache
/dev/block/mmcblk0p47
                      11196512  11196504         8 100% /data
/dev/block/mmcblk0p47
                      11196512  11196504         8 100% /sdcard
/dev/block/platform/msm_sdcc.1/by-name # for i in * ; do echo $i ; cat $i > /sdc
ard/SystemBackup/$i ; done
adsp
board_info
boot
cache
carrier
cdma_record
cir_img
control
custdata
ddr
debug_config
devlog
dsps
extra
fataldevlog
fsc
fsg
hboot
local
mfg
misc
modem_st1
modem_st2
pdata
pg1fs
pg2fs
radio
radio_config
recovery
reserve
reserve_1
reserve_2
reserve_3
rpm
sbl1
sbl1_update
sdi
sensor_hub
skylink
sp1
ssd
system
tool_diag
tz
userdata
cat: write error: No space left on device
wcnss
cat: write error: No space left on device
wifi
cat: write error: No space left on device
~ # ls -l /dev/block/platform/msm_sdcc.1/by-name/ | grep p4
lrwxrwxrwx root     root              2015-07-29 08:28 boot -> /dev/block/mmcblk0p42
lrwxrwxrwx root     root              2015-07-29 08:28 cache -> /dev/block/mmcblk0p46
lrwxrwxrwx root     root              2015-07-29 08:28 cir_img -> /dev/block/mmcblk0p40
lrwxrwxrwx root     root              2015-07-29 08:28 recovery -> /dev/block/mmcblk0p43
lrwxrwxrwx root     root              2015-07-29 08:28 reserve -> /dev/block/mmcblk0p41
lrwxrwxrwx root     root              2015-07-29 08:28 reserve_1 -> /dev/block/mmcblk0p4
lrwxrwxrwx root     root              2015-07-29 08:28 reserve_3 -> /dev/block/mmcblk0p44
lrwxrwxrwx root     root              2015-07-29 08:28 system -> /dev/block/mmcblk0p45
lrwxrwxrwx root     root              2015-07-29 08:28 userdata -> /dev/block/mmcblk0p47
~ # ls -l /dev/block/platform/msm_sdcc.1/by-name/
lrwxrwxrwx root     root              2015-07-29 08:28 adsp -> /dev/block/mmcblk0p16
lrwxrwxrwx root     root              2015-07-29 08:28 board_info -> /dev/block/mmcblk0p3
lrwxrwxrwx root     root              2015-07-29 08:28 boot -> /dev/block/mmcblk0p42
lrwxrwxrwx root     root              2015-07-29 08:28 cache -> /dev/block/mmcblk0p46
lrwxrwxrwx root     root              2015-07-29 08:28 carrier -> /dev/block/mmcblk0p37
lrwxrwxrwx root     root              2015-07-29 08:28 cdma_record -> /dev/block/mmcblk0p33
lrwxrwxrwx root     root              2015-07-29 08:28 cir_img -> /dev/block/mmcblk0p40
lrwxrwxrwx root     root              2015-07-29 08:28 control -> /dev/block/mmcblk0p30
lrwxrwxrwx root     root              2015-07-29 08:28 custdata -> /dev/block/mmcblk0p22
lrwxrwxrwx root     root              2015-07-29 08:28 ddr -> /dev/block/mmcblk0p14
lrwxrwxrwx root     root              2015-07-29 08:28 debug_config -> /dev/block/mmcblk0p28
lrwxrwxrwx root     root              2015-07-29 08:28 devlog -> /dev/block/mmcblk0p39
lrwxrwxrwx root     root              2015-07-29 08:28 dsps -> /dev/block/mmcblk0p15
lrwxrwxrwx root     root              2015-07-29 08:28 extra -> /dev/block/mmcblk0p32
lrwxrwxrwx root     root              2015-07-29 08:28 fataldevlog -> /dev/block/mmcblk0p27
lrwxrwxrwx root     root              2015-07-29 08:28 fsc -> /dev/block/mmcblk0p34
lrwxrwxrwx root     root              2015-07-29 08:28 fsg -> /dev/block/mmcblk0p19
lrwxrwxrwx root     root              2015-07-29 08:28 hboot -> /dev/block/mmcblk0p11
lrwxrwxrwx root     root              2015-07-29 08:28 local -> /dev/block/mmcblk0p31
lrwxrwxrwx root     root              2015-07-29 08:28 mfg -> /dev/block/mmcblk0p5
lrwxrwxrwx root     root              2015-07-29 08:28 misc -> /dev/block/mmcblk0p24
lrwxrwxrwx root     root              2015-07-29 08:28 modem_st1 -> /dev/block/mmcblk0p25
lrwxrwxrwx root     root              2015-07-29 08:28 modem_st2 -> /dev/block/mmcblk0p26
lrwxrwxrwx root     root              2015-07-29 08:28 pdata -> /dev/block/mmcblk0p29
lrwxrwxrwx root     root              2015-07-29 08:28 pg1fs -> /dev/block/mmcblk0p2
lrwxrwxrwx root     root              2015-07-29 08:28 pg2fs -> /dev/block/mmcblk0p6
lrwxrwxrwx root     root              2015-07-29 08:28 radio -> /dev/block/mmcblk0p20
lrwxrwxrwx root     root              2015-07-29 08:28 radio_config -> /dev/block/mmcblk0p18
lrwxrwxrwx root     root              2015-07-29 08:28 recovery -> /dev/block/mmcblk0p43
lrwxrwxrwx root     root              2015-07-29 08:28 reserve -> /dev/block/mmcblk0p41
lrwxrwxrwx root     root              2015-07-29 08:28 reserve_1 -> /dev/block/mmcblk0p4
lrwxrwxrwx root     root              2015-07-29 08:28 reserve_2 -> /dev/block/mmcblk0p23
lrwxrwxrwx root     root              2015-07-29 08:28 reserve_3 -> /dev/block/mmcblk0p44
lrwxrwxrwx root     root              2015-07-29 08:28 rpm -> /dev/block/mmcblk0p8
lrwxrwxrwx root     root              2015-07-29 08:28 sbl1 -> /dev/block/mmcblk0p1
lrwxrwxrwx root     root              2015-07-29 08:28 sbl1_update -> /dev/block/mmcblk0p7
lrwxrwxrwx root     root              2015-07-29 08:28 sdi -> /dev/block/mmcblk0p10
lrwxrwxrwx root     root              2015-07-29 08:28 sensor_hub -> /dev/block/mmcblk0p38
lrwxrwxrwx root     root              2015-07-29 08:28 skylink -> /dev/block/mmcblk0p36
lrwxrwxrwx root     root              2015-07-29 08:28 sp1 -> /dev/block/mmcblk0p12
lrwxrwxrwx root     root              2015-07-29 08:28 ssd -> /dev/block/mmcblk0p35
lrwxrwxrwx root     root              2015-07-29 08:28 system -> /dev/block/mmcblk0p45
lrwxrwxrwx root     root              2015-07-29 08:28 tool_diag -> /dev/block/mmcblk0p21
lrwxrwxrwx root     root              2015-07-29 08:28 tz -> /dev/block/mmcblk0p9
lrwxrwxrwx root     root              2015-07-29 08:28 userdata -> /dev/block/mmcblk0p47
lrwxrwxrwx root     root              2015-07-29 08:28 wcnss -> /dev/block/mmcblk0p17
lrwxrwxrwx root     root              2015-07-29 08:28 wifi -> /dev/block/mmcblk0p13



Wednesday, 29 July 2015, 10:39:27 am
Hago un backup completo del terminal Entro en covery y hago lo siguente desde un adb shell:
mkdir /sdcard/SystemBackup
cd /dev/block/platform/msm_sdcc.1/by-name/
for i in * ; do echo $i ; cat $i > /sdcard/SystemBackup/$i ; done


Wednesday, 29 July 2015, 9:41:35 am
Datos del Samsung S5 Tiene los soguientes datos:
TerminalMACIMEI
Samsung Galaxy S5ec:1f:72:5c:10:e6359877069459830

Wednesday, 22 July 2015, 9:36:56 am
Compilar el CSipSimple Se siguen estas intrucciones y este fix para los fuentes que faltan del silk y este otro fix ara que pueda hacer las VideoLibs.

1. Se instala el android SDK en ~/android-sdk-linux

2. Se instala el android NDK en ~/android-ndk-linux

3. Se hace la script de env (NOTA: el build de CSipSimple falla si el NDK está en un enlace simbólico; hay que poner en el env el directorio real):
 ~/android/env.sh
#!/bin/sh
echo "Espero que hayas hecho un include/source (.) en vez de un exec."
export ANDROID_NDK=$HOME/android-ndk-linux/
export ANDROID_SDK=$HOME/android-sdk-linux/
export PATH=$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK:$HOME/bin:$PATH


4. Se hace un source de env
 . ~/android/env.sh

5. Se ejecuta el comando "android" y se instalan los api para android-16 y android-19

6. Se instalan las dependencias
 sudo apt-get install subversion git quilt unzip wget swig2.0 python make yasm

7. Se clona el repositorio (en mi caso he clonado la r2470)

cd ~/android
mkdir src.csipsimple
cd src.csipsimple/
svn checkout http://csipsimple.googlecode.com/svn/trunk/ CSipSimple-trunk


Update 20160526 Resulta que ya no está el repositorio de code.google.com, y hay que usar un mirror de github. El más usado es https://github.com/r3gis3r/CSipSimple.
Para buscar las versiones, lo mejor es ir pinchando en los diferentes commit que modifican el AndroidManifest.xml, p.ej este (commit 77d837f, actualiza a csipsimple 2353).

Se pueden descargar siguiendo estas instrucciones (ver última respuesta), es decir, "Browse Files" en el commit, dar en "Clone or download" y luego "Download zip", que te termina dando la siguiente URL:
 wget https://github.com/r3gis3r/CSipSimple/archive/77d837fcf10cbe389a902fe79f40d227621e1b02.zip -O CSipSimple-r2353.zip



8. Se hace el build de la parte nativa:
cd ~/android/src.csipsimple/CSipSimple-trunk/CSipSimple
make
wget "https://bkvoice.googlecode.com/files/SILK_SDK_SRC_v1.0.9.zip"
cd jni/silk/
mkdir sources
cd sources
unzip ../../../SILK_SDK_SRC_v1.0.9.zip 
cd ../../..
make
wget https://csipsimple.googlecode.com/svn-history/r2115/trunk/CSipSimple/jni/pjsip/android_toolchain/pjmedia/Video.mk -O jni/pjsip/android_toolchain/pjmedia/Video.mk
#make VideoLibs
sed -i "s/MY_USE_CODEC2 := .*/MY_USE_CODEC2 := 0/g" jni/Application.mk
sed -i "s/pj_codec2_codec//g" Makefile
make CodecPackLibs
make CodecG729


9. Se genera el keystore para poder firmar las aplicaciones (sicosoft/sicosoft1):
keytool -genkey -v -keystore ~/android/sicosoft-release.keystore -alias sicosoft -keyalg RSA -keysize 2048 -validity 10000


10. Se pone en el ant.properties que use ese keystore:
cd ~/android/src.csipsimple/CSipSimple-trunk/
echo -e "key.alias=sicosoft\nkey.store.password=sicosoft1\nkey.store=/home/dario/android/sicosoft-release.keystore\nkey.alias.password=sicosoft1" > ActionBarSherlock/ant.properties
echo -e "key.alias=sicosoft\nkey.store.password=sicosoft1\nkey.store=/home/dario/android/sicosoft-release.keystore\nkey.alias.password=sicosoft1" > CSipSimple/ant.properties


11. Se actualizan los manifest
cd ~/android/src.csipsimple/CSipSimple-trunk/ActionBarSherlock
android update project -p ./
cd ../CSipSimple
android update project -p ./



12. Se parchea con las modificaciones de SICO:
cd ~/android/src.csipsimple
wget http://3.0.1.46:8000/Diarios/uploads/122/csipsimple-configlock.diff
cd CSipSimple
patch -p1 < ../csipsimple-configlock.diff


13. Se compila
cd ~/android/src.csipsimple/CSipSimple-trunk/CSipSimple
ant release 


14. El paquete compilado queda en:
 ~/android/src.csipsimple/CSipSimple-trunk/CSipSimple/bin/CSipSimple-release.apk 

que se instala con un
cd ~/android/src.csipsimple/CSipSimple-trunk/CSipSimple
adb -d install -r bin/CSipSimple-release.apk


Wednesday, 15 July 2015, 12:00:15 pm
Volver al system.img original en un HTC M8 He hecho una copia del system.img en un teléfono "casi sin tocar", desde el recovery:
 cat /dev/block/platform/msm_sdcc.1/by-name/boot > /sdcard/boot.img
 cat /dev/block/platform/msm_sdcc.1/by-name/system > /sdcard/system.img

PARA RESTAURARLO he hecho, con la partición TWRP-recovery arrancada:

Primero se hace un factory-reset (wipe), y luego:

$ adb push boot.img /sdcard/
$ adb push system.img /sdcard/
$ adb shell
# cat /sdcard/boot.img > /dev/block/platform/msm_sdcc.1/by-name/boot
# cat /sdcard/system.img > /dev/block/platform/msm_sdcc.1/by-name/system 


Y después ya un reboot.

NOTA: Para que el S.O. esté en español, la manera más sencilla es meter una SIM para que coja el idioma de la SIM y luego volverla a quitar.


Wednesday, 15 July 2015, 11:24:26 am
Cómo apagar el HTC m8 durante el arranque No es nada fácil:
1. Se presiona Power+VolUp hasta que se apaga la pantalla
2. Rápidamanete se sueltan ambas teclas y se presiona VolDown
3. Saldrá el HBOOT

Tuesday, 14 July 2015, 9:14:16 am
Arreglar el problema del SystemUI.apk después de un TWRP restore en el M8 Según algunos posts (1, 2), restaurar desde el TWRP sin poner el firmware.zip puede dar problemas como los nuestros (no tener notificaciones, wallpaper ni botones back/home/recent).

Hay un tutorial de cómo instalar el firmware.zip en el HTC M8.

Para instalar uno que no sea exactamente de tu CID, hay que tener S-OFF.

También hay maneras de arrancar el SystemUI.apk desde línea de comando con un am

Por otro lado, para navegar por el S.O. sin tener botón de back, se puede simular presionar el BACK usando adb:
 adb shell input keyevent 4


Friday, 10 July 2015, 11:30:34 am
Volver a stock en el M8

1. Entrar en fastboot
2. Si no está hecho el unlock, volverlo a hacer para poder poner el recovery (te preguta en el terminaluna confimación)
fastboot flash unlocktoken Unlock_code.bin
3. Flashear el recovery
 fastboot flash recovery recovery_1.54.401.10.img
4. Flasear el ruu:
fastboot oem lock
fastboot oem rebootRUU
fastboot flash zip 0P6BIMG.zip


Update 20150924: Usar como RUU el este (m8_ul, cid 102).


NOTA: Para ver el CID (en nuestro caso es 102), se hace:
 fastboot getvar all

NOTA2: Para obtener un ruu (.exe), está la web de http://www.androidruu.com

Nota3: Para obtener el rom.zip desde el .exe, se puede usar el unruu (descargar de aquí):

mkdir src.unruu
cd src.unruu/
wget https://github.com/kmdm/unruu/archive/master.zip
unzip master.zip 
cd unruu-master/
sudo apt-get install libunshield-dev
gcc unruu.c -lunshield -o unruu


Y para usarlo:
./unruu RUU_xxxx_signed.exe



Friday, 10 July 2015, 9:36:41 am
No funciona SystemUI.apk después de restaurar el M8 con el TWRP Es un bug conocido. Según este post Hay que borrar los datos del"HTC BlickFeed" y del "HTC Dot view" y reiniciar... pero parece que hace falta algo más :-?

Como con eso solo no ha funcionado, además he hecho lo siguiente:
1. He arrancado el TWRP
2. He copiado los zip del androidpolicy y el suystemui, aparte de los fondos de pantalla
3. He instalado anmbos zip
4. He borrado el cache y dalvik cace.
5. He reiniciado.

Thursday, 9 July 2015, 12:00:15 pm
Datos del teléfono HTC M8 que era "Sico dev" (y el que va para Lago)

TeléfonoMACIMEI
SICO DEV00:ee:bd:ad:fd:7c357871055824471
"Otro"00:ee:bd:ae:1e:3e357871055831393

Thursday, 9 July 2015, 10:06:36 am
Cambiar el icono de avión por uno de metro Está en el icono:
 stat_sys_signal_flightmode.png

Thursday, 9 July 2015, 9:51:51 am
Cambiar el texto de "Modo avión está activado" Edito en SystemUI el
 SystemUI/res/values-es/strings.xml:    <string name="lockscreen_carrier_airplanemode_on">Modo avión está activado.</string>

Lo cambio por:
<string name="lockscreen_carrier_airplanemode_on">METRO de MADRID</string>


Y lo mismo en el fichero
 ./SystemUI/res/values/strings.xml

Empaqueto con

 apktool b SystemUI

Y lo pongo en el terminal.


Tuesday, 7 July 2015, 10:35:09 am
Quitar lo del menú de apagado Eso estaba en el android.policy.jar:
cd ~/android/smali/framework-res
cp /home/dario/android/smali/htc_m8_orig/system/framework/android.policy.jar .
apktool d android.policy.jar
vi android.policy.jar.out/smali/com/android/internal/policy/impl/GlobalActions.smali


En donde dice
 .line 520

borro la línea
 invoke-virtual {v3, v4}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z

Y también borro justo antes del "line 521" la siguiente línea:

 invoke-virtual {v3, v4}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z


Y luego para reempaquetar:

 apktool b android.policy.jar.out

Monday, 6 July 2015, 12:14:04 pm
Quitar lo de "Edit Quick Settings" En el SystemUI, está en:
 ./smali/com/android/systemui/statusbar/phone/PhoneStatusBar.smali

Está en la parte que dice
.line 999

Es la línea
 invoke-virtual {v0, v2}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V

Se borra y ya está.


Friday, 3 July 2015, 11:15:38 am
En el HTC M8, encontrado el botón de settings en el header Está en el SystemUI.apk
 res/layout/status_bar_expanded_header.xml

y la parte interesante es
==CUT===
<com.android.systemui.statusbar.widget.FocusImageView android:id="@id/setting_button" android:background="@drawable/ripple_drawable" android:focusable="true" android:clickable="true" android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/icon_btn_settings_dark" android:scaleType="center" android:contentDescription="@string/accessibility_desc_settings" android:paddingStart="@dimen/spacing_3" android:paddingEnd="@dimen/spacing_3" />
===CUT===

Para "Decompilar":
mkdir -p ~/android/smali/framework-res
cd ~/android/smali/framework-res
cp ../htc_m8_orig/system/framework/framework-res.apk .
cp ../htc_m8_orig/system/framework/com.htc.resources/com.htc.resources.apk .
cp ../htc_m8_orig/system/framework/framework-res-htc/framework-res-htc.apk .
apktool if framework-res.apk
apktool if com.htc.resources.apk
apktool if framework-res-htc.apk 
cp ../htc_m8_orig//system/priv-app/SystemUI/SystemUI.apk .
apktool d SystemUI.apk


Se hace el vi todo eso, y luego:

apktool b SystemUI


Update He econtrado el botón. Es este:
dario@uiharu:~/android/smali/framework-res/SystemUI$ rgrep 0x7f110215 .
./res/values/public.xml:    <public type="id" name="setting_button" id="0x7f110215" />
./smali/com/android/systemui/statusbar/phone/PhoneStatusBar.smali:    const v3, 0x7f110215
./smali/com/android/systemui/statusbar/phone/StatusBarHeaderView.smali:    const v0, 0x7f110215



El poner el onclicklistener está en:
./smali/com/android/systemui/statusbar/phone/PhoneStatusBar.smali
.line 1018

Es la línea:
     invoke-virtual {v0, v2}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V

Se borra y ya está.


He puesto en su lugar lo siguiente
    const/4 v0, 0x0

    invoke-virtual {v2, v0}, Landroid/view/View;->setEnabled(Z)V




Update 20150706: Al final simplemente la he borrado, porque la línea añadida estaba dando un error.

Friday, 3 July 2015, 9:19:01 am
smali con Android 5.0 Hay un APKTool 2.0 (incluye smali) (guía de uso en Debian/Ubuntu) que soporta Android 5.0/5.1. Requiere instalar el Oracle Java 7.

Para instalar el Oracle Java 7 en uiharu he hecho lo siguiente:
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java7-installer
apt-get remove openjdk-7-jdk:amd64 openjdk-7-jre:amd64 openjdk-7-jre-headless:amd64 
java -version


Para instalar el apktool:
mkdir -p ~/android/smali
cd ~/android/smali
wget "https://bbuseruploads.s3.amazonaws.com/iBotPeaches/apktool/downloads/apktool_2.0.0.jar?Signature=nDRxdXXOK5%2FRDWwFAAIl0xC7l%2BY%3D&Expires=1435908584&AWSAccessKeyId=0EMWEFSGA12Z1HF1TZ82&response-content-disposition=attachment%3B%20filename%3D%22apktool_2.0.0.jar%22"
echo '#!/bin/bash' > apktool
echo 'exec java -Xmx256M -jar ~/android/smali/apktool_2.0.0.jar "$@"' >> apktool
chmod 755 apktool
mkdir -p ~/bin
cp apktool ~/bin


Después he instalado busybox en el teléfono.


Tuesday, 30 June 2015, 9:53:53 am
Instalando Trebuchet en Android 5 "lollipop" Resulta que ahora las aplicaciones en /system/app están en un subdirectorio. Funciona si se instala el trebuchet de CM12 en
 /system/app/Trebuchet/Trebuchet.apk
NOTA: he tenido que instalar el ADW para que me dejase elegir el launcher... supongo que le dí alguna vez a usar siempre blinkfeed como launcher. También se puede cambiar haciendo "settings > Personal/Personalize > Home screen > Trevuchet".

Friday, 26 June 2015, 12:03:07 pm
Más sobre el PIE en android 5 En este thread dicen que con este patch (download) se arregla. PROBLEMA: es un parche dependiente del dispositivo y de la versión del S.O. Idealmente habría que parchear el linker para mi dispositivo.

Friday, 26 June 2015, 11:12:23 am
Ejecutar binarios en Android 5 (problema con PIE) Básicamente no puedo ejecutar el busybox de android 4.4 en android 5, ya que está compilado sin position-independent-executable flags. Ver este thread explicando el problema y varias posibles soluciones. Soluciones:
1. Compilar con apilevel android-16 (android 4.4 o superior compila con pie por defecto)
2. Compilar dos veces el binario una vez con pie y otra sin pie, y elegir en tiempo de ejecutción el binario a llamar en el programa java
3. usar el wrapper runpie (es un invento de la gente del chromium), que permite ejecutar programas pie en versiones del S.O. no-pie si se llaman de la manera "runpie ejecutable-pie"). En versiones que soportan pie, se ejecutan los programas sin el wrapper. Evita el hacer apks demasiado grandes ya que así solo hay que incluir una versión de los binarios.

Thursday, 25 June 2015, 11:08:06 am
Añadiendo una aplicación a los makefiles de compilación de una imagen android Resutla que no es muy difícil. Ver Using java library from android framework in packages/apps

Wednesday, 24 June 2015, 10:08:43 am
Compilando en uiharu el CM para el HTC One M8 Instrucciones en el wiki de CyanogenMod y para hacer el build for M8. Para posibilitar el build (req. 50GB), he puesto el antiguo HDD de phonedevel en uiharu, y he formateado la partición /, que he puesto como "/data". La partición /home de phonedevel la he dejado en /phonedevel/home.

Como root:
apt-get install bison build-essential curl flex git gnupg gperf \
   libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libxml2 \
   libxml2-utils lzop pngcrush schedtool squashfs-tools xsltproc zip \
   zlib1g-dev
apt-get install g++-multilib gcc-multilib lib32ncurses5-dev \
   lib32readline-gplv2-dev lib32z1-dev
apt-get install libwxgtk3.0-dev 


Como usuario:
mkdir -p ~/bin
mkdir -p ~/android/system
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
. ~/bin/env.sh
echo '. ~/android/env.sh' >> ~/.profile


Entonces se cierra el terminal y se abre uno nuevo para que coja las nuevas variables de entorno y se hace lo siguiente:

cd ~/android/system/
repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0
sed -i "s:\(.\)\(/manifest\)\(.\):\1project name="TheMuppets/proprietary_vendor_htc" path="vendor/htc" remote="github" revision="cm-12.0"/\3\1\2\3:g" .repo/local_manifests/roomservice.xml
repo sync


Por último, para hacer un "build":
cd ~/android/system/
export USE_CCACHE=1
croot
brunch m8


Para recompilar solo el Trebuchet:
cd ~/android/system/
source build/envsetup.sh
breakfast m8
export LANG=C
make -j2 Trebuchet


Update 20150625 Para los "propietary blobs" hay que usar este repositorio. Hay que seguir estas instrucciones. Otro ejemplo para un motorola con CM12 (más parecido a lo mío).

Básicamente es editar el .repo/local_manifests/roomservice.xml (en /data/android/system) y añadir la siguiente línea justo antes del "</manifest>":
<project name="TheMuppets/proprietary_vendor_htc" path="vendor/htc" remote="github" revision="cm-12.0"/>


NOTA: Edito las instrucciones de arriba para incluir el añadir lo de los blobs al manifest.

Y después hace un:
rm -rf vendor/htc/
repo sync


Wednesday, 24 June 2015, 9:16:34 am
Rooteando el HTC M8 Ya había hecho el unlock de uno de los terminales, Ahora instalo TWRP y supersu.

Los archivos descargados para el procedimiento están en:
uiharu:/home/dario/android/m8_1/002_twrp

Pasos realizados (en uiharu, como dario):
cd ~/android/m8_1
mkdir 002_twrp
cd 002_twrp
wget https://dl.twrp.me/m8/twrp-2.8.7.0-m8.img
cp twrp-2.8.7.0-m8.img twrp.img
adb reboot bootloader
fastboot flash recovery twrp.img
fastboot reboot


Para entrar en recovery, desde el teléfono apagado, se hace con POWER+VOL_DOWN

Para instalar el supersu:
1. Se entra en recovery (teléfono apagado, pulsar power+voldown, seleccionar con el voldown el partado "recovery", dar power)
2. Se elige "Reboot en el TWRP"
3. Se hace el slide to accept para que te instale el supersu.


Thursday, 14 May 2015, 11:06:40 am
Hacer un nuevo UI del TCM usando MOAI Para instalar MOAI usando moaicli (anuncio, instrucciones, descarga, fix para que compile en linux x86-64).
Como root:
 apt-get install libc6-dev-i386
como usuario
cd ~
mkdir moaicli
cd moaicli
wget https://github.com/halfnelson/moaicli/releases/download/1.5.0-rc2/moaicli-linux-1.5.0-rc2.tar.gz
tar -xvzf moaicli-linux-1.5.0-rc2.tar.gz
echo "export PATH=$PATH:/home/dario/moaicli" > env.sh
. env.sh
moaicli new tcm
cd tcm/
moaicli start android


NOTA: para instalar para pruebas el target SDL
como root:
apt-get install  mesa-common-dev mesa-utils-extra libgl1-mesa-dev libglapi-mesa
apt-get install libglu-dev

como usuario:
 moaicli start sdl

Wednesday, 13 May 2015, 10:29:36 am
Explicación de los contexts de android Context, what context?

Friday, 8 May 2015, 11:15:10 am
Actualización los iconos del TCM/hecl Se hace en phonedevel, que ahora es un chroot de nas:

ssh root@nas
phonedevel
cd src.hecl
cd icons_inst/
./inst2tcmres.sh 
cd ..
cd icons_subs/
./subs2tcmres.sh 
cd ..


Antes de hacer lo anterior, he copiado los iconos
  OperCtrlEmergDn.icon  OperCtrlEmergUp.icon 
de la paleta a icons_subs,
y los iconos del plano
  OperCtrlEmergUp.icon
a icons_inst

Por último, para compilar el paquete, he aumentado la versión a 0.9.3
 vi tcm.hcl
Y he recompialdo el paquete:
 make-tcm.sh

Wednesday, 11 March 2015, 11:55:42 am
Hacer una aplicación "esqueleto" que muestre una webview Se puede seguir uno de los sguientes métodos:

Update 20150324 Prototipo funcional de la aplicación realizado. Se puede instalar desde uiharu haciendo:
 adb install /home/dario/AndroidStudioProjects/GeoTcm/app/build/outputs/apk/app-debug.apk

Wednesday, 3 December 2014, 11:41:59 am
Uso de adb en uiharu Ya había instalado el adb "por paquete". Para que pueda usar el adb el usuario dario, he hecho
 adduser dario adb
Ya que ese es el usuario que configuran en el udev (ver /lib/udev/rules.d/70-android-tools-adb.rules ).

Update 20150311 Instalo también el fastboot en uiharu; para instalar los dos se hace:
 apt-get install android-tools-adb android-tools-fastboot

Tuesday, 29 July 2014, 5:49:35 pm
Rooteo el Nexus 5 Por el procedimiento oficial, siguiendo esta guía (oem unlock, install TWRP recovery for hammerhead, install supersu).

Thursday, 8 May 2014, 10:01:56 am
Doy de alta al Nexus 5 en tcti He configurado el Nexus 5 para la red de Metro, instalado las aplicaciones (incl. el csipsimple modificado por nosotros) y configurado el csipsimple. En el tctiserver de metro lo he habilitado para PCastilla con perfil avanzado. También he añadido sus datos a la tabla al final de esta página.

Friday, 7 February 2014, 5:49:23 pm
Empiezo maintdclient para android En Java, usando tcmwidget y tcmalarmas como ejemplos. He generado la plantilla del proyecto con lo siguiente:

cd android
. env.sh
android create project --name maintdclient -k es.sicosoft.maintdclient -a MaintdClient --target android-8 --path maintdclient


Y para pasar los iconos del prototipo en hecl al programa final en Java:

cd ~/android/maintdclient
for i in hdpi_72x72 mdpi_48x48 ldpi_36x36 ; do res=`echo $i | cut -d '_' -f 1 ` ; size=`echo $i | cut -d '_' -f 2` ; mkdir -p res/drawable-${res} ; convert ~/src.hecl/maintdclient.png -resize $size res/drawable-${res}/icon.png ; done


Wednesday, 5 February 2014, 9:25:18 am
Programa gratuito para overclocking SetCPU en xda-developers. Lista de profiles del SetCPU para el Desire C. Por último FAQ sobre "cpu governonrs and schedulers".

Tuesday, 4 February 2014, 8:58:55 am
Añado un paso más a las instrucciones, que es el reinstalar el bootloader de HTC Se hace así:
4. Volver a instalar el recovery de HTC
=======================================

4.1 Apagas el terminal

4.2 Quitas la batería y la vuelves a poner

4.3 Mientras pulsas Vol- (vol-abajo), le das al botón
 de power hasta que aparece el bootloader

4.4 Las a power para ponerlo en modo FASTBOOT

4.5 Conectas el terminal al PC, en la pantalla del
 teléfono debería poner FASTBOOT USB.

4.7 Flasheas desde el PC el recovery oficial de HTC

cd untouched__rom_fastboot_img
fastboot flash recovery recovery.img

4.8 Reinicias el terminal


Friday, 31 January 2014, 5:45:18 pm
Overclocking el Desire C Información general sobre overclocking. Básicamente, el cambio de frecuencias está regulado por un susbsistema del kernel. Las frecuencias soportadas en un determinado kernel se pueden consultar con:
 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

Más información de cómo cambiarlo

Monday, 13 January 2014, 10:12:38 am
Procedimiento de "desinstalación" La instrucciones de desinstalación son las sigueintes:
==CUT===
El zip de la rom untouched para poder desinstalar es
untouched__rom_v2.0eu_dcplx1.zip

El procedimiento es:

1. Copiar el zip de la ROM untouched en la tarjeta SD 
2. Arrancar el CWM (con "adb reboot recovery") 
3. Hacer un wipe-data/factory-reset, wipe cache y advanced/wipe dalvik cache.
4. aplicar el update desde el zip 
5. reiniciar el sistema 
6. entrar en el bootloader (con "adb reboot bootloader") 
7. Extraer del zip los ficheros recovery.img y boot.img. 
8. Flashear el kernel y el recovery con:
fastboot flash recovery recovery.img
fastboot flash boot boot.img 
9. Reiniciar el telefono

10. Hacer un "relock" del bootloader; esto es, entrar en el bootloader con un "a
db reboot bootloader" y despues hacer un:
fastboot oem lock

11. Volver a entrar en android, ponerlo en modo depuracion y ejecutar el RUU en 
windows.
RUU_GOLF_U_ICS_40A_HTC_Europe_2.00.401.2_Radio_10.11.98.09H_1.06.98.13M2_release
_295101_signed.exe

==CUT===

Thursday, 9 January 2014, 10:08:01 am
Invalidar una vista para forcar un refresh Se hace así:
ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();


Tuesday, 17 December 2013, 9:30:01 am
Cuenta sip para hacer pruebas Puedes registrarte para una cuenta sip gratuita en sip.linphone.org. Para hacer pruebas, se puede usar uno de la lista de destinos sip para pruebas (musica, echo, etc).

Monday, 16 December 2013, 8:23:52 am
Para cambiar menús en elActionBarSherlock Se hace como dicen en este post.
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    MenuItem menuItemMapView = menu.findItem(R.id.men_mapview);
    MenuItem menuItemSatelliteView = menu.findItem(R.id.men_satelliteview);

    if (mapView.isSatellite()) {
        menuItemMapView.setEnabled(true).setVisible(true);
        menuItemmenuItemSatelliteView.setEnabled(false).setVisible(false);
    } else {
        menuItemMapView.setEnabled(false).setVisible(false);
        menuItemmenuItemSatelliteView.setEnabled(true).setVisible(true);
    }

    return super.onPrepareOptionsMenu(menu);
}


Monday, 2 December 2013, 5:08:39 pm
Compilación de CSipSimple Se sigue How To Build CSipSimple.

La versión que he descargado/compilado es la 1.01.00.r2336

cd ~/android/desirec2/D_CSipSimple
sudo apt-get install subversion git quilt unzip wget swig2.0 python make yasm
echo "#!/bin/bash" > env.sh
echo 'echo "Espero que hayas hecho un include/source (.) y no un exec."' >> env.sh
echo 'export ANDROID_NDK=/home/dario/android-ndk-r8e/' >> env.sh
echo 'export ANDROID_SDK=/home/dario/android-sdk-linux_x86/' >> env.sh
echo 'export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK' >> env.sh
. env.sh
svn checkout http://csipsimple.googlecode.com/svn/trunk/ CSipSimple-trunk
tar -cf t.tar CSipSimple-trunk
mv CSipSimple-trunk CSipSimple-trunk.orig
tar -xf t.tar 
rm t.tar
cd CSipSimple-trunk/CSipSimple
make
make VideoLibs
make CodecPackLibs
make CodecG729
cd ..
( cd ActionBarSherlock && android update project -p ./ ) 
( cd CSipSimple && android update project -p ./ ) 
cd CSipSimple
ant debug
find . -name "*apk"
adb -d install -r ./bin/CSipSimple-debug.apk


Se configura como en la entrada "Thursday, 12 January 2012, 5:09:20 pm", "UPDATE 20121008":
  • quitar la integración con Android (apariencia)
  • quitar la cancelación de echo (multimedia).

Friday, 29 November 2013, 9:56:12 am
20021009

Tuesday, 26 November 2013, 8:17:51 am
Repasando el ensamblador de dalvik (smali) Para futuras referencias:

Thursday, 14 November 2013, 9:31:33 am
Arreglando la compilación en hecl Con la actualización del SDK de android a la versión 17, se ha "estropeado" el make de los proyectos hecl. Para arreglarlo he añadido que use el aapt de la instalación antigua del SDK que hice para ncecessitas y un par de enlaces simbólicos para que encuentre las "tools" que ahora están en otro sitio:
su - dario
cd /home/dario/android-sdk-linux_x86/platforms/android-7/
ln -s /home/dario/android-sdk-linux_x86/build-tools/current tools
cd /home/dario/android-sdk-linux_x86/build-tools/
ln -s 17.0.0 current
su -
cd /opt
rm android-sdk-linux_86
ln -s necessitas/android-sdk-linux_x86 android-sdk-linux_86


(antes /opt/android-sdk-linux_86 apuntaba a /home/dario/android-sdk-linux_x86 )

Tuesday, 12 November 2013, 9:46:26 am
Haciendo una conexión TLS Están los siguientes tutoriales:

Tuesday, 30 July 2013, 9:56:22 pm
Actualizando con el RUU (desde windows) Hay que hacer lo siguiente:
  1. Poner el firmware stock (tal y como se describe en la siguiente entrada)
  2. Hacer un "relock" del bootloader; esto es, entrar en el bootloader con un "adb reboot bootloader" y después ahcer un:
    fastboot oem lock
  3. Volver a entrar en android, ponerlo en modo depuración y ejecutar el RUU en windows.

Tuesday, 30 July 2013, 9:10:15 pm
Restaurar un Desire C a firmware "stock" Está en esta thread:

El procedimiento es:
  1. Copiar el zip de la ROM en la tarjeta SD
  2. Arrancar el CWM (con "adb reboot recovery")
  3. Hacer un wipe/firmware-reset, wipe del dalvik cache y del cache
  4. aplicar el update desde el zip
  5. reiniciar el sistema
  6. entrar en el bootloader (con "adb reboot bootloader")
  7. Extraer del zip los ficheros recovery.img y boot.img.
  8. Flashear el kernel y el recovery con:
    fastboot flash recovery recovery.img
    fastboot flash boot boot.img
  9. reiniciar el teléfono

Flashear una actualización de la radio Se hace con fastboot (información aquí). Básicamente:
 fastboot flash radio path_to_radio_img

Friday, 26 July 2013, 9:24:53 pm
Problemas con la radio WiFi de los HTC de Metro y nuestro firmware El problema seguramente sea debido a la diferencia en el baseband (que hace que el RIL incluído en nuestro firmware no pueda comunicar con él). De hecho:
-Baseband
HTC de Luis10.11.98.09H_1.06.98.13M2
HTC de SICO10.08.98.09H_1.05.98.11M3

El error en cuestión es "Wifi ERROR", que está descrito en esta guía para resolverlo y si no funciona, hay una alternativa a partir del post 66 de esta otra.

En nuestro caso, necesitamos recuperar el RIL de la stock rom y ponérselo a la nuestra y para eso tendría que flashear el stock rom siguiendo esta guía.

Para el DesireC, el fichero de actualización extraído del RUU, hay que renombrarlo de rom.zip a PL01IMG.zip y ponerlo en la tarjeta de memoria. Despés arrancar con el HBOOT (VolDn+Power).

La rom se descarga de aquí:

Update 20130729 He obtenido el libhtc_ril.so y libril.so de dicho zip (descomrimiéndolo y después descomprimiendo el system.zip), y por si acaso también el rild (el paquete de instalación está en phonedevel:/home/dario/android/desirec-updateril/zip/ril-update.zip ). Lo he instalado en el teléfono de Luis pero sigue saleindo el "Wifi Error". Sin embargo la versión del libhtc_ril.so sí ha sido actualizada ya que si lo comprueba, tengo lo siguiente:
# teléfono de Luis
$ adb shell
shell@android:/ $ getprop "gsm.version.ril-impl"
HTC-RIL 4.0.0060HM (Oct 16 2012,20:13:04)
shell@android:/ $ exit

# teléfono de SICO
$ adb shell
shell@android:/ $  getprop "gsm.version.ril-impl"
HTC-RIL 4.0.0036HM (May 18 2012,14:13:40)
shell@android:/ $ exit


Thursday, 23 May 2013, 4:48:06 pm
Incluir un binario para android en un paquete Hay información sobre el tema aquí. Sobre donde extraer el binario, se puede seguir el howto mencionado antes para instalar un paqute usando memoria interna y estos dos de sacar un fichero desde los assets del apk y descomprimir un zip guardado en los assets del apk.

Es decir:
1. comprobar si el fichero existe
2. Si no existe copiarlo (ejemplo copyFile) y darle permisos (ejemplo runSystemCommand), sabiendo que lo queremos poner en Context.getApplicationInfo().dataDir.

Tuesday, 21 May 2013, 5:32:15 pm
Compilar binarios nativos para Android Hay dos tutoriales:

Update 20130522 Al final estoy siguiendo esta y esta. Básicamsnte lo que he hecho es:
phonedevel$ mkdir ~/android/toolchain-14
phonedevel$ /home/dario/android-ndk-r8e/build/tools/make-standalone-toolchain.sh --platform=android-14 --install-dir=/home/dario/android/toolchain-14

y el makefile.android de mi proyecto:

Makefile.android
# Android 4.0.4 is API Level 15, we put API Level 14 (4.0) as that is
# the most recent API level of the NDK
NDK_PATH=/home/dario/android-ndk-r8e/platforms/android-14/arch-arm/

CC=/home/dario/android/toolchain-14/bin/arm-linux-androideabi-gcc
CFLAGS=-Wall -g
CRTBEGIN=$(NDK_PATH)/usr/lib/crtbegin_dynamic.o 
CRTEND=$(NDK_PATH)/usr/lib/crtend_android.o
LDFLAGS=-L$(NDK)/usr/lib/ -lc -ldl

tctiprotocol: tctiprotocol.c simplesocket.c
        $(CC) -nostdlib $(CRTBEGIN) tctiprotocol.c simplesocket.c -o tctiprotocol $(LDFLAGS) $(CRTEND)

clean:
        rm -f *.o tctiprotocol

all: tctiprotocol



Tuesday, 14 May 2013, 6:08:09 pm
Obtener la MAC del punto de acceso Para hacer la localización nosotros. Es bastante fácil en android:
public String getMacId() {

    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    return wifiInfo.getBSSID();
}


Si está conectado al Wifi devuelve la MAC del AP, si no, devuelve null.

Esta información se podría enviar junto a las demás en el paquete UDP de los teléfonos.

Tuesday, 7 May 2013, 5:03:14 pm
Código para manejar apks desde android

Monday, 6 May 2013, 5:04:04 pm
Uso del logcat desde un programa No hay un API para ello, sino que lo que se hace es llamar al ejecutable logcat y leer de su salida: Ejemplo de uso de logcat en un programa Android (otros ejemplos).

Friday, 3 May 2013, 9:40:02 am
Corriendo el cçódigo de red en un aynctask y comunicandose con el Hay un ejemplo.

Friday, 3 May 2013, 9:08:30 am
Haciendo un timeout de forma independiente Se hace según dicen en este post (nota: auque mi código usa un runnable, el aynctask de android es practicamente lo mismo, pero con capacidad para devlver un valor):
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
  @Override
  public void run() {
      if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
          downloader.cancel(true);
  }
}, 30000 );

#if 0
This approach seems to be a good one. Just be sure 
to periodically check the value of isCancelled() in your 
AsyncTask's doInBackground method to end this 
method once the UI thread cancels it.
#endif


Tuesday, 30 April 2013, 4:04:06 pm
Sobre el problema de connect timeout que "no sale" en android Parece que hay bugs por ahí "desde siempre" (por lo menos desde Android 2.1 (el del Nexus One) hasta Android 4.2 (ultimo "report en el bug page"):

Es decir, si en el connect hay un problema para resolver el nombre, la función no vuelve.

Para Android 1.5 usando HttpClient, la solución es establecer el timeout dos veces:
HttpClient HTTPClient = new DefaultHttpClient(); 
HttpConnectionParams.setSoTimeout(HTTPClient.getParams(), 15000); 
HttpConnectionParams.setConnectionTimeout(HTTPClient.getParams(), 
15000); 


Tuesday, 30 April 2013, 4:00:09 pm
Otro ejemplo de socket programming en android Para ver si el connect se está haciendo correctamente. Según el ejemplo:
package org.vsector.client;

import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

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

public class ProcessingClientActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView text = (TextView) findViewById( R.id.textBox );

        Socket sock;
        try {
            text.append( "\nOpening and writing to socket... " );
            sock = new Socket();
            sock.connect( new InetSocketAddress( "some ip", 4444 ), 30000 );
            PrintWriter out = new PrintWriter( sock.getOutputStream(), true );
            out.println( "Hello!" );
            out.close();
            sock.close();
            text.append( "Done!" );
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            text.append( "Error: " + e + "\n" );
            text.append( e.getMessage() );
        } 

    }
}




Thursday, 25 October 2012, 5:18:43 pm
Java connect timeout En este post explican como ponerlo:

SocketAddress sockaddr = new InetSocketAddress(host, port);
Socket sock = new Socket();
sock.connect(sockaddr, 5000);


Wednesday, 24 October 2012, 7:33:34 pm
Compilar "a mano" el TcmAlarmas Resulta que si lo compilas "a mano" da unos errores más comprensibles. Se hace de la siguiente manera:
. ~/android/env
. ~/mirah/env
cd ~/jruby/tcm/src/es/sicosoft/tcm
mkdir -p es/sicosoft/tcm
cp /home/dario/jruby/tcm/bin/classes/es/sicosoft/tcm/MessageBuf.class es/sicosoft/tcm
mirahc -c :/home/dario/android/system/prebuilt/sdk/10/android.jar .


Wednesday, 24 October 2012, 5:52:20 pm
Actualizando el mirah a 0.0.12 Los pasos seguidos al completo han sido:
mv jruby jruby.ori
mkdir jruby
cd jruby/
wget http://jruby.org.s3.amazonaws.com/downloads/1.7.0/jruby-bin-1.7.0.tar.gz
tar -xvzf jruby-bin-1.7.0.tar.gz
echo '#!/bin/sh' > env.sh
echo 'echo "Espero que hayas hecho un include (.) de este fichero y no un exec"' >> env.sh
echo 'export JRUBY_HOME=/home/dario/jruby/jruby-1.7.0' >> env.sh
echo 'export PATH=$JRUBY_HOME/bin:$PATH' >> env.sh
. env.sh
jruby -v
gem -v
which gem
which rake
gem install mirah
mirah -e "puts 'hello world'"
gem install pindah
cp /home/dario/jruby.ori/jruby-1.6.5/lib/ruby/gems/1.8/gems/pindah-0.1.3.dev/templates/build.xml /home/dario/jruby/jruby-1.7.0/lib/ruby/gems/shared/gems/pindah-0.1.2/templates/build.xml
cp /home/dario/jruby.ori/jruby-1.6.5/lib/ruby/gems/1.8/gems/pindah-0.1.3.dev/lib/pindah.rb /home/dario/jruby/jruby-1.7.0/lib/ruby/gems/shared/gems/pindah-0.1.2/lib/pindah.rb
( cd ../jruby.ori && tar -cf - tcm ) | tar -xvf -



Tuesday, 9 October 2012, 8:02:57 pm
Cambios a TcmAlarmas En algunos teléfonos el TcmAlarmas no arranca automáticamente.

Resulta que el firmware que tienen en el teléfono de metro (tiene firmware de vodefone, no el original de HTC) es más estricto que el de nuestro teléfono, y hace una cosa que el nuestro debería hacer pero no hace: Android, a partir de la versión 3.x, cuando se instala una aplicación no le envía mensajes hasta que el usuario la haya arrancado al menos una vez. Eso provoca que no se arranque cuando se enciende el teléfono.

Como el TcmAlarmas no tiene icono en la lista de aplicaciones instaladas, el usuario no la puede arrancar y no puede salir de ese estado.

Para arreglar este problema he puesto al TcmAlarmas un icono y he hecho que cuando se pulse, arranque el servicio. Al rearrancar el teléfono ya se arranca la aplicación automáticamente; dar al icono sólo hace falta hacerlo una vez, cuando se instala la aplicación.


Tuesday, 9 October 2012, 7:46:01 pm
Me ha expirado el certificado de debug Al compilar con un "ant debug" he obtenido algo como:
...
/home/dario/android-sdk-linux_x86/tools/ant/build.xml:278: com.android.sdklib.build.ApkCreationException: Debug Certificate expired on 6/07/12 20:26
...

Según esta thread, basta con borrar el certificado expirado y el ant lo volverá a crear en la siguiente compilación:
 rm ~/.android/debug.keystore

NOTA: si se cambia el certificado que se usa para compilar para android, para instalar el nuevo apk, primero hay que desinstalar el antiguo (como los certificados no coinciden, no deja actualizar/instalar-encima).

Tuesday, 9 October 2012, 6:46:38 pm
Arrancar el tcmalarmas desde TcmWidget Se puede hacer usando el código que dicen aquí modificado para nuestro caso:
 Process proc = Runtime.getRuntime().exec(new String[]{"am","startservice","-n","es.sicosoft.tcmalarmas/es.sicosoft.tcmalarmas.TcmAlarmas"});
proc.waitFor();


Para saber si ya está arrancado, se utiliza este otro snippet:
private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("es.sicosoft.tcmalarmas.TcmAlarmas".equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}



Monday, 1 October 2012, 7:37:46 pm
Ejemplo de UI para mandar un mensaje en Android En este post hay un ejemplo de layout para componer un mensaje. En los fuentes de Android, hay otro ejemplo de layout.

Tutorial sobre comunicación por sockets en Java Información para hacerlo correctamente: Java networking: sockets

Monday, 24 September 2012, 7:34:38 pm
Algoritmo de sha1sum para Java Como los attachs desde el teléfono los voy a enviar "checksummed" usando sha1, se hace con MessageDigest, obteniendo la instancia así:
 MessageDigest.getInstance("SHA1");

El código de ejemplo que propone google para Android es (suponiendo que in es un InputStream):
  MessageDigest digester = MessageDigest.getInstance("SHA1");
  byte[] bytes = new byte[8192];
  int byteCount;
  while ((byteCount = in.read(bytes)) > 0) {
    digester.update(bytes, 0, byteCount);
  }
  byte[] digest = digester.digest();


Más información útil:
 private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray();

    public static String asHex(byte[] buf)
    {
        char[] chars = new char[2 * buf.length];
        for (int i = 0; i < buf.length; ++i)
        {
            chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
            chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
        }
        return new String(chars);
    }


Friday, 21 September 2012, 7:46:35 pm
Procedimiento para preparar un teléfono HTC Desire C para TCTI Este es el procedimiento que se ha enviado a Metro:

   El procedimiento súper-detallado es el siguiente.

   NOTA: El fichero imagen_cwm_desirec_20120921-1.zip ocupa 310 MB, por lo que no es apto para ser enviado por e-mail. Está en un CD y en:
phonedevel:/home/dario/android/htc-desirec/clockworkmod-beta2

===CUT===
PROCEDIMIENTO DE PREPARACION DE UN TERMINAL HTC DESIRE C PARA TCTI

¡ATENCION! El procedimiento borra todo el contenido del teléfono.

Antes de empezar: la tecla Power es la que enciende el terminal. Vol+ y Vol- son las teclas de volumen que están en el lado del terminal. Vol+ es la que está más arriba y Vol- es la de abajo.

1. Desbloquear el teminal
=========================

Preparativos, antes de continuar es necesario lo siguiente:
- un usuario/password en htcdev.com (obtener un un usuario en htcdev.com es gratuito)
- tener acceso a la cuenta de e-mail con la que te diste de alta en htcdev.com (allí te mandan el código de desbloqueo).
- tener el terminal y el cable USB para conectarlo al PC
- tener instalado el SDK de android para poder usar el "adb"

Procedmiento
1.1. Se entra en la web de http://htcdev.com
1.2. Se pone el login y su password
1.3. Vas a Developer Center y le das a "Unlock Bootloader"
1.4. En la parte de la derecha, seleccionas "All other supported models" y le das en "Begin Unlock Bootloader"
1.5. Le das a "YES" en el popup que informa de que esta operación puede anular la garantía, y marcas las dos casillas en el siguiente popup de que HTC puede cobrarte más en las reparaciones por haber desbloqueado el terminal.
1.6. Conectas el terminal encendido al PC y escribes en una ventana de comandos en el directorio del adb.exe:

 adb reboot-bootloader

1.7. En el bootloader vas con Vol+/Vol- a Bootloader y seleccionas con el botón de power
1.8. Ahora se elige fastboot
1.9. Reconectas el terminal al PC con el cable USB. Si no pone en letras blancas sobre fondo rojo "FASTBOOT USB", vuelves a seleccionar con Vol+/Vol-/Power lo de FASTBOOT.
(das siguiente en el tutorial de HTCDEV)
1.10. Si ya tienes el adb/fastboot instalado, ignoras los pasos del tutorial de HTC y vas al paso 8; si no, los sigues para instalar dichos programas. Hay que guardar el fastboot.exe en el mismo directorio en el que estaba el adb.exe para que te sirva la misma ventana de comandos.
1.11. Ejecutas el comando fastboot que te indican en la página de HTCl:

 fastboot oem get_identifier_token

1.12. Copia lo que ha salido por pantalla (tal y como indican en la página de HTC, es decir, desde la línea que pone "Identifier Token Start" hasta la línea "Identifier Token End", pero sin incluir el texto de "INFO" por el que empieza cada línea. Pega al cuadro en la página web de htcdev donde dice "My Identifier Token" y le das a submit.
1.13. Mira el correo, habrá un mensaje de HTC-Unlockbootloader@htc.com con un binario anexo llamado "Unlock_code.bin". Lo salvas en el directorio del adb.exe y continúas el tutorial de htcdev
1.14. Se hace el siguiente comando para hacer el unlock (el teléfono debe seguir conectado, con lo de "FASTBOOT USB" sobre color rojo):

 fastboot flash unlocktoken Unlock_code.bin

1.15. En el teléfono le das a "Yes" usando Vol- y después Power.
1.16. Con eso el teléfono hará un WIPE (borrado) de su contenido (aplicaciones, contactos, cuentas... todo) y arrancará pero ahora con el bootloader "unlocked".
1.17. Al hacer el gesto de desbloquear la pantalla, preguntará los datos de configuración inicial (Así, de memoria, sería: Español/España, solo Wifi para Internet, No actualizaciones automáticas, Sin Ubicación, Omitir datos antiguo teléfono, no mostrar más consejos rápidos).
1.18. Ir a ajustes (barra de notificacioes, ajustes), opciones de desarrollo (la penúltima), activar depuración USB.

2. Instalar el ClockWorkMod (añade al arranque de recovery la funcionalidad de instalar actualizaciones al sistema)
===========================

Preparativos, antes de continuar es necesario lo siguiente:
- que el terminal esté desbloqueado usando el procedimiento anterior
- haber guardado el fichero adjunto recovery-beta2.img en el directorio que contiene el adb.exe y el fastboot.exe (que se guardó en el procedimiento anterior).

2.1. Conectas el terminal encendido al PC y escribes en una ventana de comandos en el directorio del adb.exe:

 adb reboot-bootloader

2.2. En el bootloader vas con Vol+/Vol- a Bootloader y seleccionas con el botón de power
2.3. Ahora se elige fastboot
2.4. Reconectas el terminal al PC con el cable USB. Si no pone en letras blancas sobre fondo rojo "FASTBOOT USB", vuelves a seleccionar con Vol+/Vol-/Power lo de FASTBOOT.
2.5 En la ventana de comandos que está en el directorio del adb.exe, fastboot.exe y el fichero recovery-beta2.img, escribes:

fastboot flash recovery recovery-beta2.img

2.6a Si no vas a seguir la última parte del procedimiento, das a "Reboot" (Vol- para bajar, Power para seleccionar).
2.6b Si vas a seguir con la parte 3, puedes ir directamente al recovery yendo a "BOOTLOADER" y luego "RECOVERY".

3. Restaurar una copia del firmware con las aplicaciones ya instaladas y preconfiguradas
===================================
Preparativos, antes de continuar es necesario lo siguiente:
- que el terminal esté desbloqueado usando el procedimiento anterior
- que se haya instalado el ClockWorkMod por el procedimiento anterior
- tener una tarjeta SD en el teléfono.
- en dicha tarjeta SD se ha de tener descomprimido el zip imagen_cwm_desirec_20120921-1.zip (ocupa 310 MB, md5sum 7ad903972e13d5bce05121c460d406f5), con lo que ha quedado un directorio clockworkmod en el directorio raíz de la tarjeta. Si ya existiera un directorio clockworkmod, borrarlo antes de descomprimir el zip.

3.1 Conectas el terminal encendido al PC y escribes en una ventana de comandos en el directorio del adb.exe (si has hecho el paso 2.6b, este paso no es necesario, ya que el teléfono ya estará en modo recovery):

 adb reboot recovery

3.2 Das a Vol- hasta que aparece abajo "Back menu button enabled". Eso es dar tres vueltas a los menús (esto es una salvaguarda por si se entra accidentalmente al modo recovery).
3.3 Seleccionar "Backup and restore" usando Vol- hasta que esa opcción esté marcada y seleccionar con el Power.
3.4 Seleccionar "restore" usando Vol- hasta que esa opcción esté marcada y seleccionar con el Power.
3.5 Seleccionar el backup seleccionado (simplemente dar Power).
3.6 En la pantalla de confirmación Ir con Vol- lasta el "Yes - Restore" y seleccionar con Power.
3.7 Esperar unos 3 minutos a que se restaure el backup
3.8 Dar a Power en "reboot system now".

Con esto el terminal está pre-configurado. Sólo falta poner los datos correctos en el linphone y estará listo para su uso.

===CUT===

[recovery-beta2.img  application/octet-stream (6537638 bytes)]

Update (20121016): Para rehacer el fichero de imagen hay que seguir los siguientes pasos:
  1. Borrar el directorio clockworkmod de la tarjeta SD
  2. Rearrancar en modo recovery; estando el teléfono conectado a phonedevel, se hace en un terminal (como dario):
    $ . env ~/android/env.sh
    $ adb reboot recovery
  3. Una vez que haya arrancado el clockworkmod, se da al vol- hasta que aparece algo sobre "Backspace key enabled" en la parte de abajo de la oantalla (eso es, dar al Vol- hasta que ha pasado 3 veces sobre los menús)
  4. Elegir "Backup/Restore" y luego "Backup"
  5. Esperar a que haga el backup
  6. Ir a la opción de menú de reiniciar
  7. Conectar el teléfono a un PC como "Unidad de Disco" y hacer en el PC un .zip con el directorio "clockworkmod" del teléfono, poniéndole un nombre del estilo de imagen_cwm_desirec_AAAAMMDD-1.zip
  8. Grabar el ZIP a un CD para entregárselo a Metro. También dejar una copia del ZIP en
    phonedevel:/home/dario/android/htc-desirec/clockworkmod-beta2

Friday, 21 September 2012, 5:27:34 pm
Crear una imagen del sistema Flasheable para el HTC Desire C La información que he encontrado es esta:
  • Solve boot problem while installing custom ROMs. Dicen que una custom ROM tiene dos partes, un boot.img que se flashea con el bootloader en fastboot, y el zip de la ROM que se flashea desde el ClockWorkMod.
  • BootManager User Guide Indican cómo hacer las imágnes de las particiones para el bootmanager (que son las mismas que las que se necesitan para flashear).
  • Using the recovery Desde el ClockWorkMod, hay una opción que se llama "backup and restore", en "backup" hace una copia completa (boot, system, data, cache) a la tarjeta SD. Con "restore" restaura la copia más reciente ("advanced restore" permite elegir qué copia restaurar).
  • what is clockworkmod/blobs El backup se guarda en /clockworkmod. Si se quiere hacer uno de cero, borrar toda la carpeta y la volverá a generar al hacer el backup (ocupa 612MB en el que acabo de generar).
  • Superboot for Desire C Arrancar al bootloader se hace con el teléfono apagado, VolDown+Power. Si no funciona, quitar la batería, volverla a poner y reintentar.

Wednesday, 12 September 2012, 6:19:40 pm
Branding del icono del avión en la barra de notificaciones Se hace en el SystemUI.apk, modificando los dos archivos con el nombre:
 stat_sys_signal_flightmode.png

Modifico la entrada dedicada a hacer los cambios en el SystemUI.apk para el DesireC ("Thursday, 23 August 2012, 5:18:35 pm") para que incluyan también este branding (antes solo se desactivaba el icono de Ajustes de la barra de notificaciones).

Wednesday, 12 September 2012, 6:14:21 pm
Branding de la pantalla de lock y del texto de modo avión Dos partes, el icono del avión de la pantalla de lockscreen y cambiar el texto de "Airplane mode"/"Modo avión" a "Metro mode"/"Modo Metro". Se deja para otro post lo de cambiar el icono de la barra de notificaciones de un avión a un logo de metro.

Cambiar el icono del avión de la pantalla de lock por un logo de metro
cd ~/android
mkdir brandinglock-desirec
cd brandinglock-desirec
mkdir zip


Y los siguientes ficheros:
 ~/android/brandinglock-desirec/make-branding.sh
#!/bin/bash
cp ../desirecsystemapp/HtcLockScreenLite.* .
rm -rf t
mkdir t
cd t
mkdir -p res/drawable-mdpi/
cp ../logometro_htc.png res/drawable-mdpi/icon_intro_airplane.jpg
unzip ../HtcLockScreenLite.apk resources.arsc
sed -i "s/Airplane mode/  Metro  mode/g;s/Modo avión/ Modo Metro/g" resources.arsc
zip -r ../HtcLockScreenLite.apk resources.arsc res/drawable-mdpi/icon_intro_airplane.jpg


 ~/android/brandinglock-desirec/htclockscreenlite2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
rm zip/htclockscreenlite-update.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip 
rm system/app/Trebuchet.apk
cp ../../HtcLockScreenLite.apk system/app/
cp ../../HtcLockScreenLite.odex system/app/
zip -pr ../htclockscreenlite-update.zip .
cd ..
rm -rf t
adb push htclockscreenlite-update.zip /sdcard/
adb reboot recovery


Aparte, se ha hecho un logo de metro en png con fondo transparente que se ha salvado como logometro_htc.png:
 logometro_htc.png
Tamaño del canvas: 250x170, con el logo de metro centrado horizontalmente, ligeramente desplazado hacia arriba.
Tamaño del logo de metro: 170x102

UPDATE 20131125 En el firmware 2.x del ICS de DesireC el procedimiento anterior no cambia el texto. Para conseguir cambiar el texto se ha cambiado usando smali, de la siguiente manera:
mkdir smali-desirec/
cd smali-desirec/
cp ../brandinglock-desirec/HtcLockScreenLite.apk .
cp ../brandinglock-desirec/HtcLockScreenLite.odex .
cp ../desirecsystemframework/*.odex .
cp ../desirecsystemframework/*.jar .
cp ../smali/*smali* .
cp ../smali/*.sh .
java -Xmx512m -jar baksmali.jar -a 15 -c :com.htc.fusion.fx.jar -x HtcLockScreenLite.odex
(
cd out/com/htc/lockscreen
# quitamos el invoke-virtual y el move-result-object v23 y lo sustituimos por nuestra constante
sed -i "29933,29935d" HtcLockScreen.smali
sed -i '29933aconst-string v23, "METRO de MADRID"' HtcLockScreen.smali
)
java -jar smali.jar -a 15 -o classes.dex out
zip -r HtcLockScreenLite.apk classes.dex 
./htclockscreenlite2zip-and-phone.sh


El diff (que he puesto con un sed arriba, pero realmente lo edité a mano):
--- smali-desirec.orig/out/com/htc/lockscreen/HtcLockScreen.smali       2013-11-25 08:58:04.256381132 +0100
+++ smali-desirec/out/com/htc/lockscreen/HtcLockScreen.smali    2013-11-22 17:35:41.000505154 +0100
@@ -29930,9 +29930,7 @@
 
     const v27, 0x204012d
 
-    invoke-virtual/range {v26 .. v27}, Landroid/content/Context;->getString(I)Ljava/lang/String;
-
-    move-result-object v23
+    const-string v23, "METRO de MADRID"
 
     .line 1920
     .local v23, title:Ljava/lang/String;




 htclockscreenlite2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
mkdir -p zip
rm zip/htclockscreenlite2-update.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip 
sed -i '/Installing files/arun_program("/sbin/busybox", "rm", "/system/app/HtcLockScreenLite.odex");' META-INF/com/google/android/updater-script
rm system/app/Trebuchet.apk
cp ../../HtcLockScreenLite.apk system/app/
zip -pr ../htclockscreenlite2-update.zip .
cd ..
rm -rf t
adb push htclockscreenlite2-update.zip /sdcard/
adb reboot recovery


Cambio del texto de modo avión por modo metro

cd ~/android
mkdir brandingmetromode-desirec
cd brandingmetromode-desirec
mkdir zip


Y los siguientes ficheros:
 ~/android/brandingmetromode-desirec/make-branding.sh
#!/bin/bash
cp ../desirecsystemframework/com.htc.resources.* .
cp ../desirecsystemframework/framework-res.* .
rm -rf t
mkdir t
cd t
unzip ../com.htc.resources.apk resources.arsc
sed -i "s/Airplane mode/  Metro  mode/g;s/Modo avión/ Modo Metro/g" resources.arsc
zip -r ../com.htc.resources.apk resources.arsc
cd ..
rm -rf t
mkdir t
cd t
unzip ../framework-res.apk resources.arsc
sed -i "s/Airplane mode/  Metro  mode/g;s/Modo avión/ Modo Metro/g" resources.arsc
zip -r ../framework-res.apk resources.arsc
cd ..


 ~/android/brandingmetromode-desirec/frameworkres2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
rm zip/frameworkres-update.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip 
rm system/app/Trebuchet.apk
rmdir system/app
mkdir system/framework
cp ../../com.htc.resources.* system/framework/
cp ../../framework-res.* system/framework/
zip -pr ../frameworkres-update.zip .
cd ..
rm -rf t
adb push frameworkres-update.zip /sdcard/
adb reboot recovery



UPDATE 20131125 Por completitud, también he editado dicha cadena en el systemui (aunque con el cambio anterior, ni el frameworkres ni el systemui serían realmente necesarios):
mkdir 7_brandinglocksystemui
cd 7_brandinglocksystemui
cp ../4_systemui/smali-desirec/SystemUI.apk .
cp /home/dario/android/smali-desirec/stat_sys_signal_metro_small.png .
cp /home/dario/android/smali-desirec/stat_sys_signal_metro_big.png .
rm -rf t
mkdir t
cd t
unzip ../SystemUI.apk resources.arsc
sed -i "s/Airplane mode/  Metro  mode/g;s/Airplane Mode/  Metro  Mode/g;s/Modo avión/ Modo Metro/g;s/Modo Avión/ Modo Metro/g" resources.arsc
mkdir -p res/drawable-sw600dp-mdpi/../drawable-mdpi
cp ../stat_sys_signal_metro_small.png res/drawable-mdpi/stat_sys_signal_flightmode.png
cp ../stat_sys_signal_metro_big.png res/drawable-sw600dp-mdpi/stat_sys_signal_flightmode.png
zip -r ../SystemUI.apk resources.arsc res/drawable-mdpi/stat_sys_signal_flightmode.png res/drawable-sw600dp-mdpi/stat_sys_signal_flightmode.png
./systemui2zip-and-phone.sh


 systemui2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
mkdir -p zip
rm zip/systemui-update2.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip 
sed -i '/Installing files/arun_program("/sbin/busybox", "rm", "/system/app/SystemUI.odex");' META-INF/com/google/android/updater-script
rm system/app/Trebuchet.apk
cp ../../SystemUI.apk system/app/
zip -pr ../systemui-update2.zip .
cd ..
rm -rf t
adb push systemui-update2.zip /sdcard/
adb reboot recovery


Friday, 31 August 2012, 6:48:56 pm
Poner el adb start-server en el inicio aquí hay un pequeño tutorial. La script que he puesto es:
 /etc/init.d/adb
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          adb
# Required-Start:    $syslog $local_fs $remote_fs
# Required-Stop:     $syslog $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Android Debug Bridge (adb)
# Description:       adb make commands to connected android phones possible
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

. /home/dario/android/env.sh
ADB=/home/dario/android-sdk-linux_x86/platform-tools/adb
case "$1" in
        start)
                # Start daemon.
                echo -n "Starting ADB: "
                $ADB start-server
                ;;
        stop)
                # Stop daemons.
                echo -n "Shutting ADB: "
                $ADB kill-server
                ;;
        restart)
                $0 stop
                $0 start
                ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
esac

exit 0


Y desupués, para activarla:
cd /etc/init.d/
chmod a+x adb
chown root:root adb
update-rc.d adb defaults


NOTA: Es un agujero de seguridad ya que ejecuta como root un programa instalado por el usuario (el adb), aparte de que incluye la script de "env" de dicho usuario...

Monday, 27 August 2012, 4:49:49 pm
Notas sobre el "unbrick" de HTC One V Para algunos casos, se puede seguir esta guía: working fix for One V bricking (how to exit Qualcomm's QHSUSB_DLOAD mode)

Thursday, 23 August 2012, 6:22:48 pm
Modificar el android.policy.jar para el DesireC

cd ~/android
mkdir smali-desirec-powerbutton
cd smali-desirec-powerbutton/
cp ../desirecsystemapp/SystemUI.* .
cp ../desirecsystemframework/*.odex .
cp ../desirecsystemframework/*.jar .
cp ../smali/*smali*  .
cp ../smali/*.sh  .
cp ../smali-onev-powerbutton/androidpolicy2zip-and-phone.sh .
mkdir zip


Edito el androidpolicy2zip-and-phone.sh para que ponga tanto el zip como el odex, quedando así:
 androidpolicy2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
rm zip/androidpolicy-update.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip
rm system/app/Trebuchet.apk
rmdir system/app
mkdir system/framework/
cp ../../android.policy.jar system/framework/
cp ../../android.policy.odex system/framework/
zip -pr ../androidpolicy-update.zip .
cd ..
rm -rf t
adb push androidpolicy-update.zip /sdcard/
adb reboot recovery


Entonces hacemos con lo siguiente:

java -Xmx512m -jar baksmali.jar -a 15 -c :com.orange.authentication.simcard.jar:HTCExtension.jar -x android.policy.odex 
java -Xmx512m -jar baksmali.jar -a 15 -c :com.orange.authentication.simcard.jar:HTCExtension.jar -x android.policy.odex 
vi out/com/android/internal/policy/impl/GlobalActions.smali


Aquí se borra la línea 874, que es la que hace el "Add" del menú para Toggleaction que controla el AirplaneMode. Se salva y se sale y entonces:

java -jar smali.jar -a 15 -o classes.dex out
zip -r android.policy.jar classes.dex
adb shell
su
mount -o remount,rw /system
cd /system
mkdir tmp
chmod 777 tmp
exit
exit
adb push ../smali-onev-powerbutton/all_for_deodexing_reodexing/dexopt-wrapper /system/tmp
adb push ../smali-onev-powerbutton/all_for_deodexing_reodexing/busybox /system/tmp/
adb push android.policy.jar /system/tmp
adb push ../desirecsystemframework/android.policy.odex /system/tmp/android.policy.odex.ori
adb shell
su
cd /system/framework
chmod 755 ../tmp/dexopt-wrapper ../tmp/busybox
../tmp/dexopt-wrapper /system/tmp/android.policy.jar /system/tmp/android.policy.odex /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/HTCDev.jar:/system/framework/HTCExtension.jar:/system/framework/filterfw.jar:/system/framework/com.htc.android.bluetooth.jar:/system/framework/wimax.jar:/system/framework/usbnet.jar:/system/framework/com.orange.authentication.simcard.jar
../tmp/busybox dd if=/system/tmp/android.policy.odex.ori of=/system/tmp/android.policy.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
exit
exit
adb pull /system/tmp/android.policy.odex .
adb pull /system/tmp/android.policy.jar .
./androidpolicy2zip-and-phone.sh 


Y entonces el teléfono se queda bloqueado en la pantalla de arranque... :-(

Para arreglarlo he vuelto a hacer lo del dexopt:

adb shell
su
mount -o remount,rw /system
cd /system/framework
rm /system/framework/android.policy.odex
../tmp/dexopt-wrapper /system/framework/android.policy.jar /system/framework/android.policy.odex /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/HTCDev.jar:/system/framework/HTCExtension.jar:/system/framework/filterfw.jar:/system/framework/com.htc.android.bluetooth.jar:/system/framework/wimax.jar:/system/framework/usbnet.jar:/system/framework/com.orange.authentication.simcard.jar
../tmp/busybox dd if=/system/tmp/android.policy.odex.ori of=/system/framework/android.policy.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
../tmp/busybox md5sum /system/framework/android.policy.odex
reboot


Y con ese nuevo .odex sí que funciona (extrañamente el generado sin tener el android.policy.jar en /system/framework queda corrupto).

Por último, para actualizar el .zip:

adb pull /system/framework/android.policy.odex .
adb pull /system/framework/android.policy.jar .
./androidpolicy2zip-and-phone.sh 


Y para borrar el directorio temporal:

adb shell
su
rm /system/tmp/*
rmdir /system/tmp
mount -o remount,ro /system
exit
exit


Thursday, 23 August 2012, 5:18:35 pm
Modificar el SystemUI.apk para el DesireC
(Updated 20120912: Se ha añadido la parte de "branding": se ha cambiado el icono del avión por uno propio, de metro; los ficheros nuevos son png transparentes: stat_sys_signal_metro_small.png: PNG image data, 25 x 25 ; stat_sys_signal_metro_big.png: PNG image data, 32 x 32 ).
cd ~/android
. env.sh 
mkdir smali-desirec
cd smali-desirec/
cp ../desirecsystemapp/SystemUI.* .
cp ../desirecsystemframework/*.odex .
cp ../desirecsystemframework/*.jar .
cp ../smali/*smali* .
cp ../smali/*.sh .
cp ../smali-onev/systemui2zip-and-phone.sh .
mkdir zip
java -Xmx512m -jar baksmali.jar -a 15 -c :com.htc.fusion.fx.jar -x SystemUI.odex
vi out/com/android/systemui/statusbar/phone/PhoneStatusBar.smali


En este punto se ve que la parte que nos interesa está a partir del comentario ".line 528", y lo que tenemos que borrar es el ".line 532", es decir, esto:
    .line 532
    iget-object v11, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mSettingsButton:Lcom/android/systemui/statusbar/phone/PhoneStatusBar$StatusBarButtonView;

    iget-object v12, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mSettingsButtonListener:Landroid/view/View$OnClickListener;

    invoke-virtual {v11, v12}, Lcom/android/systemui/statusbar/phone/PhoneStatusBar$StatusBarButtonView;->setOnClickListener(Landroid/view/View$OnClickListener;)V


Para desactivar el icono de settings, también he hecho el siguiente cambio (aunque lo que pongo de setVisibility a 0 no hace nada y se podría quitar)
dario@phonedevel:~/android/smali-desirec$ diff -Naur /tmp/PhoneStatusBar.smali  out/com/android/systemui/statusbar/phone/PhoneStatusBar.smali
--- /tmp/PhoneStatusBar.smali	2012-09-12 18:54:33.798816181 +0200
+++ out/com/android/systemui/statusbar/phone/PhoneStatusBar.smali	2012-09-12 19:19:42.866815736 +0200
@@ -9929,6 +9929,18 @@
 
     invoke-virtual {v11, v12, v13}, Landroid/widget/LinearLayout;->addView(Landroid/view/View;I)V
 
+    iget-object v11, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mSettingsButton:Lcom/android/systemui/statusbar/phone/PhoneStatusBar$StatusBarButtonView;
+    
+    const/4 v12, 0x0
+
+    invoke-virtual {v11, v12}, Lcom/android/systemui/statusbar/phone/PhoneStatusBar$StatusBarButtonView;->setEnabled(Z)V
+
+    iget-object v11, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mSettingsButton:Lcom/android/systemui/statusbar/phone/PhoneStatusBar$StatusBarButtonView;
+    
+    const/4 v12, 0x0
+
+    invoke-virtual {v11, v12}, Lcom/android/systemui/statusbar/phone/PhoneStatusBar$StatusBarButtonView;->setVisibility(I)V
+
     .line 534
     const v11, 0x7f0e007d


Por último:
java -jar smali.jar -a 15 -o classes.dex out
zip -r SystemUI.apk classes.dex
mkdir -p res/drawable-sw600dp-mdpi/../drawable-mdpi
cp stat_sys_signal_metro_small.png res/drawable-mdpi/stat_sys_signal_flightmode.png
cp stat_sys_signal_metro_big.png res/drawable-sw600dp-mdpi/stat_sys_signal_flightmode.png
zip -r SystemUI.apk res/drawable-mdpi/stat_sys_signal_flightmode.png res/drawable-sw600dp-mdpi/stat_sys_signal_flightmode.png
./systemui2zip-and-phone.sh


Y se instala el systemui-update.zip con el clockworkmod, como siempre.


Wednesday, 22 August 2012, 7:59:05 pm
Instalar el CWM recovery y el supersu en el DesireCGolf Se sigue esta guía :

(updated 20120823: se pone el systemui-update.zip y el androidpolicy-update.zip)

. ~/android/env.sh
cd ~/android/htc-desirec/clockworkmod-beta2
adb push CWM-SuperSU-v0.94.zip  /sdcard/
adb push /home/dario/android/system/zip/trebuchet-update.zip /sdcard/
adb push /home/dario/android/smali-desirec/zip/systemui-update.zip  /sdcard/
adb push /home/dario/android/smali-desirec-powerbutton/zip/androidpolicy-update.zip /sdcard
adb reboot bootloader
../fastboot flash recovery recovery-beta2.img 
(se rearranca el teléfono otra vez y se hace
   adb reboot recovery
o bien se va en el fastboot a bootloader y se elige recovery)


Y después se instalan todos los zip normalmente (realmente solo son necesarios: trebuchet, systemui, androidpolicy, el supersu es sólo para desarrollo). Se pueden instalar todos seguidos, en el clockworkmod:

dar vol- hasta que aparece lo del back button enabled
install from zip
seleccionar el trebuchet-update.zip
seleccionar el systemui-update.zip
seleccionar el androidpolicy-update.zip
(sólo si se va a usar para desarrollo, seleccionar el CWM-SuperSU-v0.94.zip)
parent dir
Wipe cache
advanced
wipe dalvik cache
parent dir
reboot


Al arrancar otra vez y desbloquear la pantalla, preguntará que elijas el homescreen (HTC Sense o Trebuchet): hay que activar "utilizar de forma predeterminada" y elegir Trebuchet.

Por último, para instalar las aplicaciones:
cd /home/dario
./tcmandroid-instalartodo.sh
./tcmandroid-instalarlinphone.sh
./tcmandroid-instalarlogcat.sh 


Por último, para configrar trebuchet, dar al botón "circular", meter la clave, dejar pulsado el botón de los cuadraditos, Ajustes trebuchet, pantalla inicio, y ahí cambiar:
  • pantallas de inicio a 1
  • desactivar barra de búsqueda
Dar a volver a la pantalla de inicio, (el botón de la casita en la parte de abajo del teléfono), volver a entrar en el botón circular, ir a widgets, buscar Tele Control Movil (cuarta pantalla de widgets, abajo a la derecha) y dejarle pulsado hasta que lo puedas colocar en la pantalla de inicio.
Dar a volver a la pantalla de inicio, (el botón de la casita en la parte de abajo del teléfono), volver a entrar en el botón circular, ir a aplicaciones, buscar linphone y dejarle pulsado hasta colcarlo en la pantalla de inicio.


NOTA: El recovery que he puesto tiene un BUG/safeguard: hay que pulsar Vol- hasta que aparece abajo el texto de "Back key enabled", y entonces se puede seleccionar con el botón de power.


Wednesday, 22 August 2012, 7:45:06 pm
Desbloqueando el bootloader de un Desire C Golf Los pasos seguidos son:
(updated 31082012: se incluyen todos los pasos usados para desbloquear el segundo terminal DesireC de SICO).
1. Se entra en la web de http://htcdev.com
2. Se pone el login de sicosoft y su password
3. Vas a Developer Center y le das a "Unlock Bootloader"
4. En la parte de la derecha, seleccionas "All other supported models" y le das en "Begin Unlock Bootloader"
5. Le das a "YES" en el popup que informa de que esta operación puede anular la garantía, y marcas las dos casillas en el siguiente popup de que HTC puede cobrarte más en las reparaciones por haber desbloqueado el terminal.
6. Conectas el terminal encendido al PC y escribes:
 adb reboot-bootloader
7. En el bootloader vas con Vol+/Vol- a Bootloader y seleccionas con el botçon de power
8. Ahora se elige fastboot
9. Reconectas el terminal al PC con el cable USB. Si no pone en letras blancas sobre fondo rojo "FASTBOOT USB", vuelves a seleccionar con Vol+/Vol-/Power lo de FASTBOOT.
(das siguiente en el tutorial de HTCDEV)
10. Si ya tienes el adb/fastboot instalado, ignoras los pasos del tutorial de HTC t vas al paso 8; si no, los sigues para instalar dichos programas. Para el caso de sico, en phonedevel:
 cd ~/android/htc-desirec 
11. Ejecutas el comando fastboot que te indican, en el caso de phonedevel:
./fastboot oem get_identifier_token 2> info-desirec-2.txt
grep INFO info-desirec-2.txt  | sed  "0,/cut/d" | sed s/^INFO//g

12. Copia y pega lo que ha salido por pantalla a donde dice "My Identifier Token" en la web de htcdev y le das a submit.
13. Mira el correo (en el caso de sico, en el webmail entra en la cuenta tcti), habrá un mensaje de HTC-Unlockbootloader@htc.com con un binario anexo llamado "Unlock_code.bin". Lo salvas y continúas el tutorial de htcdev
14. Se hace el siguiente comando para hacer el unlock (el teléfono debe seguir conectado, con lo de "FASTBOOT USB" sobre color rojo):
./fastboot flash unlocktoken Unlock_code.bin
15. En el teléfono le das a Yes usando Vol-/Power.
16. Con eso el teléfono hará un WIPE (borrado) de su contenido (aplicaciones, contactos, cuentas... todo). y arrancará pero ahora con el bootloader "unlocked".
17. Al hacer el gesto de desbloquear la pantalla, preguntará los datos de configuración inicial (Así, de memoria, sería: Español/España, solo Wifi para Internet, No actualizaciones automáticas, Sin Ubicación, Omitir datos antiguo teléfono, no mostrar más consejos rápidos).
18. Ir a ajustes (barra de notificacioes, ajustes), opciones de desarrollo (la penúltima), activar depuración USB.

NOTA: Nosotros unlockeamos el primer DesireC 15 de Junio (la clave de unlock está en dario@phonedevel:~/android/htc-desirec/Unlock_code.bin, y hay un backup que se llama todo2-pre-unlock). El segundo DesireC se ha hecho el unlock el 31 de Agosto, y la clave de Unlock se ha quedado como "Unlock_code2.bin".

Wednesday, 22 August 2012, 5:39:51 pm
Cómo quitar el AirplaneMode del powermenu usando smali en el OneV Ha funcionado, y a la primera :-).

Para desensamblar el odex y editar se ha hecho lo siguiente:
cd ~/android
mkdir smali-onev-powerbutton
cd smali-onev-powerbutton/
cp ../onevsystemapp/SystemUI.* .
cp ../onevsystemframework/*.odex .
cp ../onevsystemframework/*.jar .
cp ../smali/*smali* .
cp ../smali/*.sh .
mkdir zip
java -Xmx512m -jar baksmali.jar -a 15 -c :com.orange.authentication.simcard.jar:HTCExtension.jar -x android.policy.odex 
cd out
vi com/android/internal/policy/impl/GlobalActions.smali 


Ahí he borrado la línea 874, que es donde hace el add en un arraylist que usa para crear el diálogo del poweroff.

 710: .method private createDialog()...
 ...
 867: add SinglePressAction
 ...
 874: add ToggleAction (que es la del AirplaneMode)
 ...
1073: .end method


Por último, para compilar:
cd ..
java -jar smali.jar -a 15 -o classes.dex out
zip -r android.policy.jar classes.dex


Partiendo del systemui2zip-and-phone.sh he hecho el siguiente script, que borra el odex correspondiente al instalar:
 androidpolicy2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
rm zip/androidpolicy-update.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip
sed -i '/Installing files/arun_program("/sbin/busybox", "rm", "/system/framework/android.policy.odex");' META-INF/com/google/android/updater-script
rm system/app/Trebuchet.apk
rmdir system/app
mkdir system/framework/
cp ../../android.policy.jar system/framework/
zip -pr ../androidpolicy-update.zip .
cd ..
rm -rf t
adb push androidpolicy-update.zip /sdcard/
adb reboot recovery



Y por último solo queda instalarlo en el teléfono:

./androidpolicy2zip-and-phone.sh
(y en el teléfono los siguientes pasos)
install from zip
seleccionar el systemui-update.zip
parent dir
Wipe cache
advanced
wipe dalvik cache
parent dir
reboot


PEEERO entonces el teléfono no funciona, tiene un problema al arrancar. básicamente es que si se deodexa el android.policy.jar, también hay que hacer lo propio con los paquetes que dependen de él y están en odex. En mi caso se queda en la pantalla de "htc one" al arrancar, pero el adb funciona y en el logcat se ven cosas como las siguientes:
D/dalvikvm( 5109): Unable to process classpath element '/system/framework/usbnet.jar'
I/dalvikvm( 5109): DexOpt: mismatch dep name: '/data/dalvik-cache/system@framework@android.policy.jar@classes.dex' vs. '/system/framework/android.policy.odex'
E/dalvikvm( 5109): /system/framework/com.orange.authentication.simcard.jar odex has stale dependencies
I/dalvikvm( 5109): Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
D/dalvikvm( 5109): Unable to process classpath element '/system/framework/com.orange.authentication.simcard.jar'
E/JNIHelp ( 5109): Native registration unable to find class 'com/android/server/Watchdog', aborting
F/libc    ( 5109): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
I/DEBUG   ( 1443): debuggerd: 2012-08-22 18:34:17


Lo cual significa que android.policy ha de estar en formato odex, no en classes.dex.

Para ello habrá que usar el

El BOOTCLASSPATH que pone en el init.rc es el siguiente:

export BOOTCLASSPATH /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/HTCDev.jar:/system/framework/HTCExtension.jar:/system/framework/filterfw.jar:/system/framework/com.htc.android.bluetooth.jar:/system/framework/wimax.jar:/system/framework/usbnet.jar:/system/framework/com.orange.authentication.simcard.jar


Entonces, para reodexearlo, he hecho adicionalmente lo siguiente:
adb shell
su
mount -o remount,rw /system
mkdir /system/tmp
chmod 777 /system/tmp/
exit
exit
adb push ../onevsystemframework/android.policy.odex /system/tmp/android.policy.odex
mkdir all_for_deodexing_reodexing/
cd all_for_deodexing_reodexing/
wget "http://forum.xda-developers.com/attachment.php?attachmentid=681408&d=1312808874" -O all_for_deodexing_reodexing.zip
unzip all_for_deodexing_reodexing.zip
adb push dexopt-wrapper /system/tmp
adb shell
su
cd /system/framework/
chmod 755 ../tmp/dexopt-wrapper
../tmp/dexopt-wrapper /system/framework/android.policy.jar /system/framework/android.policy.odex /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/HTCDev.jar:/system/framework/HTCExtension.jar:/system/framework/filterfw.jar:/system/framework/com.htc.android.bluetooth.jar:/system/framework/wimax.jar:/system/framework/usbnet.jar:/system/framework/com.orange.authentication.simcard.jar
busybox dd if=/system/tmp/android.policy.odex of=/system/framework/android.policy.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
mount -o remount,rw /system
reboot


Entonces el teléfono se ha reiniciado y al arrancar ha funcionado todo perfectamente, y en el poweroff-menu (long-press) ya sólo aparecen las opciones de apager y reiniciar :-).

MISION CUMPLIDA :-b.

Recapitulando: cierre del terminal completado Con esto el terminal ya está completamente cerrado a nivel de usuario:
1. El shell (trebuchet de CM9) ha sido modificado para que pida clave antes de entrar en el menú de aplicaciones
2. El shell (trebuchet de CM9) ha sido modificado para que se puedan bloquear/desbloquear el mover los lanzadores/fondo de pantalla de la homescreen (usando la opción de poner/quitar la barrita separadora)
3. El SystemUI.apk modificado para que no llame al quicksettings cuando se le pulsa en la barra de notificaciones
4. El android.policy.jar modificado para que el poweroff menu no tenga la opción de AirplaneMode.

Posibles mejoras:
  • Elegir otra clave. Ahora está puesta "8888".
  • Cambiar el incono de quicksettings y el texto correspondiente, para que Ponga el logo de metro y debajo sin texto.
  • Cambiar lo de "Modo avión está activado" por "Modo Metro de Madrid está activado".

Wednesday, 22 August 2012, 4:40:24 pm
Notas que tengo por aquí sobre el Samsung Galaxy Player 4 El terminal "murió" en las pruebas que hizo Metro, pero por dejarlo apuntado, aquí están los enlaces a la información sobre camiarle el firmware:


Tuesday, 21 August 2012, 6:57:15 pm
El menú del "long press power button" se llama "power menu" Y aquí hay un tutorial para añadir entradas en él:

En el anterior tutorial nos da la información que necesitamos para nuestro "hack":
  • los callbacks para el menú de power están en el "android.policy.jar"
  • los recursos (iconos, textos) en el "framework-res.apk".
  • Dentro de los smali del "android.policy.jar", tenemos el
    com/android/internal/policy/impl/GlobalActions.smali, que es el que tiene el toggle que necesitamos "invalidar"; de hecho mencionan las siguientes funciuones miembro:
    .field private mAirplaneModeOn:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
    .field private mAirplaneState:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction$State;

Sobre lo de modificar el classes.dex del android.policy.jar:
Siguiendo la información de la guía anterior, para modificar el android.policy.jar, basta hacer un "deodex" del android.policy.odex, y después meter el classes.dex recompilado en el android.policy.jar.


Tuesday, 21 August 2012, 5:36:59 pm
A vueltas con el smali otra vez: cómo deshabilitar el botón quicksettings en el OneV El siguiente procedimiento (que ha funcionado) tiene como objetivo modificar el smali (desensamblado de un fichero de dalvik) para quitar de en medio el "quicksettings" del panel de notificaciones del HTC. Para eso viene bien la siguiente información:

Se he hecho lo siguiente para descompilar el smali:
cd /home/dario/android/
mkdir smali-onev
cd smali-onev/
cp ../onevsystemapp/SystemUI.* .
cp ../onevsystemframework/*.odex .
cp ../onevsystemframework/*.jar .
cp ../smali/*smali* .
cp ../smali/*.sh .
mkdir zip
java -Xmx512m -jar baksmali.jar -a 15 -c :com.htc.fusion.fx.jar -x SystemUI.odex
cd out/
vi ./com/android/systemui/statusbar/phone/PhoneStatusBar.smali


En este punto hay que irse al comentario que pone ".line 502", y editar el smali de esas líneas para que no ponga el botón...

Por ahora que borrado lo que corresponde al ".line 506", que es cuando pone el onclicklistener al botón (con eso nos basta).

Por último, para compilar:
cd ..
java -jar smali.jar -a 15 -o classes.dex out
zip -r SystemUI.apk classes.dex


He añadido al systemui2zip-and-phone.sh que borre el odex:
 systemui2zip-and-phone.sh
#!/bin/sh
. ~/android/env.sh
rm zip/systemui-update.zip
cd zip
rm -rf t
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip
sed -i '/Installing files/arun_program("/sbin/busybox", "rm", "/system/app/SystemUI.odex");' META-INF/com/google/android/updater-script
rm system/app/Trebuchet.apk
cp ../../SystemUI.apk system/app/
zip -pr ../systemui-update.zip .
cd ..
rm -rf t
adb push systemui-update.zip /sdcard/
adb reboot recovery



Y por último solo queda instalarlo en el teléfono:

./systemui2zip-and-phone.sh
(y en el teléfono los siguientes pasos)
install from zip
seleccionar el systemui-update.zip
parent dir
Wipe cache
advanced
wipe dalvik cache
parent dir
reboot


y ¡HA FUNCIONADO! El callback ya no está instalado, con lo que el quicksettings de la barra de notificaciones no funciona.


Monday, 20 August 2012, 7:55:33 pm
NO FUNCIONO la prueba realizada cambiando solo el SystemUI.dex Se ha cambiado en el SystemUI.dex del OneV la segunda ocurrencia de 82 00 0e 7f por 05 00 08 7f (cambiar la primera ocurrencia ya lo probé antes de las vacaciones), que según mis notas es:
0x7f0e0082 settings_button:I -- el boton
0x7f080014 status_bar_settings_settings_button:I -- la cadena

Little endian 


0x7f080005 status_bar_clear_all_button:I


Los pasos seguidos han sido:

cd ~/android/smali
cp SystemUI.odex.ori.onev SystemUI.odex
./bin2txt.sh SystemUI.odex SystemUI.odex.txt
vi SystemUI.odex.txt
(cambiar la segunda ocurrencia de 82 00 0e 7f por 05 00 08 7f)
:wq
./txt2bin.sh SystemUI.odex.txt  SystemUI.odex
cp SystemUI.apk.ori.onev SystemUI.apk
./systemui2zip-and-phone.sh
(en el teléfono)
install from zip
seleccionar el systemui-update.zip
parent dir
Wipe cache
advanced
wipe dalvik cache
parent dir
reboot



Monday, 20 August 2012, 5:58:33 pm
Terminal alternativo: Sony Xperia Ray Tiene el mismo precio que el HTC Desire C Golf, pero mejor procesador (1Ghz) y mejor resolución (800x480 en vez de 320x480), aunque una pantalla ligeramente menor (3.2 en vez de 3.5) -- datos de memoria, peden estar ligeramente equivocados, pero son de ese orden. Por otro lado ya viene con ICS y ahora Sony es hacker-friendly. Más información: xda-developers/xperia-ray

Friday, 27 July 2012, 7:22:02 pm
ClockWorkMod Recovery for HTC Desize C (Golf) ClockWorkMod for HTC Desire C Beta2. Las novedades las van a poner en la siguiente URL:

Friday, 27 July 2012, 6:58:21 pm
Moded apktool for "bad magic values" error in SystemUI.apk Justamente el problema que tengo. Información sobre el modified apktool, Thread con el programa.
Ejemplo de uso (sin smali):

. ~/android/env.sh
cd ~/android/apktool/original
cp ../../desirecsystemframework/framework-res.apk  .
./framework-if framework-res.apk
cp ../../desirecsystemapp/SystemUI.* .
./apktool d SystemUI.apk 
mv SystemUI ../ics/
cd ..
cd ics/
cp /home/dario/android/desirecsystemframework/framework-res.apk .
./framework-if framework-res.apk
./apktool b SystemUI
ls -l ./SystemUI/dist/SystemUI.apk


NOTA: el apktool que hay en ~/android/htc-onev/apktool es antiguo, no hay que usarlo. En su lugar hay que usar los dos que referencio aquí. He dejado un tgz con los dos de aquí "reconfigurados" para Linux en /home/dario/android/apktool/ics_and_original_apktool_linux_wine.tgz

Wednesday, 25 July 2012, 7:29:28 pm
Desensamblando .dex Hay información en:

Ejemplo:
cd ~/android/smali
cp ../desirecsystemapp/SystemUI.* .
cp /home/dario/android/desirecsystemframework/*.odex .
cp /home/dario/android/desirecsystemframework/com.htc.fusion.fx.jar .
java -Xmx512m -jar baksmali.jar -a 15 -c :com.htc.fusion.fx.jar -x SystemUI.odex


(el -x es por ser un odex, si es un classes.dex no se pone).

Eso te dejará los .smali en el directorio out.
En dicho directorio están, aparte del smali/baksmali, unos scripts para pasar de ficheros binarios a hexdumps y viceversa (bin2txt.sh y txt2bin.sh). También hay un script que coge wl SystemUI.apk y el SystemUI.odex y prepara un zip para subir al teléfono y poderlo instalar con el ClockWorkModRecovery (systemui2zip-and-phone.sh, que copia el systemui-update.zip al /sdcard del teléfono).

Wednesday, 18 July 2012, 7:45:08 pm
Información para quitar el botón de @id/settings que tiene el texto "status_bar_settings_settings_button" Resulta que ese botón está "compilado" dentro del resources.arsc del SystemUI.apk, que no parece haber decompilado el APKTool por alguna razón. Se puede intentar quitar "a lo bruto" cambiando la cadena de id/settings por otra para desactivarlo... y también se podría cambiar el icono y el texto para indicar que ya no funciona (o dejarlo con un logo de metro o cualquier cosa así).

Wednesday, 11 July 2012, 7:43:16 pm
Compilar el trebuchet He dejado un script (env.sh) que prepara el entorno sin tener que hacer un "brunch cm_crespo-userdebug" (que recompila todo el CM9). Basta con:
. ~/android/env.sh
cd ~/android/ics
. env.sh
make -j2 Trebuchet
./trebuchet2zip-and-phone.sh


Para editar el Launcher.java del trebuchet, hay que hacer:
cd ~/android/ics/Trebuchet
vi src/com/cyanogenmod/trebuchet/Launcher.java


Wednesday, 11 July 2012, 7:04:27 pm
All-in-one toolkit for HTC One V Para que quede documentado: cuando rooteamos el HTC el One V utilizamos el el siguiente programa: HTC One V All-in-One Kit. Eso incluyó el "unlock bootloader" y el "install clockworkmod".

Por desgracia, no encuentro nada del clockworkmod para el HTC Desire C "Golf".

Tuesday, 10 July 2012, 7:32:46 pm
Quitar el que se puedan mover los elementos del homescreen En el Trebuchet, en Launcher.java, hay un
 Launcher.java:2114      mWorkspace.startDrag(longClickCellInfo);
que es cuando detecta que se ha pulsado en un widget/icono. Hay que hacer que eso dependa de un nuevo setting (o de si está habilitada la barra separadora (mShowDockDivider); "con barra"==fijo, "sin barra"==movil).

Resulta que hay un isWorkspaceLocked() en alguna parte...

Para volver a poner el menú de "preferences" en Trebuchet La versión de Trebuchet que tenía antes sí que era accesible el menú de "preferences", mientras que en el actual no. La actividad de preferencias está en
 ~/android/ics/Trebuchet/src/com/cyanogenmod/trebuchet/preference/Preferences.java
Y para lanzarla debería de bastar un intent del estilo de com.cyanogenmod.trebuchet.preference.Preferences .

De hecho, en el onCreateOptionsMenu() de Launcher.java hay un
 Intent preferences = new Intent().setClass(this, Preferences.class);
que es justo lo que quiero. Ahora bien, ¿por qué no aparece dicho menú? Pues porque lo desactivan "aposta" haciendo
 if (!getResources().getBoolean(R.bool.config_cyanogenmod)) {
... // sólo aquí está activo dicho menú
 }
Bastará con comentar el if para que siempre haga lo del "then".

Thursday, 5 July 2012, 6:46:56 pm
Modificando el Trebuchet Parece que el botón de aplicaciones está en Launcher.java, y el que hay que capturar es el "onClickAlllAppsButton()".

Thursday, 5 July 2012, 6:14:52 pm
Hacer un diálogo para introducir una password Hay un tutorial de diálogo para password.

Thursday, 5 July 2012, 5:29:09 pm
Hecho nuevo programa para pruebas: tcmtest Generado usando la siguiente línea:
android create project --name tcmtest -k es.sicosoft.tcmtest -a TcmTest --target android-8 --path tcmtest

Wednesday, 4 July 2012, 5:39:59 pm
Cómo se ha editado el SystemUI.apk Lo siguiente es una reconstrucción, es posible que haya algún comando que se hizo diferente...

mkdir ~/android/htc-onev/apktool
cd ~/android/htc-onev/apktool
wget http://android-apktool.googlecode.com/files/apktool-install-linux-r04-brut1.tar.bz2
tar -xvjf apktool-install-linux-r04-brut1.tar.bz2
wget http://android-apktool.googlecode.com/files/apktool1.4.3.tar.bz2
tar -xvjf apktool1.4.3.tar.bz2
mv aapt aapt.old
cp /home/dario/android/system/out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt .
echo "export PATH=`pwd`:$PATH" > env.sh
. env.sh
adb pull /system/framework/framework-res.apk .
apktool if framework-res.apk
adb pull /system/framework/com.htc.resources.apk .
apktool if com.htc.resources.apk
rm framework-res.apk com.htc.resources.apk
adb pull /system/app/SystemUI.apk .
apktool d SystemUI.apk
cd SystemUI/
cp res/layout-sw600dp/status_bar_settings_view.xml ../status_bar_settings_view.xml.ori
vi ./res/layout-sw600dp/status_bar_settings_view.xml


<     <LinearLayout android:id="@id/settings" style="@style/StatusBarPanelSettingsRow">
<         <ImageView android:id="@id/settings" android:src="@drawable/APKTOOL_DUMMY_02a5" style="@style/StatusBarPanelSettingsIcon" />
<         <TextView android:text="@string/status_bar_settings_settings_button" style="@style/darklist_primary_read_s" />
<     </LinearLayout>


cp res/layout-sw600dp/status_bar_settings_view.xml ../status_bar_settings_view.xml.modi
cd ..
apktool b SystemUI
adb pull /system/app/SystemUI.apk SystemUI.zip
mkdir t
cd t
unzip ../SystemUI.zip
mv META-INF AndroidManifest.xml ../SystemUI/build/apk/
cd ..
rm -rf t
apktool b SystemUI
ls -l SystemUI/dist/SystemUI.apk


Y para crear el update.zip (nota: esto mismo y lo de ponerlo en el tlf lo hace el ./systemui2zip-and-phone.sh):

cd ~/android/htc-onev/apktool
mkdir zip
cd zip
mkdir t
cd t
unzip /home/dario/android/trebuchet-updatezip/update-cm9-mod-launcher-jxWFS.zip 
rm system/app/Trebuchet.apk
cp ../../SystemUI/dist/SystemUI.apk system/app/
zip -pr ../systemui-update.zip .
cd ..
rm -rf t


Por último, para instalarlo,
adb push zip/systemui-update.zip /sdcard/
adb reboot recovery

y una vez dentro del clockworkmod, usando los menús (subir/bajar con vol+/-, para seleccionar usar power):
install zip from sdcard
choose zip from sdcard
systemui-update.zip

y después de instalarlo "go back" y reboot.

Wednesday, 4 July 2012, 5:29:54 pm
Instrucciones para crear un updater-script Se puede usar cualquiera de los siguientes tutoriales:

Básicamente es coger un update.zip existente (p.ej.el update-cm9-mod-launcher-jxWFS.zip que he usado para instalar el Trebuchet), modificar el META-INF/com/google/android/updater-script para que instale lo que corresponde a tu programa y empaquetar en el zip tu programa.

Monday, 2 July 2012, 7:25:35 pm
Backup del sistema (NAND BACKUP) en el OneV Se ha hecho desde el ClockWorkMod Recovery:
  1. En el PC se ha puesto un
    . ~/android/env.sh
    adb reboot recovery
  2. Una vez ha arrancado el teléfono en el modo recovery, se mueve con las teclas de volumen a la opción BACKUP/RESTORE y se selecciona con el botón de POWER, y lo mismo en el submenú para elegor BACKUP.
  3. Se espera pacientemente a que termine (pone el backup en la SD)
  4. Cuando vuelve al menú principal, se selecciona el "reboot system now"

Monday, 2 July 2012, 7:16:21 pm
APK Manager APK Manager es un programa que facilita el "descompilar" un apk para modificarlo. Su sitio web es:

Está instalado en:
phonedevel:~/android/htc-onev/apkmultitool
NOTA: Hay un tutorial muy detallado (jp), a base de pantallazos, aunque en la versión windows del multi-tool.

Thursday, 28 June 2012, 5:57:24 pm
Cambiar el firmware original Se hace con este tutorial para las boot images (pero no sirve para 4.0.x ya que han dejado de usar /proc/mtd). Y este otro tutorial para el system.

NOTA: Explicación de qué significa Odex y DeOdex (otra explicación, quizás más completa). Tutorial para deodex un apk (usa el smali).

Por ejemplo, para el SystemUI.apk en el OneV, he hecho lo siguiente:

En un terminal:
adb shell
su
cat /dev/block/mmcblk0p25 > /sdcard/system.img
exit
exit
cd ~/android/htc-onev
adb pull /sdcard/system.img .
mkdir system-work-dir
cd system-work-dir
cp ../system.img .
mkdir system
mount -o loop -t ext4 system.img `pwd`/system

En otro terminal
cd android
mkdir smali
cd smali/
wget http://smali.googlecode.com/files/baksmali
wget http://smali.googlecode.com/files/baksmali-1.3.3.jar
wget http://smali.googlecode.com/files/smali
wget http://smali.googlecode.com/files/smali-1.3.3.jar
echo "export PATH=/home/dario/android/smali:$PATH" > env.sh
chmod 755 smali baksmali
mv baksmali-1.3.3.jar baksmali.jar
mv smali-1.3.3.jar smali.jar
mkdir deodexing
cd deodexing/
cp ../*.jar .
cp /home/dario/android/htc-onev/system-work-dir/system/framework/* .
cp /home/dario/android/htc-onev/system-work-dir/system/app/* .
java -jar baksmali.jar -c :com.htc.fusion.fx.jar -x SystemUI.odex


Y con eso ya tenemos en el directorio out el apk desensamblado listo para modificar...

FALTA: seguir la otra parte del tutorial para recomprimir el apk...


Tuesday, 26 June 2012, 7:26:38 pm
Otra posibilidad: modificar el res/layout/status_bar_expanded.xml del SystemUI.apk de SenseUI4 Debería ser posible... y menos invasivo. Ahora a buscar manuales de theming para SenseUI ICS.
[Un rato después...]
Lo encontré:

Además se podría buscar la cadena de "Modo avión está activado" y cambiarla por algo más coherente como "Metro de Madrid" o algo así (tb. habría que hacerlo para la cadena de texto en inglés).

Tuesday, 26 June 2012, 7:07:23 pm
El botón de settings en la statusbar Ya lo he encontrado en los fuentes; efectivamente está en el SystemUI.apk:

dario@phonedevel64:~/myAOSP/frameworks/base/packages/SystemUI/
src/com/android/systemui/statusbar/phone/PhoneStatusBar.java:167
View mSettingsButton;


Para desactivarlo bastaría el quitar la línea que le pone el listener a dicho botón:
PhoneStatusBar.java:332 mSettingsButton.setOnClickListener(mSettingsButtonListener);

Una alternativa sería quitarlo del "layout". El elemento es R.id.settings_button, y está definido en
./res/layout/status_bar_expanded.xml:61-68
     61         <ImageView android:id="@+id/settings_button"
     62             android:layout_width="wrap_content"
     63             android:layout_height="match_parent"
     64             android:layout_toRightOf="@id/date"
     65             android:paddingLeft="8dp"
     66             android:paddingRight="8dp"
     67             android:src="@drawable/ic_notify_quicksettings"
     68             android:contentDescription="@string/accessibility_settings_button"
     69             />


Borrando eso, también bastaría (y eso lo quitaría del UI completamente, lo que es más "limpio").

Monday, 25 June 2012, 6:55:42 pm
Resumiendo, lo que he hecho para compila el android "vanilla" para el nexusS (crespo)
mkdir ~/bin
echo "export USE_CCACHE=1" >> ~/.bashrc
echo "export PATH=$PATH:/home/dario/bin" >> ~/.bashrc
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo
chmod a+x ~/bin/repo
cd ~/myAOSP
repo sync -j16


Mientras se estaba descargando, se ha hecho en otra ventana esto:
cd myAOSP/
wget https://dl.google.com/dl/android/aosp/akm-crespo-iml74k-48d943ee.tgz
wget https://dl.google.com/dl/android/aosp/broadcom-crespo-iml74k-4b0a7e2a.tgz
wget https://dl.google.com/dl/android/aosp/imgtec-crespo-iml74k-33420a2f.tgz
wget https://dl.google.com/dl/android/aosp/nxp-crespo-iml74k-9f2a89d1.tgz
wget https://dl.google.com/dl/android/aosp/samsung-crespo-iml74k-0dbf413c.tgz
for i in *.tgz ; do tar -xvzf $i ; done
for i in *.sh ; do bash ./$i ; done


...Unas horas después ya ha terminado de descargar y podemos continuar...
gpg --import
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----

Pulsar CONTROL+D
cd ~/myAOSP
prebuilt/linux-x86/ccache/ccache -M 50G


...Y otro rato más tarde...
make clobber ; source build/envsetup.sh ; lunch full_crespo-userdebug ; make otapackage


NOTA: Si hay un error de compilación, después de corregirlo, para que continuar la compilación sin borrar basta con no hacer el "make clobber", es decir:
source build/envsetup.sh ; lunch full_crespo-userdebug ; make otapackage



Y ahí ya sólo falta esperar (lo que tarda es el "make otapackage" que es lo que realmente se pone a compilar)...

Thursday, 21 June 2012, 8:39:43 pm
Compilar ICS AOSP (sin las modificaciones de CM9) Hay muchas guías, p. ej. esta o esta otra.

NOTA: Al usar la guía que se ha puesto en negrita, hay que instalar el java-jdk con el siguiente comando (a partir de wheezy):
 apt-get install openjdk-6-jre
Alternativa: instalar el sun-java6-jdk de aquí:

# wget http://snapshot.debian.org/archive/debian/20110826T213039Z/pool/non-free/s/sun-java6/sun-java6-plugin_6.26-3_amd64.deb http://snapshot.debian.org/archive/debian/20110826T152435Z/pool/non-free/s/sun-java6/sun-java6-jre_6.26-3_all.debhttp://snapshot.debian.org/archive/debian/20110826T213039Z/pool/non-free/s/sun-java6/sun-java6-jdk_6.26-3_amd64.deb http://snapshot.debian.org/archive/debian/20110826T152435Z/pool/non-free/s/sun-java6/sun-java6-javadb_6.26-3_all.deb http://snapshot.debian.org/archive/debian/20110826T152435Z/pool/non-free/s/sun-java6/sun-java6-fonts_6.26-3_all.deb http://snapshot.debian.org/archive/debian/20110826T213039Z/pool/non-free/s/sun-java6/sun-java6-bin_6.26-3_amd64.deb http://snapshot.debian.org/archive/debian/20110826T213039Z/pool/non-free/s/sun-java6/ia32-sun-java6-bin_6.26-3_amd64.deb
# wget http://snapshot.debian.org/archive/debian/20110826T213039Z/pool/non-free/s/sun-java6/sun-java6-jdk_6.26-3_amd64.deb
# wget http://snapshot.debian.org/archive/debian/20110826T152435Z/pool/non-free/s/sun-java6/sun-java6-jre_6.26-3_all.deb
# dpkg -i sun-java6-jdk_6.26-3_amd64.deb sun-java6-bin_6.26-3_amd64.deb sun-java6-jre_6.26-3_all.deb ia32-sun-java6-bin_6.26-3_amd64.deb
# apt-get -f install


NOTA2: Sea como sea, al final sí que merece la pena comentar en el makefile de android la comprobacion de la version de Java o no compilara (ver este post). Básicamente es comentar en el build/core/main.mk Las siguientes líneas:
ifneq ($(shell java -version 2>&1 | grep -i openjdk),)
java_version :=
endif


Y ya que estás, hay que hacer también (como root):
# ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/libGL.so


Thursday, 21 June 2012, 8:16:46 pm
El apk que contiene la barra de notificaciones es el SystemUI.apk Y hay que tomar algunas precauciones si simplemente se quiere modificar el SystemUI.apk sin recompilar.

Wednesday, 20 June 2012, 8:32:11 pm
Hacer que TcmPortones reciba los broadcast Han cambiado cómo funciona en ICS, y si tienes un Receiver sin "programa asociado", tienes que poner unas flags en el intent para que tu receiver funcione (
explicación y howto):
 private static final int FLAG_INCLUDE_STOPPED_PACKAGES=32;
 i.addFlags(FLAG_INCLUDE_STOPPED_PACKAGES); // Realmente sería Intent.FLAG_INCLUDE_STOPPED_PACKAGES, pero eso requiere el compilar para ICS específicamente

NOTA: Con ese cambio en el tcmandroid, el TcmPortones vuelve a funcionar.

Tuesday, 19 June 2012, 3:24:02 pm
Actualizar el build.xml para el proyecto mirah Resulta que al actualizar el SDK de android, da un error al compilar el proyecto mirah ("Error. You are using an obsolete build.xml"). Lo mismo me había pasado con el proyecto java, pero para mirah se soluciona de forma diferente (ver post):
cd ~/mirah
. env.sh
mkdir src.pindah
cd src.pindah/
git clone git://github.com/mirah/pindah.git
cd pindah/
gem build pindah.gemspec
gem install pindah-0.1.3.dev.gem 
cd ~/mirah
sed -i "s/install/installd/g" jruby-1.6.5/lib/ruby/gems/1.8/gems/pindah-0.1.3.dev/lib/pindah.rb
sed -i "s/uninstalld/uninstalld/g" jruby-1.6.5/lib/ruby/gems/1.8/gems/pindah-0.1.3.dev/lib/pindah.rb


Y también (esto es opcional, pero ya que estamos...):
mkdir src.mirah
cd src.mirah
git clone https://github.com/mirah/mirah.git
cd mirah
gem build mirah.gemspec 
gem install mirah-0.0.12.dev-java.gem



Thursday, 14 June 2012, 6:28:45 pm
Cambiar la dirección MAC del WiFi Se puede hacer desde línea de comando si está rooteado.

Wednesday, 13 June 2012, 6:02:15 pm
Compilar el CM9 para conseguir el trebuchet.apk Se hace siguiendo estos pasos para la Xperia Play (en genérico serían estos).

apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev:i386 g++-multilib mingw32 openjdk-6-jdk pngcrush schedtool tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
mkdir -p ~/bin mkdir -p ~/bin
mkdir -p ~/android/system
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo
cd ~/android/system/
export PATH=$PATH:~/bin/
repo init -u git://github.com/CyanogenMod/android.git -b ics
repo sync -j16
cd ..
ln -s system ics
cd ~/android/ics/vendor/
git clone https://github.com/koush/proprietary_vendor_semc.git -b ics semc
cd ~/android/ics/device/
mkdir semc
cd semc
git clone https://github.com/CyanogenMod/android_device_semc_msm7x30-common.git -b ics msm7x30-common
git clone https://github.com/CyanogenMod/android_device_semc_zeus.git -b ics zeus
git clone https://github.com/CyanogenMod/android_device_semc_zeus-common.git -b ics zeus-common
cd ~/android/ics/
repo sync
cd ~/android/ics/vendor/cm/
./get-prebuilts
cd ~/android/ics/
. build/envsetup.sh
lunch

Para compilar solo una de las aplicaciones se sigue este otro tutorial. Básicamente:
dario@phonedevel$ cd ~/android/ics
dario@phonedevel$ . ~/android/ics/build/envsetup.sh 
dario@phonedevel$ mmm packages/apps/Trebuchet/


Hay una manera alternativa en este thread, usando make en vez de mmm;
dario@phonedevel$ cd ~/android/ics
dario@phonedevel$ . ~/android/ics/build/envsetup.sh 
dario@phonedevel$ make -j2 Trebuchet


update Ahora haciendo lo del mmm o el make no funciona. Para intentar que funcione otra vez he hecho lo siguiente (y ha resincronizado el repositorio de nuevo):
cd ~/android/ics
. build/envsetup.sh
repo sync
brunch cm_crespo-userdebug


NOTA: Howto de cómo instalar el trebuchet.apk

NOTA2: Hay un GUI para Ubuntu que compila el CM9

Wednesday, 13 June 2012, 5:03:52 pm
Quitar el "No SIM card in Phone" del HTC SenseUI lock screenVer esta trhead. Una manera es: poner modo avión y activar el wifi.
  1. Poner el modo avión
  2. Activar otra vez el WiFi
  3. Comprobar que la timezone está en "manual", no "auto from carrier"
  4. Instalar el NoLock
  5. Instalar el ADW.Launcher, o, si está rooteado, el trebuchet launcher (ant. página) (código, un sitio donde se puede descargar).


Tuesday, 12 June 2012, 6:50:04 pm
Bloquear el terminal android Una manera de hacerlo sería usando las técnicas de parental control. Ahí recomiendan el App Lock (y en aptoide), incluye protección para los settings, pero puede ser un poco engorroso de instalar la primera vez....

Monday, 11 June 2012, 8:20:47 pm
Para compilar el núcleo del HTV One V En chibiko, como usuario metro:
$ cd /home/android/kernel
$ . env.sh
$ cd primou-ics-3.0.16-d5b834a
$ make primou_defconfig
$ nohup make -j 4 &


NOTA: Para que usase python2.6 he tenido que hacer un
$ vi /home/android/kernel/primou-ics-3.0.16-d5b834a/scripts/gcc-wrapper.py
y cambiar el
#! /usr/bin/env python
por un
#! /usr/bin/env python2.6

NOTA: Los drivers WiFi de Android son "peculiares". Ver porting wifi drivers to android.

Monday, 11 June 2012, 6:34:10 pm
Sources de los kernel de los teléfonos HTC Están aquí: http://htcdev.com/devcenter/downloads.

NOTA: Parece que para compilar el núcleo hace falta python 2.6, y en lenny (chibiko) está la 2.5. Según este post basta con instalar el de testing de antes de mayo del 2010; después de probar un poco, he instalado esta versión en chibiko (junto con un libdb4.8_4.8.24-1~bpo50+1_i386.deb y libssl0.9.8_0.9.8m-1_i386.deb).

Sources de los kernel de los teléfonos Samsung Están aquí: http://opensource.samsung.com (ver thread al respecto).

Thursday, 7 June 2012, 6:52:49 pm
Para ver las diferencias entre el bcm4329 del NexusS y el bcmdhd (4330) del OneV Se puede hacer así:
$ ssh dario@chibiko
$ export DISPLAY=3.0.1.170:0.0
$ cd /home/android/kernel/comun/common/drivers/net/wireless
$ meld bcm4329 bcmdhd

NOTA: Invertigar qué es esto:
siyahkernel / drivers / net / wireless / bcm4330 / src / wl / sys / wl_iw.c
En principio parece un kernel optimizado para el SGS2 (más info).

Thursday, 7 June 2012, 5:46:21 pm
Bajar el kernel de android Instrucciones en est pagina. Para nuestro caso (el HTC One V, que tiene procesador Qualcomm):
$ git clone https://android.googlesource.com/kernel/msm.git

Para el Nexus S, que tiene un exynos basado en hummingbird:
$ git clone https://android.googlesource.com/kernel/samsung.git

También he hecho el git del common, y después un
$ git checkout android-3.0
y tiene mejor pinta :).

NOTA: después de descargar el repositorio, hay que elegir un branch tal y ocmo dicen en este post:
$ git branch -a
git checkout android-msm-2.6.35

Lo que ocurre es que ese no es el kernel que yo quiero (!).

Sin embargo, no encuentro mucha información sobre el HTC Desire C Golf.

Thursday, 7 June 2012, 4:59:11 pm
Wifi chipset del Nexus S Según este post es un bcm4329. Para cargarlo "a mano" hay que hacer:
busybox insmod /system/modules/bcm4329.ko firmware_path=/system/vendor/firmware/fw_bcm4329.bin nvram_path=/system/vendor/firmware/nvram_net.txt

Wifi chipset del HTC One V Haciendo un "adb shell cat /proc/modules" veo que el módulo es el bcmdhd. Según este post, eso corresponde con un broadcom 4330.

Wednesday, 6 June 2012, 6:45:17 pm
Qué es el "Android system server Es una especie de "init de los servicios Java", documentación de system_server. Android Java System Service, Beyond system_server (cached).

Para ver las diferencias entre los drivers del NexusS y el OneV
$ ssh metro@chibiko
$ export DISPLAY=salchicha:0
$ cd /home/android/kernel/comun/common/drivers/net/wireless
$ meld bcm4329 bcmdhd


Wednesday, 6 June 2012, 5:00:39 pm
Creando una configuración WEP Wfi prgramatically En este post (mas)

Sobre LEAP y el wpa_supplicant el README dice lo siguiente
  * LEAP (note: requires special support from the driver for IEEE 802.11
          authentication)


Tuesday, 5 June 2012, 5:57:30 pm
Compilar el ICS Se sigue esta guía. Nota: la compilación dura más de 5 horas.

Monday, 4 June 2012, 8:40:35 pm
ROOTear el One V Se hace con esta guía. Después hay que seguir esta otra para modificar a mano el wpa_supplicant.conf

NOTA: Me dio dos errores en campo; el último es el siguiente
 EAPOL: Failed to set WEP key to the driver.
Puede ser señal de un problema con el driver wifi :-?
El otro es:
 E/WifiConfigStore( 1600): Missing id while parsing configuration

Monday, 4 June 2012, 5:59:31 pm
How to root Nexus S on ICS or Gingerbread El tutorial está aquí

Monday, 4 June 2012, 5:19:56 pm
Hacer un backup usando adb (solo sirve para ICS) Se usa este tutorial. Hay más información al respecto:
Siguiendo las dos guías anteriores, y haciendo el backup sin encriptar (sin poner una clave cuando te pregunta en el teléfono), se puede hacer un backup y descomprimirlo a un directorio con el siguiente script:
#!/bin/bash
adb backup -system -all -f `pwd`/mibackup.ab
tam=`head -4 mibackup.ab | wc --bytes | tr -dc 0-9`
dd if=mibackup.ab of=mibackup.tar.deflated bs=1 skip=$tam
ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < mibackup.tar.deflated >mibackup.tar
rm -rf t
mkdir t
cd t
tar -xvf ../mibackup.tar 
echo "El contenido esta en el directorio t/"


NOTA: si se pone el -apk y -shared, el formato cambia y el "deflate" del ruby falla.

Thursday, 31 May 2012, 6:46:22 pm
Descargar apks de aptoide/bazaarandroid Se pueden descargar los apks de bazaarandroid.org al PC. Hay un videotutorial para chrome aquí, pero los pasos en firefox son ligeramente diferentes:
  1. Buscas el apk en bazaarandroid.org
  2. Le das a "ver código fuente" (botón derecho sobre la página)
  3. Buscas el texto siguiente:
    2.1 Access this application in <b>Bazaar Mobile</b>, by clicking <a href="http://m.bazaarandroid.com/app/00000">here</a>
  4. Coger la URL que te ha aparecido (m.bazaarandroid...) y la cargas en el navegador
  5. Le das el botón derecho en el botón de instalar de la página y selecciona "copiar la ruta del enlace"
  6. Pegas esa URL en una nueva ventana del navegador y sustituyes el .myapp final por un .apk
  7. Descargas el apk dando al enter.


Wednesday, 23 May 2012, 6:49:40 pm
Para hacer el teléfono vibrar Se hace según este howto.

Tuesday, 22 May 2012, 6:05:12 pm
Para hacer IPC en android Android IPC mechanisms and concepts. Al final, lo más sencillo es mandar broadcasts e implementar broadcast receivers.

Monday, 21 May 2012, 8:28:18 pm
Para VoIp Android soporta VoIP nativa desde Gingerbread (lo anunciaron en ICS, sin embargo). El problema es que esas librerías sólo suelen estar en las ROMs "vanilla"; como dicen en el link anterior, una alternativa es integrar el pjsip de CSipsimple http://www.pjsip.org/apps.htm (GPL).

Monday, 21 May 2012, 8:23:57 pm
Para soportar códigos de barras Usar barcode scanner, y comunicarse con él usando el IntentIntegrator.java (ver la ayuda del zxing/Barcode Scanner). La licencia es Apache2, por lo que si hay que modificar algo, no hay problema.

Monday, 7 May 2012, 7:24:15 pm
Detectar cuando se quitan las notificaciones No se puede detectar cuándo se quita una notificación, pero sí que se puede detectar cuándo se borra el intent asociado a esa notiicación:

Thursday, 12 April 2012, 6:22:31 pm
Android y UDP Los docuemntos que usé ayer para implementar los sockets UDP en nuestro servicio son éstos:

Para hacer tareas periódicas en un servicio Esta es la documentación que parece más completa (de los que te indican cómo hacerlo en tu propio servicio y no usando el AlarmManager o como-se-llame):

Tuesday, 27 March 2012, 7:14:21 pm
Cómo arrancar un servicio con adb Cuando se instala el tcmalarmas, hay que reiniciar el teléfono para que el servicio se arranque automáticamente. Hay una alternativa: usar el adb para arrancar el servicio:
$ adb shell am startservice -n es.sicosoft.tcmalarmas/es.sicosoft.tcmalarmas.TcmAlarmas


Cómo añadir nuevas notificaciones

Monday, 26 March 2012, 8:32:14 pm
El proceso tcmalarmas ya se arranca y escucha en el puerto 10005 Sin embargo todavía no hace nada del resto: no parsea a línea que le llega, no responde lo que debe por el socket, no pone una notificación, no llama al tcm con los datos necesarios cuando se pulsa la notificación.

Thursday, 22 March 2012, 5:41:13 pm
Fix Samsung Galaxy S noise reduction Es un problema hardware; se pueden seguir los siguientes tutoriales:


Friday, 16 March 2012, 5:37:14 pm
Para evitar transacciones antiguas en 2o plano Cuando se inicia una transacción, se debería poner un identificador, de manera que la transacción lo comprueba periódicamente y si ha cambiado es que esta transacción es "antigua" y debería salirse.

Para actualizar el estado de las instancias Cuando se pide una acción, debería mandar algo especial al iniciar la transacción de manera que se repita "n" veces separadas por 1 segundo el último "comando" que debería ser uno de "icons", para saber que no ha cambiado nada. Por ejemplo 5 veces.

Que el listado conserve la "posición" al recibir una respuesta de "icons" El teléfono debería respetar la posición actual de la lista cuando se recibe un icons y tiene que "regenerarla".

Wednesday, 14 March 2012, 7:07:52 pm
Ejemplos para lo del ServerSocket Son los siguientes:

UPDATE 20120326: Añado el ejemplo completo de un service. Añado la nota sobre la imposibilidad de lanzar el servicio automáticamente al instalar.

Wednesday, 14 March 2012, 6:22:12 pm
Empiezo el programa tcmalarmas He generado la plantilla con un:
android create project --name tcmalarmas -k es.sicosoft.tcmalarmas -a TcmAlarmas --target android-8 --path tcmalarmas
UPDATE Antes se llamaba tcmservice, lo he renombrado a tcmalarmas.

Documentación para evaluar si se puede implementar tcmalarmas en C:
Resultado de la investigación: mejor no usar el NDK para este caso. A pesar de lo sencillo que sería implmentar la parte de funcionalidad en C, se complica bastante el entorno de compilación, hay que generar la funcionalidad en una librería y llamarla desde Java, no queda claro que se pueda quedar uno en un select en la función C y después mandarle "mensajes" a la parte Java de la aplicación con las órdenes que va recibiendo, etc.

Wednesday, 14 March 2012, 4:33:51 pm
Cómo flashear un "stock gingerbread" en un Galaxy S Wifi 5 Este artículo. PERO nuestra versión es la XEH y el tutorial es para la XET y XEF... ¡peligro de "brick"ing! Para ser específicos, el nuestro tiene en la pegatina de atrás:
2011.05
MODEL:YP-G70CW/XEH8GB
Serial No:131B515180D


Tuesday, 13 March 2012, 7:45:32 pm
Añadido el "secret code" *#*#1#*#* a TcmWidget de manera que si se escribe *#*#1#*#* en el dialer se descarga la aplicación tcm.sicosoft (Tcm.apk) de main1 (después hay que hacer click en ella para instalarla).Asímismo *#*#2#*#* es TcmPortones y el *#*#3#*#* el propio TcmWidget. Para codificarlo se ha usado:
UPDATE: No sirve de nada, ya que el Galaxy S Wifi no tiene dialer...

Friday, 9 March 2012, 7:21:28 pm
Haciendo un servicio y arrancándolo automáticamente al encender el teléfono Hay un tutorial aquí:

Thursday, 1 March 2012, 7:14:47 pm
Mirando cómo parar las threads de AsyncTransaction en ejecución antes de lanzar una nueva Ahora mismo se lanzan con un ThreadPoolExecutor, pero para detener una thread, hay que haberla lanzado de forma explícita y luego abortarla con Thread.interrupt(). Curiosamente, usar FutureTask tampoco da la opción de interrumpir una thread que ya está en ejecución (sólo da opción a desencolar un ruannable al que todavía no le ha llegado el turno de ejecutarse). En resumen, que para hacer eso, hay que evitar ThreadPool (que tiene la ventaja de tener la thread ya arrancada, sólo esperando a que le den funciones a llamar) y arrancar cada thread "a mano" para poderla cancelar.

Wednesday, 29 February 2012, 10:15:17 am
Haciendo arrayadaptors Tebemos los siguientes ejemplos:

NOTA: Efectivamente, usando "ArrayAdapter"s en vez de generar la vista con todos los widgets eliminó el problema del memory leak. Además es muchísimo más rápido con arrayadapters, ya que en vez de generar inicialmente el número de "RelativeLayout"s necesarios para todos los elementos, sólo genera los que necesita para rellenar la pantalla y los va reutilizando según se salen de la pantalla.

Friday, 24 February 2012, 5:15:33 pm
Horizontal and Vertical scrolls simultaneously Se añade un horizontal view y otro vertical view, uno dentro del otro, ejemplo y tutorial.

Más enlaces:


Friday, 24 February 2012, 4:49:14 pm
Control de memory leaks

Wednesday, 22 February 2012, 7:29:45 pm
Cambios pendientes en AsyncTransacction: cambiar a "binario" Según este post, para evitar problemnas con sockets, en vez de BufferedReader hay que usar BufferedInputStream, y en vez de String, hay que usar ByteBuffer y entonces convertirlo a CharBuffer si resulta ser una cadena válida (y por último obtener una String).

Monday, 20 February 2012, 7:14:03 pm
Cómo cerrar "del todo" una aplicación programáticamente Hay cómodigo de ejemplo en este post. Lo más interesante es que se puede cerrar "abruptamente" la aplicación haciendo:
 android.os.Process.killProcess(android.os.Process.myPid());

Friday, 3 February 2012, 5:51:43 pm
Poniendo iconos en las opciones de un alertdialog con lista de single choice Se hace según dicen en este post.

Tuesday, 31 January 2012, 7:12:13 pm
Detectando memory leaks Resulta que al destruir y volver a poner los objetos de la lista de instancias varias veces, al final se queda sin memoria porque no va "borrando" los iconos y otros recursos anteriores de memoria:
V/hecl tcm onnewintentsub callback( 8624): {ERROR {Problem invoking android.widget.ImageButton setimageresource/setImageResource with arguments: android.widget.ImageButton@41a9eb38 setImageResource 2130837605 (Translated to:) 2130837605 java.lang.OutOfMemoryError: bitmap size exceeds VM budget} 54} {android.widget.ImageButton@41a9eb38 5} {if 25} {foreach 4} {foreach 13} {complexlist 1} {protectedactivityproc 7} {onnewintentsub -1}

Hay un tutorial de cómo localizar los recursos que se "están quedando" usando el adb:
También está la documentación oficial sobre el tema:
Y algunos consejos sobre cosas a hacer para evitar los memory leaks (como el quitar los callbacks antes de destruir los imagebuttons y esas cosas):
Por último un ejemplo de cómo manejar los recursos de imágenes si éstos cambian muy a menudo:
Y una solución diferente: unbindDrawables():

Por último, un post/artículo sobre el uso de memoria y cómo obtenerlo "at runtime":

Update 20120221: Añadido el enlace de uso de memoria "at runtime"+"programatically".

Friday, 27 January 2012, 12:15:39 pm
Actualización a ICS para Nexus S Se hace con estas instrucciones. Alternativamente se puede esperar a que esté disponible via OTA.

Friday, 27 January 2012, 11:54:59 am
Habilitando pinch-zoom en una View con hijos

Monday, 16 January 2012, 8:40:32 pm
Añadiendo iconos a las listas del TCM

Thursday, 12 January 2012, 5:09:20 pm
Configuración del LinPhone Los datos que se ponene (sólo varía el número del usuario/password de terminal a terminal):
-Nexus SGalaxy S Wfi 5Galaxy4
Usuario862428601586013
Password862428601586013
Domain16.4.80.1516.4.80.1516.4.80.15
Proxy16.4.80.1516.4.80.1516.4.80.15
Start at boot timeYesYesYes
Enable VideoNoNoNo
Echo cancellationNoNoNo

Y con eso queda hecha la parte del terminal (aparte tienen que configurar la parte del Call Manager, es decir, el servidor).

Configuración de red:
Primero crear una nueva red desde los ajustes del sistema que tan sólo tenga el SSID ("WTOIP") y esté sin encriptaciónj ("open"). Después se arranca el Wifi ACE y se configura de la siguiente manera:
SSIDWTOIP
Hidden SSIDYes
Key ManagementIEEE8021X
Auth ProtocolsLEAP
Enterprise configuration: EAPLEAP
Enterprise configuration: Identitypruebas@infoglobal
Passwordpruebas2007

UPDATE 20121004: Han activado el que se pueda configurar con PEAP. Se siguen las siguientes instrucciones:

Configuración de red con PEAP:
 Aplicaciones->Ajustes->WiFi->ON
Se pulsa en la línea de WiFi para poder añadir un nuevo punto de acceso
 Menú (arriba a la dcha) -> Añadir Red
SSIDWTOIP
Seguridad802.1x EAP
Aparecerá la pantalla de credenciales; por motivos de seguridad el terminal HTC pide que se introduzca un PIN para la pantalla de bloqueo.
 Seleccionar "método de PIN" de protección de bloqueo y se introduce uno cualquiera, p.ej. 1111
Método EAPPEAP
Identidadtoipumi
ContraseñaMETROumi2012
 Se da a "Guardar"
 Menú (arriba a la dcha) -> Avanzado
Mantener WIFI activado mientras suspensión de modoSIEMPRE
Notificación de reddesactivado
Salir al escritorio principal, esperar 1min y ver que se conectado a la red WiFi (si es que se está en zona de cobertura)
QUITAR EL PIN de PROTECCIÓN:
 Ajustes->Seguridad->Bloqueo de pantalla->introducimos el PIN -> Sin seguridad
Con eso queda configurada la red usando PEAP.

Sobre la configuración de VozIp:

SistemaProveedorIPUsuario de pruebas
CallManagerInfoGlobal16.4.80.1588888Funciona a Ene.2014
HiPathSiemens17.138.97.1588810Ya no funciona
"Nuevo sistema en pruebas"???16.0.80.2434998888840Configurado en Nov.2015

UPDATE 20121008: He descargado el último CSipSimple, y lo he configurado (20120919) y se ha configurado con:
Perfil "Basic" y se rellena igual que se hace con el LinPhone (nombre (el id de usuario), usuario (el mismo id) passwd (el mismo id) IP (la de callmanager o del hipath, según en dónde esté dado de alta ese usuario)).
Después en "avanzadas", quitar la integración con Android (apariencia) y la cancelación de echo (multimedia).
Para el HTC One M8: También hay que poner la frecuencia de muestreo a "Automático" (en caso contrario el micrófono no funciona).
Update 20150809: Añado el número de teléfono de pruebas del nuevo sistema que nos dieron en la "demo" de Noviembre 2015.


Friday, 9 December 2011, 8:31:37 am
Android: A visual history Artículo sobre Android 1.0-4.0.

Monday, 5 December 2011, 8:15:55 pm
Android background processing Después de haber leido el tutorial sobre threads de Java, toca el de Android background processing, para saber cómo funcionan los Handlers de Android para pasar información entre la thread del UI (ppal) y las otras.

Thursday, 24 November 2011, 7:04:10 pm
Resulto el misterio de cómo se contestan los intents y por qué me abría varias instancias del TCM, aunque fuera para lanzar la subactividad: launchMode Ver la descripción de launchMode.

Para nuestro caso, habría poner en el Manifest.xml:
...
<activity android:name="..." android:launchmode="singleTask">
...
</activity>
...


Tuesday, 22 November 2011, 8:03:19 pm
Usando el NDK Según esta búsqueda:

Tuesday, 22 November 2011, 7:26:33 pm
Haciendo servicios Búsqueda (y otra, y otra más), y resultados:

Monday, 21 November 2011, 7:09:30 pm
Experimentando con Mirah Instalar Mirah para Android. Mirah es "el CoffeeScript de Java"; sintaxis Ruby con equivalencia 1:1 con Java. Además, como compila a .class, puedes usar Mirah en unas clases y Java en las otras, y llamar a unas desde las otras.

Update Ferrante parece ser la aplicación más grande hecha con mirah/pindah por el momento. Además es interesante:
Hay más cosas en esta búsqueda:


Thursday, 17 November 2011, 8:13:46 pm
Recibiendo Broadcasts (que despierten/aaranquen a la app) Hay un ejemplo aquí. Básicamente hay que implementar un BroadcastReceiver y añadir al Manifest.xml la clase que lo va a recibir junto con el intent de la siguiente manera:
<receiver android:name=".TcmCmd">
	<intent-filter>
		<action android:name="sicosoft.tcm.DEFAULTACTION"/>
	</intent-filter>
</receiver>


Hay otro ejemplo de código en este post, y enseñan cómo hacerlo si el BroadcastReceiver es una clase miembro de otra. Sin embargo, dice que declarándolo en el manifest no le funcionó pero sí registrándolo dinámicamente (?).

Monday, 7 November 2011, 7:47:13 pm
Sending a message from a service to the main activity Se puede hacer según indican en la segunda respuesta de este post.

Friday, 4 November 2011, 7:31:20 pm
INtroducción a services usando widgets este tutorial.

Friday, 4 November 2011, 5:55:32 pm
Haciendo un broadcast de la información de estación y del número de portones desde el Tcm (y recogiéndolo en el widget) Se explica lo necesario en los siguientes posts:

Friday, 4 November 2011, 5:31:57 pm
Implementación de las alarmas urgentes: notificación en la barra de estado Se haría según el siguiente tutorial: Notificaciones en Android (II): Barra de Estado

Wednesday, 2 November 2011, 6:23:05 pm
Enlaces de cosas pendientes Antes de que se me olviden:

Thursday, 27 October 2011, 7:28:15 pm
Tutorial para crear un widget Interfaz de usuario en Android: Widgets (I), (II)

NOTA: Tiene una versión PDF (hay un ejemplo), pero es incómoda de leer; está claro que no ha usado lyx para componerla (el código se puede insertar usando minted (ejemplo)para que quede "syntax-highlighted" en colores). En vez de usar minted, se puede usar el listings (ejemplo) que está soportado nativamente por el lyx, pero hay que hacer configuración adicional para que quede en color.

Wednesday, 19 October 2011, 7:03:16 pm
Configurar el LEAP en android Se puede hacer con el android-wifi-ace. Antes se hacía editando la configuración del supplicat para añadir un nuevo punto de acceso con LEAP

Thursday, 6 October 2011, 7:07:52 pm
Servicios "foreground" Resulta que la comunicación del TCM en la aplicación final, habría que hacerla implementando un servicio "foreground" (con icono).

Tuesday, 4 October 2011, 4:44:11 pm
configChanges en Android Resulta que la aplicación es "reiniciada" cuando suceden ciertos cambios de configuración, ver:

http://developer.android.com/guide/topics/manifest/activity-element.html#config

Se puede evitar con un "configChanges" en el manifest; p.ej.el adosbox lo hace así:

==CUT===
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="false">
        <activity android:name=".MainActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:label="@string/app_name" android:screenOrientation="landscape"
                  android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|fontScale|uiMode"
                  android:windowSoftInputMode="stateUnspecified|adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

==CUT===

De esa manera se llama a un callback en vez de reiniciar la aplicación (bueno, el activity visualizándose en ese momento; el resto seguirían "ejecutándose" en la otra VM).

Monday, 3 October 2011, 7:49:26 pm
Cómo pasar "bundles" entre actividades Articulo:Passing Bundles Around Activities. Supongo que para pasar Strings en vez de "bundles", será más sencillo O:).

Update NO ES NECESARIO usar esto desde Hecl; cuando se genera una subactividad, basta con hacer una función con parámetros para la subactividad; recuerda los parámetros de cuando la generaste, si es que tiene que volver a crear la actividad :).

Friday, 30 September 2011, 8:18:55 pm
Necesito saber como "mensajear" entre las actividades Resulta que si:
1. Se accede a un menú (p.ej. Cancela)
2. Se vuelve al ppal
3. Se cambia la orientación
4. Se vuelve a otro menú (p.ej. Portón)
Entonces: se va otra vez a Cancela; ya no compartes variables las dos actividades, con lo que el submenú no "coge" a dónde tiene que ir (¡AAARRRG!). Es como si ahora hubiera dos instancias del programa... (mientras que antes se omportaban como dos threads y compartían variables). Habrá que investigar cómo pasarse mensajes de una a otra --o terminar de implementar lo de los intents en Hecl que está sin implementar la parte de parámetros (poner parámetros y obtener parámetros)....

Update (20111003) ¡¡¡CORREGIDO!!! Al final era tan sencillo como que en vez de pasar el nombre del procedimiento a llamar para generar la subactividad, se pasase "nombreproc parametro", y definir dicho procedimiento con parámetros. Así siempre que se inicia la subactividad se hace con el valor correcto :).

Thursday, 29 September 2011, 12:44:06 pm
Cómo funciona lo de salvar el estado en el onPause Ver este post. onSaveInstanceState guarda los valores que le digas en el "Bundle" que recibe la aplicación para ser restituidos con el onRestoneInstanceState. Esos son llamados cuando la aplicación es quitada de memoria por el sistema. Sin embargo, si es el usuario el que sale de la aplicación, el único sitio donde puedes estar seguro que se guardan los valores es en el onPause (y se recuperan en el onRestore). La explicación completa está aquí.

Thursday, 29 September 2011, 10:41:18 am
Añadir nuevos comandos hecl para una aplicación He modificado el build.sh para que si existe un nombreaplicacion.java, suponga que es implementa nuevos comandos para Hecl en java. Usar tcm.java como plantilla. Para Tcm he implementado dos nuevos comandos:
  • getmac: devuelve la MAC del terminal
  • getimei: devuelve el IMEI del terminal
Por cierto: después de tanto buscar el ApplicationContext, resulta que el objeto Hecl hereda de Activity, lo cual le hace implementar Context (se puede pasar/usar el objeto hecl del TcmCmd cuando se requiera un Context).

Wednesday, 28 September 2011, 6:34:29 pm
Proyecto TCM/Android, estado

ETA: Miércoles 5 Octubre

Objetivos

  • versión muy básica que se pueda probar en metro
  • Objetivo 1: Se arranca la aplicación y se obtienen los menús
  • Objetivo 2: Se puede navegar por las instancias de la estación y realizar la acción de abrir el portón

Completado

  • la parte de los menús
  • a mitad de implementar la comunicación con sockets (ya envía, pero todavía no está terminada la parte de recibir).

TODO

  • REQ: Terminar parte de sockets
  • OPC: realizar acciones con subsistemas de varias acciones posibles (p.ej. escaleras: subir/parar/bajar, alumbrado:encender/apagar)
  • OPC: mostrar tablas de alarmas (metta, escaleras, cancela, detectorincendios).

NOTA: OPC es para la semana del 10 de Octubre.

Futuro

  • habilitar iconos ("widgets") de abrir portones en la pantalla principal del teléfono (no en la de bloqueo).


Tuesday, 27 September 2011, 6:38:34 pm
Obtener el IMEI y la MAC en Adnroid Se hace con lo siguiente:
MACWifiManager wm = (WifiManager)Ctxt.getSystemService(Context.WIFI_SERVICE);
return wm.getConnectionInfo().getMacAddress();
IMEIfinal String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();

Es probable que lo mejor sea el añadir comandos al intérprete de Hecl que ejecuten dicho código (ya no tengo muy claro cómo hacer dichas llamadas directamente en Hecl). Hay un ejemplo de cómo hacerlo en la entrada de "Thursday, 15 September 2011, 6:50:28 pm".



Monday, 26 September 2011, 8:08:33 pm
Conseguido cambiar el icono y que el apk tenga permisos para la red He tenido que:
  • Editar el androidbuilder.java para que tenga las líneas de permisos para la red cuando general el manifest
  • Compilarlo con ant packageAndroidBuilder
  • Modificar el build.sh para que sea capaz de sustituir el icono de hecl por el de la aplicación.

Update 20110927 Lo de editar y compilar el androidbuilder realmente no era necesario; resulta que se consigue lo mismo pasando como parámetros al androidbuilter lo siguiente:
-permissions READ_PHONE_STATE,WAKE_LOCK,ACCESS_NETWORK_STATE,\
ACCESS_WIFI_STATE,CHANGE_NETWORK_STATE,CHANGE_WIFI_STATE,\
ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION,INTERNET,\
WRITE_EXTERNAL_STORAGE,READ_LOGS



Thursday, 15 September 2011, 6:50:28 pm
Tutorial de cómo hacer aplicaciones en APKs autocontenidos con HECL En este thread sobre Android y Tcl (HECL, ya que tcl no tiene gui sobre android; más información sobre las implementaciones de tcl candidatas para android). Básicamente era (supongo que habrña cambiado algo, ya que el post era de cuando android empezaba):

java -jar ./hecl/jars/AndroidBuilder.jar -android /opt/android-sdk_m5-rc15_linux-x86/ -class Hello -label Hello -package hello.world -script hello.hcl

Y eso genera un hello.apk

Para más información, ver la documentación de hecl para Android.

Guía de instalación de hecl para su uso con Android: ejemplo práctico (2010) (y el thread sobre cómo se hizo). También interesante este thread sobre cómo crear comandos (complementa al anterior), que realmente redirige a la documentación de hecl sobre nuevos comandos.

Uso de QtCreator como IDE para Android Se instala Error: this should not happen, y es posible que haya que instalar el fichero de definición de syntax-highlighting de Tcl/tk para Kate (QtCreator soporta los ficheros de resaltado de sintaxis de kate, el editor de KDE).

Wednesday, 7 September 2011, 6:07:34 pm
Una alternativa al "soft-button" en el launcher: modificar Android para añadir "abror portón" a las opciones del botón de apagado Según este post, está en frameworks/policies/base/phone/com/android/internal/policy/impl/GlobalActions.java (eso es parte del S.O. que está en la partición de sólo lectura, pero bueno).

Alternativa: usar los botones de subir y bajar volumen cuando se está en la pantalla de lock. Es de suponer que eso se podrá hacer modificando el código de la pantalla de lock...

Otra alternativa: quitar la pantalla de bloqueo: (debería ser válido para 2.2+). En el Nexus S debería bastar con hacer lo siguiente, pero no funciona (???):
Ajustes > Ubicación y Seguridad > Bloqueo Pantalla > Ninguno

Código de ejemplo de pantalla de lock: mylockforandroid.

Tuesday, 6 September 2011, 4:30:35 pm
Seguridad en Android (o cómo instala las aplicaciones el S.O.) En este pdf.

android_secret_code Resulta que hay cadenas (parecidos a los "números de configuración para gsm") que permite llamar a ciertas rutonas de los programas aunque no tengan UI para ellas. Esos códigos abren pantallas de diagnóstico, cambian configuraciones, etc. Se procesan en el dialer, y son diferentes para cada modelo, parece (Fascinate, Desire, etc).

Las aplicaciones lo reciben como un intent del tipo

android_secret_code://<codenumber>

Para que todo funcione, hay que hacer un filtro en la aplicación que lo quiere recibir; AFAIK, no hay que hacer un filtro para él, sino que basta que tu aplicación declare en el AndroidManifest algo del estilo de (ver el pdf mencionado antes):

...
<receiver android:name="TestingSettingsBroadcastReceiver">
            <intent-filter>
                 <action android:name="android.provider.Telephony.SECRET_CODE" />
                 <data android:scheme="android_secret_code" android:host="225" />
            </intent-filter>
       </receiver>


Así pues, si quieres el menú de pruebas de settings, en el Settings.git dice:
<data android:scheme="android_secret_code" android:host="4636" />

Con lo que hay que escribir en el dialer: *#*#4636#*#* y sin dar ninguna otra tecla, el dialer mandará el intent y el programa de settings lo recogerá mostrando la actividad de test.

Friday, 2 September 2011, 7:00:36 pm
Overview de Android Asombrasamente, está en la guía de portado de Android a Qt.

Información sobre el binder En Android 2.3.4, la información del binder está en /sys/kernel/debug/binder; para ver el estado:
phonedevel$ abd shell
$ cd ./sys/kernel/debug/binder
$ cat state
$ ls proc


Friday, 2 September 2011, 6:31:36 pm
Binder documentation El binder es la IPC nativa de Android. Post con un draft de un tutorial del binder de Android (incompleto, pero mejor que nada sí que es). Además:

Friday, 2 September 2011, 6:05:56 pm
Ejemplo (Android pre-1.0 si no me equivoco) que muestra una aplicación con lista y menú de opciones Using The Service Directory (My Life With Android)

Wednesday, 31 August 2011, 6:47:07 pm
Blog: mylifewithandroid http://mylifewithandroid.blogspot.com. Es informativo, y tiene muchísimos ejemplos explicando qué gotchas ha visto, como este de expandable lists.

Especialmente interesante:
  • Tutorial del uso de binders. Incluye cómo crear un servicio y cómo hacer que dos aplicaciones hablen entre sí usando dicho servicio como intermediario por medio de los binders (o algo parecido O:-).

Tuesday, 30 August 2011, 6:59:16 pm
ListView cuyos items tienen varios elementos Este ejemplo, pero lo hace con un "custom listadapter". Realmente valen varios de los ejemplos, incluyendo el List4 (ListAdapter),List6 (ListAdapterCollapsed),List8 (Photos, enseña lo de los botones arriba y el list debajo). Es una pena que el List14 (EfficientAdapter ) no funcione en scala (bug)... en fin...
  • También es interesante el ExpandableList3, que tiene una lista con sublistas, pero cada elemento de la lista tiene un icono delante, y los hijos tienen dos líneas (!). Lo hace usando para la lista un array de hashmaps, y cada línea dentro del item es uno de los elementos del hasmap.

Tuesday, 30 August 2011, 6:41:54 pm
Diseño de Layout (tutorial) Diseño de layouts y la entrada correspondiente a las vies en la doc. de android.

Tuesday, 30 August 2011, 5:44:03 pm
Instalado el DroidDraw Resulta que el Pencil no sabe Importar/Exportar .xml de Layout de Android, por lo que al final he temrinado instalando el DroidDraw. Está en
 dario@phonedevel:~/android/droiddraw

Monday, 29 August 2011, 7:15:49 pm
Instalado en phonedevel el pencil para firefox y las android ui utilities Según este thread es una cpombinación aceptable.

Update: Para que el pencil pueda importar los "stencils" de android, hay un bug que corregir; he aplicado el parche y parece que todo bien.

Tuesday, 26 July 2011, 6:13:41 pm
Ejemplo de aplicación Scala-on-android: gist-it gist-it Es una aplicación scala para Android, con el código disponible en github. Además da enlaces a otros recursos interesantes:

Friday, 22 July 2011, 7:26:53 pm
Hacer listas que abran otras listas Aquí hay un tutorial para ello.

Thursday, 21 July 2011, 7:42:58 pm
Capturar las teclas de volumen En este post te indican cómo capturar las teclas de volumen y como quitar el pitidito de cuando se presiona dicha tecla. En este otro te dicen cómo hacer lo correspondiente con el "long press". Problemas de capturar teclas:
  • No son system-wide, sino sólo cuando la apli está en trimer plano
  • No lo recomeiendan (por si se usa la música, etc); no sé cómo se comporta con respecto a las llamadas (en ppio sólo modifica el volumen del timbre, ¿no?)

Las únicas alternativa que veo son:
1. poner widgets en la pantalla de "home". Problema: hay que desbloquear
2. hacer un "desbloqueador" propio con dicha funcionalidad

Y creo que tendré que hacer lo segundo.

Friday, 8 July 2011, 8:09:31 pm
Para conseguir compilar el tcmprototype He hecho lo siguiente, además de los pasos seguidos en el post de "Tuesday, 5 July 2011, 7:37:58 pm":
 cd ~/android
 . env.sh
 cd tcmprototype/TcmPrototype/
 rm build.xml build-scala.xml local.properties
 cp /home/dario/android/android-sdk/Snake/build*.xml .
 cp /home/dario/android/android-sdk/Snake/*.properties .
 sed -i "s/Snake/TcmPrototype/g" &star;.properties build*.xml
 mkdir configs 
 cp /home/dario/android/scala/docs/android-examples/android-sdk/Snake/configs/ant-invoked.jar configs/
 cp /home/dario/android/scala/docs/android-examples/android-sdk/Snake/configs/*.cfg configs/
 ant install


Thursday, 7 July 2011, 7:43:57 pm
Peleando con el ant para que compile el proyecto de prueba Según este post, las instrucciones de michelou para compilar scala para android están desactualizadas, y propone como alternativa usar en su lugar Simple Build Tool (SBT)Android plugin for SBT>https://github.com/jberkel/android-plugin, que tiene problemas diferentes (ver el post). Mmmmm... habrá que investigar un poco más.

Update: ¡Lo conseguí! No estaba encontrando el path a los jar que implementan el compilador de scala. Para hacer que lo encontrase ha bastado generar un fichero local.properties en el raíz del proyecto con los paths de los jar (la prueba la estaba haciendo en dario@phonedevel:~/android/android-sdk/Snake. Vamos, en resumen:
 local.properties
scala-compiler.jar=/usr/share/java/scala-compiler.jar
scala-library.jar=/usr/share/java/scala-library.jar

Para que encuentre el scala y el proguard sin necesidad de poner local.properties Hay que hacer lo siguiente:
 # cd /opt
 # ln -s /usr/share/java scala
 # ln -s /usr/share/java proguard
 # cd /usr/share/java
 # ln -s . lib



Wednesday, 6 July 2011, 7:13:20 pm
Hacer que compilen los ejemplos de scala-android Para que los ejemplos de esta página (están descomprimidos en phonedevel:/home/dario/android/android-sdk/ ) compilen, he tenido que hacer:
# ln -s /home/dario/android-sdk-linux_x86 /opt/android-sdk-linux_86

Y por otro lado he actualizado el SDK con
 ~/android-sdk-linux_x86$ tools/android update sdk
"Accept all" -> "Install"

Update (20110707): Sigue sin funcionar; sigue diciendo que no encuentra scalac (una task). También he probado sin éxito: bajar el código de "android-sdk" del svn de scala; instalar el proguard como paquete; poner enlaces adicionales en /opt para scala y proguard (he probado a apuntarlos tanto a /usr como a /usr/share/java).

Tuesday, 5 July 2011, 7:37:58 pm
Generando el nuevo proyecto tcmprototype para android Se ha hecho lo siguiente:

1. En phonedevel, como usuario dario se ha generado el nuevo proyecto con estas instrucciones, es decir
 cd ~/android/
 . env.sh
 mkdir tcmprototype
 cd tcmprototype
android create project --name tcmprototype -k es.sicosoft.tcmprototype -a TcmPrototype --target android-10 --path TcmPrototype

2. Se hace un cd al directorio del nuevo proyecto y se edita (vi) el build.xml al que se le hacen las modificaciones que dice aquí:
 cd TcmPrototype/
wget http://www.assembla.com/spaces/scala-ide/documents/ajkjugweOr34DAeJe5cbCb/download/scala-android-ant-snippet.txt -O build-scala.xml
 vi build.xml
 :/setup \/
 o
 <import file="build-scala.xml" />
 ESC
 :wq

3. Se genera el directorio tools con los jar que se mencionan aquí:
 mkdir tools
 cd tools
 cp /home/dario/android-sdk-linux_x86/tools/proguard/lib/proguard.jar .
 cp /home/dario/android-sdk-linux_x86/tools/proguard/lib/retrace.jar .
 cp /usr/share/java/scala-compiler.jar .
 cp /usr/share/java/scala-library.jar .

4. Se modifica el programa de ejemplo para que sea scala en vez de java:
 cd src/es/sicosoft/tcmprototype/
 mv TcmPrototype.java TcmPrototype.scala
 vi TcmPrototype.scala

5. Se compila y se prueba:
 cd ~/android/tcmprototype/TcmPrototype
 DISPLAY=:0 ~/android/emulator.sh &
(Se espera a que el emulador haya arrancado en la pantalla de phonedevel...)
 ant install



Friday, 17 June 2011, 12:36:33 pm
Artículos sobre desarrollo de aplicaciones Android con Scala Son especialmente interesantes los siguientes:

Tuesday, 14 June 2011, 4:55:12 pm
Android development with sane tools Un tutorial de cómo usar el vi para desarrollar para android (evitando eclipse): Android development with sane tools.

Friday, 29 April 2011, 12:00:21 pm
Más cosas sobre scala en la Dalvik JVM Use of recursion in Scala when run in the JVM Básicamente dice que sólo se puede usar tail-recursion si es directa (se llama a la propia función como última acción de la función). Se puede forzar un error si no puede optimizarlo usando:
 import scala.annotation.tailrec
@tailrec def ...
p.ej.
import scala.annotation.tailrec

@tailrec def nth[T](n : Int, list : List[T]) : Option[T] = list match {
            case Nil => None
            case _ if n == 0 => None
            case _ :: tail if n == 1 => list.headOption
            case _ :: tail  => nth(n - 1, tail)
}





Tuesday, 19 April 2011, 8:00:15 am
Programar para Android en Scala en vez de en Java Building Android apps in Scala with sbt, maidroid (example chinese program written in scala for android) (source). Scala (introducción) permite usar todos los APIs de Android, requiere menor "boilerplate code" que Java y es un lenguaje más moderno (más "duro" según algunos porque permite programación funcional, pero eso es un plus para alguien acostumbrado a TCL).

Interesante: Which programming languages can I use on Android Dalvik? (thread de Jun 2010).



Monday, 11 April 2011, 9:19:28 am
Autorizar la instalación de aplicaciones desde sitios alternativos Ejemplo para la tienda de Apps de Amazon. Es lo que tienen que hacer los usuarios en vez de usar el adb. Quizás se podría hacer algo así para Metro...

Thursday, 7 April 2011, 10:12:39 am
The Decaffeinated Robot Charla de programación en Android sin Java.

Monday, 4 April 2011, 10:10:34 am
Getting started Para ir empezando, este tutorial parece adecuado, y después este otro sobre "services". También son útiles los artículos de developer.android.com.
Uso de phonedevel con x2x Para facilitar el uso de phonedevel, he instalado el x2x en salchicha, y puesto en pwm-dock-start.sh que arranque una ventana con el x2x, mientras en el phonedevel he hecho un $HOME/.profile para poner el "xhost +" de rigor --resulta que ni el .xsession ni el .xinitrc funcionan por defecto :-???, solo el .xprofile.

Wednesday, 30 March 2011, 1:13:49 pm
Otro tutorial para instalar el Android SDK en squeeze Instalar Android SDK + PhoneGap en Debian Squeeze (en). Sñolo he instalado el SDK, obviando la parte de eclipse y del phonegap.

Instalar el NDK Es tan sencillo como bajarse el .tgz y descomprimirlo en el $HOME. Viene con ejemplos.

Wednesday, 30 March 2011, 1:04:43 pm
Resultado de la puesta en marcha del wifi en phonedevel: vuelta a madwifi Mi conclusión es que hostapd de sid (0.7.3) junto con el driver de ar5k que hay en 2.6.38 tienen un problema. He compilado el madwifi actual y ha quedado funcionando con:
kernel2.6.38
madwifi0.9.4-current
udhcpd (busybox)1:1.17.1-8
bind91:9.7.2.dfsg.P3-1.1
Ahora se usa como servidor dhcp el udhcpd en vez del isc-dhcdcd-server que usaba en symbiandevel. Las script /etc/init.d/firewall ha sido modificada para usar como lista de MACs la lista proveniente del /etc/udhcpd.conf (antes usaba la de la configuración del isc-dhcpd-server, que es más encgorroso de actualizar con nuevos terminales)y se ha hecho que al ejecutar la script de firewall se active ip_forwarding (ipv4). Se ha puesto como DNS al propio phonedevel.

Instalada la pila bluetooth en phonedevel Se han instalado los siguientes paquetes:
 # apt-get install bluetooth bluez python-bluez python-lightblue obexftp
Además se ha copiado el script simple-agent a /home/dario/simple-agent para poder hacer vinculaciones bluetooth sin necesidad de arracar el bluetooth-applet.

Friday, 18 March 2011, 1:01:36 pm
Puestan en marcha de la red wifi en phonedevel Resulta que el hostap que viene en squeeze es "buggy" (v.0.6) para la tarjeta de red wifi "AR5001X+" que estoy usando. La solución es usar uno más moderno; voy a instalar el de Debian 7.0 "wheezy" (hostapd 0.7.3).

Monday, 7 March 2011, 9:31:46 am
UI Guidelines Hay uno de Android Interaction Design Patterns y otro de Pantallazos de iOS

Friday, 25 February 2011, 10:31:34 am
Artículo sobre el NDK de Android 2.3 Gingerbread Este: Android 2.3 (Gingerbread) NDK now close to pure Native Development.

Descripción del proyecto


Es un port a Android de la aplicación de TCM que ya existe en Symbian.

Cómo compilar el proyecto
TCM para Android implementado en Java con Widgets y Foreground Services.

Son 4 programas:
  • tcmandroid (java): implementa TcmWidget
  • tcm (mirah): implementa TcmPortones
  • tcm (hecl): implementa Tcm (la aplicacion principal)
  • tcmalarmas (java): implementa TcmAlarmas (servicio,recepcion de alarmas)

tcmandroid

Está preparado para ser compilado en el directorio

 /home/dario/android/tcmandroid

(el SDK está instalado en phonedevel)

Para compilar

ssh dario@phonedevel
cd android
. env
cd tcmandroid
ant debug && ant installd


tcmalarmas

Se hace de forma similar al anterior

ssh dario@phonedevel
cd android
. env
cd tcmalarmas
ant debug && ant installd
./start-service.sh


tcm (mirah)

Se hace ligeramente diferente, ya que usa el compilador de mirah:

ssh dario@phonedevel
. android/env.sh
cd mirah/tcm
rake javac
rake debug
rake installd


tcm (hecl)

También es diferente, ya que está implementado en hecl/java:

ssh dario@phonedevel
cd src.hecl
./build.sh tcm.hcl


backups

Hay una script (haz-backup.sh) en cada uno de los directorios de los proyectos de phonedevel que hace un backup a salchicha para que quede guardado en el backup semanal de seraphim.

tmandroid, tcm (mirah) y tcmalarmas tienen el backup en
 salchicha:Programacion/proyectos/sico-tcmandroid/

tcm(hecl) tiene el backup en
 salchicha:Programacion/proyectos/sico-hecl/


Información de portado de la aplicación TCM a Android.

Para instalar el SDK de Android, se pueden usar estados dos Guías (usan Debian Lenny y Android 2.2). En nuestro caso, es instalar para Android 2.3 en Debian Squeeze:

  • Developing Android applications on Debian>http://workaround.org/developing-android-applications-on-debian
  • Instalación de SDK android en Linux (debian). Conexión adb>http://www.samsunggalaxys.es/viewtopic.php?f=35&t=552
  • Configuración del udev para el adb>http://wiki.cyanogenmod.com/wiki/Udev

Se ha migrado symbiandevel a squeeze (instalación en HDD nuevo, dejando el otro como copia de seguridad histórica), con el consiguiente cambio de nombre a phonedevel, ya que posee los SDKs de Symbian, Android y J2ME.

MACs e IMEIs de los teléfonos de pruebas


TeléfonoIMEIMACActualziación a ICS
nexuss354494040600873b4:07:f9:c4:56:00Por google
galaxy5
YP-G70CW/XEH
000000000000000d4:88:90:03:67:f0root, CM9 beta
galaxy4
YP-G1CW/XEF
00000000000000020:13:e0:cb:e2:13Not found
galaxyY
GT-S5360
gris moleteado
352172059132929cc:fe:3c:8f:3c:ecroot, CWM (no soportado), CM9, CM9
mini plus
GT-S5570I
Verde
3585240422056309c:02:98:09:e7:1cCM9,CM9 NO VALEN, son para el mini!
mini2
GT-S6500
amarillo
359827040509732cc:fe:3c:2e:94:8cNot found
ace+
GT-S7500
grafito azulado
3588660402470689c:02:98:a1:b3:e1Not found
Nexus 5352136066125119cc:fa:00:f2:b8:b5Viene con Android 4.4 KitKat

Sobre las actualizaciones: lista genérica.

Tutorial de cómo compilar e instalar desde Linux un android ICS para el LG 2x, los pasos a realizar valen para el resto de terminales (thread completo).
Tutorial de cómo instalar un ROM en Android (y otro).

Programación en Java y en Android:

Attachs

csipsimple-configlock.diff
trebuchet-sico.diff
trebuchet-sico-v2.diff
tr.apk
eu.chainfire.flash-2.apk
eu.chainfire.supersu.apk