Rabu, 29 Februari 2012

Cara Mengubah resolusi aplikasi WVGA menjadi HVGA

Nah mungkin banyak juga aplikasi game yang sekarang ini sudah mulai tidak support untuk layar jenis HVGA . mah disini akan saya berikan tutorial untuk mengakali hal tersebut.




Akhir2 ini banyak game yang sebelumnya hanya bisa di jalankan di hp dewa (WVGA) sekarang bisa di jalankan di HVGA seperti hp saya dalam hal ini saya tidak mengajarkan untuk membajak gamenya tapi saya hanya mengajarkan bagaimana untuk "Mengoptimalkan" game2 yang dulunya hanya bisa di jalankan di WVGA dan ini saya dapatkan langsung dari empunya ~nops~ semuanya sifatnya sebagai edukasi
"Support Original game developer, Consider to buy official game if they make official HVGA version"

Cara ini dapat di bagi menjadi beberapa tahapan:

Tahap Pertama

  1. Mengubah Resolusi Rendering Untuk HVGA/QVGA
  2. Menyesuaikan Grid layar sentuh
Tahap Kedua
  1. Cara Menonaktifkan Cache untuk mengubah resolusi Video
  2. Menetapkan tombol hardware (untuk tindakan apapun) digunakan untuk layar sentuh yg tidak support multitouch
Kita perlu program-program berikut:
1. APK Manager
2. Editor teks (notepad akan cocok ).
3. Ida Pro 5.5 (Cari di Google).
4. Setiap hex editor (Gunakan UltraEdit).
Sebelum melanjutkan ke tahap optimasi, kita perlu untuk mendapatkan kode sumber, kode sumber aslinya, kita tentu tidak mendapatkan, tetapi kita bisa mendapatkan kode java.
Untuk
tujuan ini, kita menggunakan "APK Manager".


Setup ini tidak rumit, cukup unzip ke folder apapun. Juga menganjurkan agar Script.bat file, yang terletak di folder "APK Manager", ubah "heapy set = 64" ke nilai lebih tinggi, seperti 256, atau 512 untuk mencegah masalah dengan file besar.
Bekerja dengan "APK Manager" juga tidak kesulitan saat ini. Diperlukan file AIC dimasukkan ke dalam folder "tempat-APK-di sini-untuk-Modding", jalankan "Script.bat" dan pop up dengan teks hijau, tekan "9" dan "Enter". Kurang dari semenit kemudian, folder "proyek" membongkar kita file AIC. Paket yang sama, jalankan "Script.bat", klik pada "11", "Enter", pertanyaannya adalah apakah sistem APC? "Hit" n ". Dan pada akhirnya, ketika dikemas AIC-file, menandatanganinya, untuk itu tekan "12" dan "Enter". Akibatnya, kita mendapatkan dalam file folder "tempat-APK-di sini-untuk-Modding" dengan nama menandatangani [nama AIC-file aslinya]. APK. Selain itu, tentang "manajer APK" bisa dibaca di sini



Juga, sebelum Anda mulai, saya sarankan untuk pertama meninjau daftar perintah kode Java script
Sekarang Anda dapat melampaui langsung ke optimasi, misalnya saya akan menggunakan permainan "Modern Combat: Sandstorm".


1. Mengubah resolusi rendering untuk HVGA / QVGA.

Kebanyakan permainan android, ditulis dengan menggunakan OpenGL, OpenGL sebuah izin yang diberikan oleh "glViewPort" fungsi, dan itu akan digunakan. Yang paling optimal, saya pikir fungsi "glViewPort" tempat dalam fungsi "OnDrawFrame". Untuk melakukan ini, dengan melihat pada folder "smali", yang terletak di folder dengan file raspakovanym AIC, mencari file yang berisi fungsi "OnDrawFrame". Biasanya file ini bernama "GameRenderer.smali" atau "[Nama Game] Renderer.smali", dalam hal ini, "SandstormRenderer.smali". Buka di Notepad atau teks editor lain dan menemukan di dalamnya fungsi "OnDrawFrame".
Berikut ini adalah fragmen dari fungsi ini.



