Source: http://huawei.creaforo.net/t177-modificar-juegos-resolucion-y-otras-cosas-parte-i
Timestamp: 2018-02-24 05:43:55+00:00

Document:
Modificar juegos (resolucion y otras cosas) Parte I
y220 pantalla u9200 y300 U8500 español play sygic movil Honor y320 huawei cambiar para
por Alex 19 16v el Vie Oct 14, 2011 12:00 am
Tuto Android como cambiar resolución, reasignar teclas, etc
Acá comparto con ustedes una base para entender a como modificar juegos.
• Cambiar resolución
• Ayustar pantalla táctil
• Renovar cache
• Reasignar teclas
Antes de empezar les aclaro que la información que de aquí en mas puedan usar es antes que nada una referencia para poder tener una idea de lo que estamos por hacer al modificar los algoritmos de android, esta demás decir que si tienen conocimientos en programación mucho mejor.
Es bastante largo el tema por ese motivo lo voy a separar en partes
Y que es bastante complejo el tema y requiere dedicación y prueba tras prueba hasta encontrar el resultado buscado,
(si sos de los que tienen problemas para hacer funcionar un juego no te lo recomiendo, así como no esperes encontrarte con una aplicación como Virtual Key de symbian por que no va a ser así)
Tengan en cuenta que la interpretación del Ruso al castellano suele dar a mal entendidos, ósea que aun estoy terminando de darle un mejor entendimiento y así lograr la mejor explicación posible que es la que les transmito a ustedes.
Así que sin más procederemos al tema.
Necesitaremos los siguientes programas:
1. APK Manager
2. Cualquier editor de texto
3. Ida Pro 5.5
4. Cualquier editor hexadecimal ejemplo: UltraEdit
Ahora vamos a pensar que el juego está optimizado para la pantalla HVGA / QVGA?
Se puede dividir en varias etapas.
1. Cambiar la resolución de HVGA / QVGA.
2. Ajuste de la rejilla de la pantalla táctil.
3. Cómo deshabilitar la memoria caché (necesario para ser capaz de convertir el vídeo de introducción a menor resolución).
4. Asignación de un botón de hardware en cualquier acción (necesario para los teléfonos sin multitouch).
Antes de proceder a cualquier etapa de la optimización, es necesario obtener el código fuente original, sin duda no será fácil, pero podemos obtener un código de Java byte, que es bastante útil a nuestro problema, sería suficiente. Con este fin, utilizamos "APK Manager".
Instalar y usar un "Administrador de APK".
El programa de instalación no es nada complicado, basta con descomprimir en cualquier carpeta.
También se recomienda que un script.bat archivo, localizado en la carpeta "APK Manager",
Cambie "heapy juego = 64" a un valor más alto, como 256 o 512, para evitar problemas con los archivos grandes empresas agroindustriales.
Trabajar con "Administrador de APK" también no presenta dificultades. Requerido archivo AIC pone en la carpeta de "lugar-APK-aquí-para-modding", ejecute "script.bat" y la ventana emergente con el texto en verde, pulse el botón "9" y "Enter". Menos de un minuto después, la carpeta "proyectos" que desempaquetar el archivo AIC. Paquetes de la misma, ejecute "script.bat", haga clic en "11", "Enter", la pregunta es si el sistema APC? "Hit" n ". Y al final, cuando el AIC lleno de archivo, lo firme, para que la prensa "12" y "Enter". Como resultado, tenemos en la carpeta "lugar-APK-aquí-para-modding" archivo con el nombre firmado [el nombre del archivo original-AIC]. APK. Además, acerca de "gestor de APK" se puede leer aquí .
Además en el texto que se perderá la descripción del proceso de desempaquetado / archivos AIC zapakovki.
Asimismo, antes de comenzar, le recomiendo que revise primero una lista de comandos de código de bytes Java.
Ahora usted puede traspasar directamente a la optimización, por ejemplo voy a utilizar el juego de "Modern Combat: Tormenta de arena".
1. Cambiar la resolución de la prestación de HVGA / QVGA.
La mayoría de los juegos en Android, escrito usando OpenGL, un permiso de OpenGL dada por la función "glViewport", y el uso voluntad. El más óptimo, creo que la función "glViewport" lugar en la función "OnDrawFrame". Para ello, buscando en la carpeta "smali", que se encuentra en una carpeta con raspakovanym archivo AIC, busque un archivo que contiene la función "OnDrawFrame". Por lo general, este archivo se denomina "GameRenderer.smali" o "[Nombre del Juego] Renderer.smali", en este caso, "SandstormRenderer.smali". Ábralo en el Bloc de notas u otro editor de texto y encontrar en él la función "OnDrawFrame".
He aquí un fragmento de esta función.
. Método público onDrawFrame (Ljavax/microedition/khronos/opengles/GL10 V
. Locales 6
. Parámetros "gl"
. Línea 174
. Línea 177
. Locales v0, el tiempo: J
invocar estática {}, Ljava / lang / Sistema; - currentTimeMillis> () J
movimiento en todo el resultado de v0
. Línea 179
invocar estática {}, FCM / gameloft / android / Gand / GloftMCHP / GLMediaPlayer; -> actualizar () V
. Línea 180
invocar estática {}, FCM / gameloft / android / Gand / GloftMCHP / SandstormRenderer; - nativeRender> () V
. Línea 186
movimiento en todo el resultado de la v4
sub-largo v0, v2, v4
. Línea 188
cmp largo v2, v0, v2
si-lez v2: cond_0
. Línea 190
: Try_start_0
invocar estática {v0, v1}, Ljava / lang / Autor; - el sueño> (J) V
: Try_end_0
. Captura Ljava / lang / Excepción; {: try_start_0 .. : Try_end_0}: catch_0
. Línea 193
: Cond_0
: Goto_0
retorno vacío
: Catch_0
movimiento excepción v2
Ir a: goto_0
. Método de finalización
En este fragmento de código para agregar la llamada a la función "glViewport", de modo de obtener, como en el siguiente fragmento de código.
. Locales 9
const / 4 v6, 0x0
invocar la interfaz de {p1, v6, V6, V8, v7}, Ljavax/microedition/khronos/opengles/GL10; - glViewport> (IIII) V
Lo que hemos hecho aquí? Hemos añadido tres constantes (v6, v7, v8), asignarles un valor de coordenadas de la parte inferior izquierda; v6 () y superior derecha v6 (v8, v7) esquina de la pantalla y se transfiere a la función "glViewport". Creo que es comprensible que para las coordenadas de la esquina inferior izquierda de la X e Y se usa solo y también una constante v6? Dado que tanto X e Y en este rincón son iguales. Además, cambia la línea 2-ésima en la función ". Locales de 6" sobre ". Locales 9", que determina el número de constantes y variables utilizadas en funciones, por lo que hemos añadido tres constantes, 6 +3 = 9. También tenga en cuenta que los nombres de las constantes (v6, v7, v8), no se toman casualmente, seleccionados por centrarse en ya se utiliza en la función de las constantes. Si de pronto alguien no entendió, 0x1E0 en decimal sería 480 y 0x140 - 320.
También presta atención a la función "onSurfaceCreated".
. Públicos Método onSurfaceCreated (Ljavax/microedition/khronos/opengles/GL10; Ljavax / MicroEdition / khronos / EGL / EGLConfig V
. Locales 7
. Parámetro "config"
const / 4 v3,-0x1
. Línea 138
const / 4 v0, 0x2
const cadena v1 "SandstormRenderer"
const cadena v2, "onSurfaceCreated"
invocar estática {v0, v1, v2}, FCM gameloft / / android / Gand / GloftMCHP / GLDebug; - debugMessage> (ILjava / lang / String; Ljava / lang / String V
. Línea 141
invocar-directa {p0}, FCM / gameloft / android / Gand / GloftMCHP / SandstormRenderer; - nativeGetJNIEnv> () V
. Línea 142
invocar estática {}, FCM / gameloft / android / Gand / GloftMCHP / GLResLoader; - inicio> () V
. Línea 143
invocar estática {}, FCM / gameloft / android / Gand / GloftMCHP / GLMediaPlayer; - inicio> () V
. Línea 144
invocar estática {}, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; - nativeInit> () V
. Línea 146
sget v0, FCM / gameloft / android / Gand / GloftMCHP / SandstormGLSurfaceView; - mDevice_W>: I
-eq si v0, v3,: cond_0
sget v0, FCM gameloft / / android / Gand / GloftMCHP / SandstormGLSurfaceView; - mDevice_H>: I
si ne-v0, v3: cond_1
. Línea 149
movimiento excepción v6
. Locales v6, por ejemplo: Ljava / lang / Excepción;
invocar virtual} {v6, Ljava / lang / Excepción; - printStackTrace> () V
. Línea 154
. Fin locales v6 # ejemplo: Ljava / lang / Excepción;
: Cond_1
sget v1, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; - m_bEnableKeyboard>: I
const / 4 v2, 0x1
sget v3, FCM / gameloft / android / Gand / GloftMCHP / SandstormGLSurfaceView; - mDevice_W>: I
sget v4, FCM gameloft / / android / Gand / GloftMCHP / SandstormGLSurfaceView; - mDevice_H>: I
sget v5, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; - mCurrentLang>: I
movimiento de objetos v0, p0
invoke-direct/range {v0 .. v5}, FCM / gameloft / android / Gand / GloftMCHP / SandstormRenderer; - nativeInit> (II-III) V
. Línea 155
Es decir, el código
En este código, la variable v3, v4 asignado a la pantalla de los dispositivos de la resolución real, y pasa a la función "nativeInit". Dado que el juego sigue siendo diseñado para 480x800 de resolución, es mejor tener el pensamiento de juego que tiene un dispositivo con esta resolución en particular. en este código se sustituye por
Si no experimenta problemas.
Usted puede preguntar y 480h720, ya que la proporción de las pantallas con 480x800 y 320x480 son diferentes y cuando "exprimir" el panorama es ligeramente aplanado. Pero en este caso, en la fase de "red de contacto de ajuste pantalla, el coeficiente debe suponerse que entre 800 y entre 720 y será 1,666666666666667 y 720/480 = 1.5
En otros juegos en lugar de código, tal vez algo como esto
invocar virtual} {v0, Landroid / ver / Display - getwidth> () que
movimiento número v3
invocar virtual} {v0, Landroid / ver / Display - getHeight> () que
movimiento número v4
De todos modos se sustituye por:
O nombres de variable no puede v3, v4 y V1, V2. O nada que ver con que sea, entonces no tengo nada que hacer.
O si surgen problemas, usted puede en el caso, ir en busca de todos los "*. smali" pozamenyat archivos y todas las funciones llamadas "Landroid / ver / Display - getwidth> () I" y "Landroid / ver / Display - getHeight> () Yo ", la padecen no lo hará.
Para algunos juegos, nuestro trabajo es suficiente y segura cambiar los permisos de todos los gráficos que usted necesita. Para hacer esto de nuevo los paquetes de AIC-archivo y comprobar que el teléfono mientras trabaja. Si todo va bien ir a la opción "red de ajuste de la pantalla táctil." Si no, siga leyendo. En nuestro caso, con el juego Modern Combat: Tormenta de arena, no todo es facil, hasta que el permiso necesario, y el menú - no.
Esto significa que en algún lugar de la función se llama "glViewport" y, a continuación, cambia la resolución a 480x800. Así, como en los archivos "*. smali" función "glViewport" no llame, se puede comprobar mediante la búsqueda, por lo que en el caso de la biblioteca "libsandstorm.so".
La idea principal de el siguiente paso, quite todas las llamadas a funciones de la biblioteca "glViewport".
Para el análisis de la biblioteca, necesitamos el "IDA Pro". Para mayor comodidad, copia "libsandstorm.so" en cualquier carpeta, ejecute "IDA Pro" y haga clic en el botón "Nuevo"
Siguiente "Varios archivos", "archivo desconocido" y haga clic en "Aceptar".
En la ventana, abra el archivo de especificar la ruta de acceso a la biblioteca "libsandstorm.so" y haga clic en "Abrir".
En la siguiente ventana, cambiar el "Tipo de procesador" a "processorARM710a ARM", a continuación, haga clic en "Set" y "Ok".
Si después de esto, habrá otra ventana con cualquier cosa, haga clic en "Aceptar". Ahora tiene que esperar a que el desmontaje. Este proceso es bastante largo, en este se puede ir a fumar o tomar café
El hecho de que la ingeniería inversa se ha completado, se mostrará un mensaje "El autoanálisis inicial se ha terminado." En la ventana inferior "casilla de salida.
Para mayor conveniencia, en este caso, haga clic en el botón derecho del ratón sobre un campo azul, y en el menú contextual, seleccione "Ver Texto". Mover al principio del código ensamblador para la búsqueda de "glViewport".
Resultado de la combinación de teclas "Alt + T" en el cuadro de diálogo para introducir la búsqueda "glViewport" y haga clic en "Aceptar".
Estamos interesados en función de las llamadas "BLX glViewport", "glViewport BL", "B glViewport", "glViewport BX", etc Todas las demás menciones de "glViewport" las ignoramos "Ctrl + T" y continuar la búsqueda.
Un lugar es necesario, cambiar a la hexagonal de Ver-A ".
Asegúrese de que la llamada a la función es de 4 bytes y un "CE F7 E8 D4" (en su caso, estas cifras pueden ser diferentes), es necesario para ver lo que hay que corregir y no accidentalmente sobrescribir nada extra.
Llamar a esta función que necesitamos para beber, ya que debe ser sustituido por "D4 E8 F7 CE" (en su caso, estas cifras pueden ser diferentes) sobre "C0 46 C0 46. Recuerde que la dirección "001F994A" y ejecutar el editor hexadecimal, yo uso "UltraEdit". Abierto a nuestra biblioteca.
Con el fin de llevarnos a la dirección correcta, haga clic en las teclas "Ctrl + G", en el cuadro de entrada aparecerá "0x001F994A" y haga clic en "Aceptar".
En movimiento, vemos que afectó a donde quieras, todo el código hexadecimal converge al hecho de que vimos en "IDA Pro" ficha "Hex Ver-A".
Corregir el marcado "CE F7 D4 E8" en la "C0 46 C0 46.
Cambia a "IDA Pro" y continuar para buscar el siguiente se llama "glViewport", puede haber varias decenas. Ellos han sido tratados de manera similar.
Cuando todas las llamadas a la bebida, se conserva. Copiar para colocar una versión revisada del "libsandstorm.so". Paquetes de ank-archivo y configurar el teléfono para comprobarlo. Si se hace correctamente, el smashtabiruetsya programación completa hasta que el permiso necesario.
2. Ajuste de pantalla táctil de la red
Incluso cuando hemos optimizado el gráfico de pantalla HVGA / QVGA y todos los botones en la pantalla que aparecen en los lugares correctos en la pantalla táctil la red están en el viejo campo, fuera de la pantalla.
Se parece a esto.
1 - Este es el lugar actual de la elaboración de un botón.
2 - Un viejo lugar de la prestación en el botón y la ubicación actual de los botones de la pantalla táctil la red.
Solución es bastante simple, es necesario asegurarse de que al tocar la pantalla en el punto 1, el juego pensado que el toque en el punto 2. Para que esto cuenta como ha cambiado, como resultado de la etapa anterior, las coordenadas elaborado botones de la pantalla. Para averiguarlo, tenemos que calcular la relación de cuántas veces la resolución de pantalla HVGA / QVGA menos WVGA.
Para HVGA [/ B]
X: 800/480 = 1,666666666666667
Y: 480/320 = 1,5
Para QVGA [/ B]
X: 800/320 = 2.5
Y: 480 / 240 = 2
Por tanto, si las coordenadas de los botones en la pantalla WVGA, por ejemplo, se 700h360, a continuación, la pantalla HVGA, ya coordenadas 420h240 (700 / 1,666666666666667 = 420, 360 / 1,5 = 240). Este patrón se mantiene para el resto de botones en la pantalla.
Esa es nuestra tarea para asegurarse de que cuando un jugador toca las coordenadas 420h240 juego pensó que estaba tocado en las coordenadas 700h360.
De esto se desprende que sólo las coordenadas de la pantalla táctil para multiplicar por 1,666666666666667 X, Y de entre 1,5 y pantalla HVGA de 2,5 y X, Y 2 para QVGA.
Lo haremos en el controlador de eventos con pantalla táctil "onTouchEvent". Con la búsqueda nos encontramos con que tiene los archivos "GameInstaller.smali" y "Sandstorm.smali". Queremos a alguien que está en el archivo "Sandstorm.smali".
. Método onTouchEvent público (Landroid / ver / MotionEvent Z
. Locales 10
. Parámetros "evento"
const / 4 v9, 0x1
const / 4 v8, 0x0
. Línea 379
invocar virtual {p1}, ver Landroid / / MotionEvent; - getAction> () que
movimiento número v0
. Línea 380
. V0 local, la acción: I
and-int/lit16 v4, v0, 0xff
. Línea 382
. Locales v4, la máscara: Yo
invocar virtual {p1}, ver Landroid / / MotionEvent; - getPointerCount> () que
movimiento número v1
. Línea 383
. V1 local, cuenta: yo
const v6, 0xff00
and-int/2addr v6, v0
shr-int/lit8 v5, v6, 0x8
. Línea 388
. Locales v5, pointerId: Yo
si v0-nez,: cond_0
. Línea 390
invocar virtual {p1} v8, vista Landroid / / MotionEvent; -> getX (I) F
movimiento número v6
flotador-a-int v6, v6
invocar virtual {p1} v8, vista Landroid / / MotionEvent; -> Gety (I) F
movimiento número v7
flotador-a-int v7, v7
invocar-directa {p0, v6, v7, v8}, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; -> nativeTouchPressed (III) V
. Línea 394
const / 4 v6, 0x5
si ne-v4, v6,: cond_1
. Línea 397
invocar virtual {p1, v5}, ver Landroid / / MotionEvent; -> getX (I) F
invocar virtual {p1, v5}, ver Landroid / / MotionEvent; -> Gety (I) F
invocar-directa {p0, v6, v7, v5}, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; -> nativeTouchPressed (III) V
. Línea 400
const / 4 v6, 0x2
si ne-v0, v6,: cond_2
. Línea 402
const / 4 v2, 0x0
. Locales v2, i: I
si ge-v2, v1: cond_2
. Línea 403
invocar virtual {p1, v2}, ver Landroid / / MotionEvent; - getPointerId> (yo)
. Línea 405
. Locales v3, id: Yo
invocar virtual {p1, v3}, ver Landroid / / MotionEvent; -> getX (I) F
invocar virtual {p1, v3}, ver Landroid / / MotionEvent; -> Gety (I) F
invocar-directa {p0, v6, v7, v3}, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; -> nativeTouchMoved (III) V
. Línea 409
. Fin locales v2 # i: I
. Fin locales v3 # id: Yo
: Cond_2
const / 4 v6, 0x6
si ne-v4, v6,: cond_3
. Línea 412
invocar-directa {p0, v6, v7, v5}, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; -> nativeTouchReleased (III) V
. Línea 415
: Cond_3
si ne-v0, v9,: cond_4
. Línea 416
. Reinicie locales v2 # i: I
: Goto_1
si ge-v2, v1: cond_4
. Línea 418
. Línea 421
. Reinicie locales v3 # id: yo
invocar-directa {p0, v6, v7, v3}, FCM / gameloft / android / Gand / GloftMCHP / Tormenta de arena; -> nativeTouchReleased (III) V
Ir a: goto_1
. Línea 427
: Cond_4
volver v9
Llamamos la atención a la funciónes que nos interesan:
Estas funciones y definir las coordenadas de tocar la pantalla táctil, inmediatamente después de ellos, multiplicamos las coordenadas en una coeficientes calculados.
Para HVGA debe hacerlo.
mul-int/lit8 v6, v6, 0xa
div-int/lit8 v6, v6, 0x6
mul-int/lit8 v7, v7, 0x3
div-int/lit8 v7, v7, 0x2
Aquí está el código que hemos añadido a la función
Espero que todos hayan entendido que multiplicar por 10 (A en hexadecimal) y se divide en 6, que es lo mismo que multiplicar por 1,666666666666667 y multiplicando por 3 y dividirlo por 2 - lo mismo que multiplicar por 1,5.
En principio, podemos proceder de manera diferente y multiplicar las coordenadas del código en la función "onTouchEvent" no añadir, en cambio, para crear funciones alternativas "nativeTouchPressedMod", "nativeTouchMovedMod", "nativeTouchReleasedMod". Reemplazarlos, llamó a "onTouchEvent" características originales "nativeTouchPressed", "nativeTouchMoved", "nativeTouchReleased". Y en funciones alternativas para multiplicar las coordenadas y los llamamos a la función original. Esto es especialmente útil en aquellos juegos en los que en lugar de un 3 funciones "nativeTouchPressed", "nativeTouchMoved", "nativeTouchReleased" utiliza un "nativeOnTouch" (un ejemplo de un juego "Hero of Sparta", sigue habiendo una necesidad de crear sólo una-c función alternativa "nativeOnTouchMod", y sólo en uno hay que añadir la multiplicación de código de coordenadas, que es más conveniente. Aunque este método es más conveniente, me parece que sería más difícil para los principiantes, en este no lo voy a describir en detalle. Si alguien quiere conocer mejor este método, se puede ver cómo se implementa en el "Hero of Sparta", acaba de comparar los archivos "HeroOfSparta.smali" con la versión original y la versión optimizada para HVGA / QVGA.
No se porq no me deja poner el link de las imagenes subidas en el otro post espero q lo puedan entender
Esta es la parte 1 del tuto para pasar los juegos...q alguien se anime a hacer el copy past de la 2 parte
Gracias por supuesto al muchacho q lo puso en T¡(Mauro Gonzales) no se si sera de el o le pertenecera a otro

References: resolución

 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución