![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Desarrollando para AndroidEnlaces: 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:
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:
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:
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:
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 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:
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.javaY 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 :-(
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.pubde 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):
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 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 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
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:
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-smg900f5. Se abre el odin .\Odin3-v3.10.6.exe6. Se da al botón de AP y se selecciona el kernel ANE2: G900FXXU1ANE2_G900FOXX1AND3_G900FXXU1ANE2_HOME.tar.md57. 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):
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-smg900f50. Se abre el odin .\Odin3-v3.10.6.exe51. 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:
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:
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:
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
Red/Amber palette
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.apk6. 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 exit10. 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.xmlOculto 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.smaliY 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.smaliSe 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.smaliPara 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 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 CF-ROOT para el flashfire (instrucciones no oficiales) Es este: Download auto-root (el que hay que coger es el G900F) 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). 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 .. ./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
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 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 15. Te conectas al wifi 16. Ejecutas el towelroot Instalas el supersu 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.apk21. 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/extSdCard22. 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= trueY 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:
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
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.bin3. Flashear el recovery fastboot flash recovery recovery_1.54.401.10.img4. 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)
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.apkNOTA: 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-i386como 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.iconde la paleta a icons_subs, y los iconos del plano OperCtrlEmergUp.icona icons_inst Por último, para compilar el paquete, he aumentado la versión a 0.9.3 vi tcm.hclY 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 adbYa 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":
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:
Tuesday, 30 July 2013, 9:10:15 pm Restaurar un Desire C a firmware "stock" Está en esta thread: El procedimiento es:
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:
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
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:
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:
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:
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
~/android/brandinglock-desirec/htclockscreenlite2zip-and-phone.sh
Aparte, se ha hecho un logo de metro en png con fondo transparente que se ha salvado como logometro_htc.png: logometro_htc.pngTamañ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):
htclockscreenlite2zip-and-phone.sh
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
~/android/brandingmetromode-desirec/frameworkres2zip-and-phone.sh
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
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
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
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:
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)
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:
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-bootloader7. 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-desirec11. 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
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:
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":
Sobre lo de modificar el classes.dex del 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
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 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.javaY 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
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:
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-jreAlternativa: 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.
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
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:
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:
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:
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:
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):
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:
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->ONSe pulsa en la línea de WiFi para poder añadir un nuevo punto de acceso Menú (arriba a la dcha) -> Añadir Red
Seleccionar "método de PIN" de protección de bloqueo y se introduce uno cualquiera, p.ej. 1111
Se da a "Guardar" Menú (arriba a la dcha) -> Avanzado
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 seguridadCon eso queda configurada la red usando PEAP. Sobre la configuración de VozIp:
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:
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:
Wednesday, 28 September 2011, 6:34:29 pm Proyecto TCM/Android, estado ETA: Miércoles 5 Octubre Objetivos
Completado
TODO
NOTA: OPC es para la semana del 10 de Octubre. Futuro
Tuesday, 27 September 2011, 6:38:34 pm Obtener el IMEI y la MAC en Adnroid Se hace con lo siguiente:
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:
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:
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...
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:
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" ☆.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
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 tcmprototypeandroid 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.
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:
Instalada la pila bluetooth en phonedevel Se han instalado los siguientes paquetes: # apt-get install bluetooth bluez python-bluez python-lightblue obexftpAdemá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 proyectoEs 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 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:
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
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:
Attachscsipsimple-configlock.difftrebuchet-sico.diff trebuchet-sico-v2.diff tr.apk eu.chainfire.flash-2.apk eu.chainfire.supersu.apk |