.method public onDrawFrame(Ljavax/microedition/khronos/opengles/GL10;)V .locals 6 .parameter "gl" .prologue .line 174 const-wide/16 v0, 0x0 .line 177 .local v0, time:J invoke-static {}, Ljava/lang/System;->currentTimeMillis()J move-result-wide v0 .line 179 invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/GLMediaPlayer;->update()V .line 180 invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/SandstormRenderer;->nativeRender()V .line 186 const-wide/16 v2, 0x32 invoke-static {}, Ljava/lang/System;->currentTimeMillis()J move-result-wide v4 sub-long/2addr v4, v0 sub-long v0, v2, v4 .line 188 const-wide/16 v2, 0x0 cmp-long v2, v0, v2 if-lez v2, :cond_0 .line 190 :try_start_0 invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V :try_end_0 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 .line 193 :cond_0 :goto_0 return-void .line 190 :catch_0 move-exception v2 goto :goto_0 .end method В этот фрагмент кода необходимо добавить вызов функции "glViewPort", таким образом чтоб получилось, как в фрагменте кода ниже.
Спойлер (+/-)

Код
.method public onDrawFrame(Ljavax/microedition/khronos/opengles/GL10;)V .locals 9 .parameter "gl" .prologue const/16 v8, 0x1E0 const/16 v7, 0x140 const/4 v6, 0x0 invoke-interface {p1, v6, v6, v8, v7}, Ljavax/microedition/khronos/opengles/GL10;->glViewport(IIII)V .line 174 const-wide/16 v0, 0x0 .line 177 .local v0, time:J invoke-static {}, Ljava/lang/System;->currentTimeMillis()J move-result-wide v0 .line 179 invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/GLMediaPlayer;->update()V .line 180 invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/SandstormRenderer;->nativeRender()V .line 186 const-wide/16 v2, 0x32 invoke-static {}, Ljava/lang/System;->currentTimeMillis()J move-result-wide v4 sub-long/2addr v4, v0 sub-long v0, v2, v4 .line 188 const-wide/16 v2, 0x0 cmp-long v2, v0, v2 if-lez v2, :cond_0 .line 190 :try_start_0 invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V :try_end_0 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 .line 193 :cond_0 :goto_0 return-void .line 190 :catch_0 move-exception v2 goto :goto_0 .end method

Apa yang kami lakukan di sini? Telah menambahkan tiga konstanta (v6, v7, v8), assign mereka nilai koordinat kiri bawah, kanan (v6 v6) dan atas (v8; v7) sudut layar mereka dan dipindahkan ke "glViewport" fungsi. Saya pikir ini dipahami mengapa untuk koordinat sudut kiri bawah untuk X dan Y digunakan sendiri dan juga konstan v6? Karena baik X dan Y di sudut ini adalah sama. Selain itu, mengubah baris 2-ke dalam fungsi "Locals 6." pada "9Locals.", ini akan menentukan jumlah konstanta / variabel yang digunakan dalam fungsi, jadi kami menambahkan 3 konstanta, 6 +3 = 9. Juga mencatat bahwa nama-nama konstanta (v6, v7, v8), tidak diambil santai, seperti dipilih dengan memfokuskan pada sudah digunakan dalam fungsi konstanta. Jika seseorang yang tidak mengerti, 0x1E0 dalam desimal akan menjadi 480 dan 0x140 - 320.

Juga memperhatikan fungsi "onSurfaceCreated".
Code:

.method public onSurfaceCreated(Ljavax/microedition/khronos/opengles/GL10;Ljavax/microedition/khronos/egl/EGLConfig;)V
.locals 7
.parameter "gl"
.parameter "config"

.prologue
const/4 v3, -0x1

.line 138
const/4 v0, 0x2

const-string v1, "SandstormRenderer"

const-string v2, "onSurfaceCreated"

invoke-static {v0, v1, v2}, Lcom/gameloft/android/GAND/GloftMCHP/GLDebug;->debugMessage(ILjava/lang/String;Ljava/lang/String;)V

.line 141
invoke-direct {p0}, Lcom/gameloft/android/GAND/GloftMCHP/SandstormRenderer;->nativeGetJNIEnv()V

.line 142
invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/GLResLoader;->init()V

.line 143
invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/GLMediaPlayer;->init()V

.line 144
invoke-static {}, Lcom/gameloft/android/GAND/GloftMCHP/Sandstorm;->nativeInit()V

.line 146
:goto_0
sget v0, Lcom/gameloft/android/GAND/GloftMCHP/SandstormGLSurfaceView;->mDevice_W:I

if-eq v0, v3, :cond_0

sget v0, Lcom/gameloft/android/GAND/GloftMCHP/SandstormGLSurfaceView;->mDevice_H:I

if-ne v0, v3, :cond_1

.line 149
:cond_0
const-wide/16 v0, 0x32

:try_start_0
invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

goto :goto_0

:catch_0
move-exception v6

.local v6, ex:Ljava/lang/Exception;
invoke-virtual {v6}, Ljava/lang/Exception;->printStackTrace()V

goto :goto_0

.line 154
.end local v6 #ex:Ljava/lang/Exception;
:cond_1
sget v1, Lcom/gameloft/android/GAND/GloftMCHP/Sandstorm;->m_bEnableKeyboard:I

const/4 v2, 0x1

sget v3, Lcom/gameloft/android/GAND/GloftMCHP/SandstormGLSurfaceView;->mDevice_W:I

sget v4, Lcom/gameloft/android/GAND/GloftMCHP/SandstormGLSurfaceView;->mDevice_H:I

sget v5, Lcom/gameloft/android/GAND/GloftMCHP/Sandstorm;->mCurrentLang:I

move-object v0, p0

invoke-direct/range {v0 .. v5}, Lcom/gameloft/android/GAND/GloftMCHP/SandstormRenderer;->nativeInit(IIIII)V

.line 155
return-void
.end method


yaitu kode ini:
sget v3, Lcom/gameloft/android/GAND/GloftMCHP/SandstormGLSurfaceView;->mDevice_W:I

sget v4, Lcom/gameloft/android/GAND/GloftMCHP/SandstormGLSurfaceView;->mDevice_H:I
Dalam kode ini, variabel v3, v4 ditugaskan untuk perangkat resolusi layar nyata, dan diteruskan ke "nativeInit" fungsi. Karena permainan ini masih dirancang untuk resolusi 480x800, lebih baik untuk memiliki pemikiran permainan bahwa Anda memiliki perangkat dengan resolusi tertentu. dalam kode ini digantikan oleh
const/16 v3, 0x320 const/16 v4, 0x1E0

Jika Anda tidak mengalami masalah.
(Anda dapat meminta dan 480h720, karena proporsi layar dengan 480x800 dan 320x480 berbeda dan ketika "memencet" gambar akan agak pipih Tapi dalam kasus ini., pada tahap dari "grid penyesuaian layar sentuh, koefisien harus dianggap dari 800 720 dan antara dan akan itu 1,666666666666667 dan 720/480 = 1.5)
Dalam permainan lainnya bukan kode, mungkin sesuatu seperti ini
Kode
invoke-virtual {v0}, Landroid/view/Display;->getWidth()I move-result v3 invoke-virtual {v0}, Landroid/view/Display;->getHeight()I move-result v4
Pokoknya itu diganti dengan:
Kode
const/16 v3, 0x320 const/16 v4, 0x1E0

Atau nama variabel tidak dapat v3, v4 dan v1, v2. Atau sama sekali tak seperti itu, maka tidak akan bisa
Atau jika masalah muncul, Anda hanya bisa dalam kasus, pergi mencari semua "*. smali" file dan pozamenyat fungsi semua panggilan "Landroid / view / Tampilan; - getWidth> () Saya" dan "Landroid / view / Tampilan; - getHeight>Untuk beberapa permainan, pekerjaan kita cukup dan mereka aman mengubah hak akses pada semua grafis yang Anda butuhkan. Untuk melakukan hal ini lagi paket AIC-file dan memeriksa telepon saat ia bekerja. Jika semuanya berhasil kemudian pergi ke item "grid penyesuaian layar sentuh." Jika tidak, baca terus. Dalam kasus kami, dengan permainan Modern Combat: Sandstorm, tidak semuanya mulus, permainan grafis smashtabirovalas sampai izin yang diperlukan, dan menu - tidak ada. Ini berarti bahwa di suatu tempat di fungsi ini dipanggil "glViewPort", dan kemudian mengubah resolusi ke 480x800. Jadi, seperti dalam file "*. smali" fungsi "glViewPort" jangan menelepon, Anda dapat memeriksa dengan mencari, sehingga kasus dalam "libsandstorm.so" perpustakaan.

Gagasan utama dari langkah selanjutnya, menghapus semua panggilan ke fungsi perpustakaan "glViewPort".
Untuk menganalisis perpustakaan, kita membutuhkan "Ida Pro". Untuk kenyamanan, "libsandstorm.so" copy dalam folder, jalankan "Ida Pro" dan klik pada tombol "New"

Berikutnya Berbagai file menunjukkan "unknown file" dan klik "OK".
Pada jendela, buka file tersebut menentukan path ke "libsandstorm.so" perpustakaan dan klik "Open."
Pada jendela berikutnya, mengubah "Processor type" ke "processorARM710a ARM", lalu klik "Set" dan "Ok".
Jika setelah ini, akan ada jendela lain dengan apa saja, klik "OK". Sekarang Anda perlu menunggu untuk pembongkaran tersebut. Proses ini cukup panjang, dalam hal ini Anda dapat pergi ke merokok atau minum kopi
Fakta bahwa reverse engineering selesai, akan menunjukkan pesan "The autoanalysis awal telah selesai." di bawah
Untuk kenyamanan yang lebih besar, dalam hal ini, klik tombol mouse sebelah kanan pada bidang biru, dan pada menu shortcut, pilih "Tampilan Teks". Pindah ke awal kode assembler untuk pencarian untuk "glViewPort".
Tekan shortcut keyboard "Alt + T" di kotak dialog untuk memasukkan pencarian "glViewPort" dan klik "OK"Kami tertarik dalam fungsi panggilan "glViewport BLX", "BL glViewport", "B glViewport", "BX glViewport", dll Setiap lainnya menyebutkan dari "glViewport" kita mengabaikan zhmakaem "Ctrl + T" dan melanjutkan pencarian.
Sebuah tempat yang diperlukan, beralih ke "Lihat Hex-A".

Memanggil fungsi ini kita perlu menggganti, untuk itu harus diganti oleh "E8 CE D4 F7" (dalam kasus Anda, angka-angka ini mungkin berbeda) pada "C0 46 C0 46. Ingat alamat "001F994A" dan menjalankan hex ​​editor, saya menggunakan "UltraEdit".
Dalam rangka untuk memindahkan kami ke alamat yang benar, klik "Ctrl + G", dalam kotak input akan muncul "0x001F994A" dan klik "OK".

Bergerak, kita melihat bahwa memukul di mana Anda ingin, semua kode heksadesimal menyatu dengan kenyataan yang kita lihat di "Ida Pro" tab "Hex Lihat-A".
Memperbaiki "CE D4 E8 F7" pada "C0 46 C0 46.
Beralih ke "Ida Pro" dan terus mencari untuk mengikuti panggilan "glViewPort", mungkin ada beberapa lusin. Mereka telah diperlakukan sama.
Bila semua panggilan untuk diminum, yang diawetkan. Salin ke tempat yang "direvisi" libsandstorm.so. Paket ank-file dan mengatur telepon untuk memeriksa. Jika dilakukan dengan benar, seluruh jadwal smashtabiruetsya sampai izin yang diperlukan.

sumber:http://coderandroid.blogspot.com/2011/05/mengubah-wvga-to-hvga-part1.html

1 komentar: