(在那老虎山上)提供:virgl overlay與exagear合體教程v2
如果不想知道教程,直接跳到278行看使用說明。使用說明,若不看,則不會(huì)用額。 需要準(zhǔn)備的工具有 apktool_m用于反編回編簽名apk。手機(jī)不能使用apktool_m的,自個(gè)想其它辦法,如上電腦用電腦上工具,能正常反編回編的即可。 mt管理器用于修改反編出來后的smali等文件,易操作。 termux用于修改recipe.zip。 需要準(zhǔn)備的素材有: virgl overlay 0.0.7版本的apk一個(gè)。 exagear模擬器的apk一個(gè)。教程用到的apk是virGLOverlay_suhang2040.apk,共享用戶名為com.suhang.test。其它安兔兔版本和原版模擬器的apk,想合體就依樣畫胡。 下面是教程。 首先,將virgl overlay 和exagear分別反編。需反編譯全部,即將反編譯資源和classes.dex兩個(gè)選項(xiàng)都點(diǎn)上。點(diǎn)上反編譯classes.dex,反編譯后才會(huì)生成smali目錄。點(diǎn)上反編譯資源,反編譯后才會(huì)有values目錄。在這個(gè)教程中動(dòng)不到資源,可以不反編資源,僅僅是個(gè)人習(xí)慣。在本教程中classes.dex是一定要反編出來的。 將exagear的apk反編譯后生成的smali目錄重命名為smali_classes2 將virgloverlay的apk反編譯后生成的smali目錄整個(gè)移進(jìn)exagear的apk反編后生成的目錄下,即與smali_classes2目錄處于同一個(gè)目錄下。即/storage/emulated/0/BaiduNetdisk/我的資源/virGLOverlay_suhang2040_src目錄下。名字保持smali不變。 然后將virgl-overlay-rebuild-v.0.0.7-gen_signed_src/lib/armeabi-v7a/目錄下的libepoxy-lib.so和libvirgl-lib.so兩個(gè)virgl overlay 0.0.7的so移到virGLOverlay_suhang2040_src/lib/armeabi-v7a/目錄下。 移好smali目錄和那兩個(gè)so后,virgl overlay 與exagear合體需要改動(dòng)的文件有: 一,清單文件AndroidManifest.xml。 二,virGLOverlay_suhang2040_src/smali_classes2/com/eltechs/axs/configuration/目錄下的UBTLaunchConfiguration.smali。 三,virGLOverlay_suhang2040_src/smali_classes2/com/ludashi/benchmark/activities/目錄下的EDMainActivity.smali。 四,virGLOverlay_suhang2040_src/smali/com/mittorn/virgloverlay/common/目錄下的overlay.smali。 五,virGLOverlay_suhang2040_src/assets/目錄下的recipe.zip。 關(guān)于清單文件AndroidManifest.xml的修改: 修改前: <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> <service android:name="com.eltechs.axs.environmentService.AXSEnvironmentService"> 修改后: <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> <service android:name="com.mittorn.virgloverlay.process.p1" android:exported="true" android:process=":p1" /> <service android:name="com.eltechs.axs.environmentService.AXSEnvironmentService"> 即在這里插入了virgloverlay那幾行,這幾行來自virgl overlay的清單文件。搜索com.eltechs.axs.environmentService.AXSEnvironmentService能快速定位到此行。 關(guān)于UBTLaunchConfiguration.smali的修改: 修改前: invoke-interface {v3, v0}, Ljava/util/List;->add(Ljava/lang/Object;)Z .line 138 修改后: invoke-interface {v3, v0}, Ljava/util/List;->add(Ljava/lang/Object;)Z iget-object v3, p0, Lcom/eltechs/axs/configuration/UBTLaunchConfiguration;->guestEnvironmentVariables:Ljava/util/List; const-string v4, "VTEST_SOCK=" invoke-interface {v3, v4}, Ljava/util/List;->add(Ljava/lang/Object;)Z .line 138 即在line 138前面增加了三行,三行如上所示。修改UBTLaunchConfiguration.smali的目的在于免除要先發(fā)送圖標(biāo)到桌面,然后加VTEST_SOCK=來使用virgl overlay的步驟。 搜line 138能快速定位到此行。 關(guān)于EDMainActivity.smali的修改: 修改前: .line 76 invoke-super {p0, p1}, Lcom/eltechs/axs/activities/FrameworkActivity;->onCreate(Landroid/os/Bundle;)V const v0, 0x7f0b0035 .line 78 修改后: .line 76 invoke-super {p0, p1}, Lcom/eltechs/axs/activities/FrameworkActivity;->onCreate(Landroid/os/Bundle;)V new-instance v0, Landroid/content/Intent; invoke-direct {v0}, Landroid/content/Intent;-><init>()V const-string v1, "com.mittorn.virgloverlay.process.p1" invoke-virtual {v0, p0, v1}, Landroid/content/Intent;->setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent; move-result-object v0 invoke-virtual {p0, v0}, Lcom/mittorn/virgloverlay/MainActivity;->startService(Landroid/content/Intent;)Landroid/content/ComponentName; const v0, 0x7f0b0035 .line 78 即增加了virgl overlay 的p1進(jìn)程。搜line 76能快速定位到此行。此處是打開模擬器即啟動(dòng)virgl服務(wù),若要與turnip版本合體,就不要修改此處。最后在# virtual methods 的后面加上virgl服務(wù)的開啟和關(guān)閉,EDMainActivity.smali就修改完成。增加的內(nèi)容如下: .method public onClickClean(Landroid/view/View;)V .locals 3 new-instance v0, Landroid/content/Intent; invoke-direct {v0}, Landroid/content/Intent;-><init>()V const-string v1, "com.mittorn.virgloverlay.process.p1" invoke-virtual {v0, p0, v1}, Landroid/content/Intent;->setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent; move-result-object v0 invoke-virtual {p0, v0}, Lcom/ludashi/benchmark/activities/EDMainActivity;->stopService(Landroid/content/Intent;)Z return-void .end method .method public onClickStart(Landroid/view/View;)V .locals 11 new-instance v0, Landroid/content/Intent; invoke-direct {v0}, Landroid/content/Intent;-><init>()V const-string v1, "com.mittorn.virgloverlay.process.p1" invoke-virtual {v0, p0, v1}, Landroid/content/Intent;->setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent; move-result-object v0 invoke-virtual {p0, v0}, Lcom/ludashi/benchmark/activities/EDMainActivity;->startService(Landroid/content/Intent;)Landroid/content/ComponentName; return-void .end method 關(guān)于overlay.smali的修改: overlay.smali這個(gè)文件,需要修改三處。 用mt管理器搜索settings,能找到這三處的具體位置。 第一處 修改前: move-result-object v0 const-string v1, "/layout_settings" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 修改后: move-result-object v0 const-string v1, "/image/opt/recipe/layout_settings" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 第二處 修改前: move-result-object p0 const-string v0, "/settings" invoke-virtual {p0, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 修改后: move-result-object p0 const-string v0, "/image/opt/recipe/settings" invoke-virtual {p0, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 第三處 修改前: move-result-object v0 const-string v1, "/hack_settings" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 修改后: move-result-object v0 const-string v1, "/image/opt/virgl/hack_settings" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 即將搜索settings搜到的/layout_settings,/settings,/hack_settings,前面都加上/image/opt/recipe。/hack_settings,前面加上/image/opt/virgl。 關(guān)于recipe.zip的修改: 打開termux。pkg update換源國(guó)內(nèi)源之類的基本使用就不講了。 pkg install zip unzip nano -y。需要用unzip和zip命令對(duì)recipe.zip進(jìn)行解壓和打包。需要用nano進(jìn)行修改。 將recipe.zip放到手機(jī)存儲(chǔ)根目錄。 termux需要在手機(jī)設(shè)置里給存儲(chǔ)權(quán)限。 在termux的~目錄,隨意新建個(gè)目錄如ok。 cd ~ mkdir ok cd ok unzip /sdcard/recipe.zip nano layout_settings 填入數(shù)字1,保存。 nano settings 填入數(shù)字20,保存。 nano hack_settings 填入數(shù)字0 0 0 0 0 ,保存。 nano hack_settings_dxtn 填入數(shù)字0 0 0 0 1 ,保存。數(shù)字之間用空格隔開,4個(gè)0,1后面還有一個(gè)空格。 nano ed.conf 填入: pulse=0 hud=0 dxtn=0 保存ed.conf nano run/simple.sh 填入: #!/bin/bash . /opt/recipe/util/progress.sh if [ "$(locale -a | grep $LC_ALL)" != "$LC_ALL" ]; then progress "-1" "Generating locale..." locale-gen --no-archive $LC_ALL fi progress "-1" "Launching application..." export PATH export TERM export LD_PRELOAD=/opt/recipe/run/hardlink_to_symlink.so /opt/recipe/run/sshd & ed=/storage/emulated/0/Exagear/ed virgl=/opt/virgl if [ ! -f $ed/ed.conf ]; then mkdir -p $ed cp /opt/recipe/ed.conf $ed/ed.conf fi if [ ! -f $virgl/hack_settings ]; then mkdir -p $virgl cp /opt/recipe/hack_settings $virgl/hack_settings fi . $ed/ed.conf if [ "${pulse}" = "1" ]; then export PULSE_SERVER="tcp:127.0.0.1" fi if [ "${hud}" = "1" ]; then export GALLIUM_HUD="simple,fps" fi if [ "${dxtn}" = "0" ]; then cp /opt/recipe/hack_settings $virgl/hack_settings fi if [ "${dxtn}" = "1" ]; then cp /opt/recipe/hack_settings_dxtn $virgl/hack_settings fi progress "-1" "Pulse=${pulse}/Hud=${hud}/DXTn=${dxtn}" eval "$@" 保存run/simple.sh。注意改的是run目錄下的simple.sh。 chmod 777 -R * 給所有文件加上777的權(quán)限。 rm /sdcard/recipe.zip 刪除放在手機(jī)存儲(chǔ)根目錄的recipe.zip。 zip --symlinks -r /sdcard/recipe.zip . zip命令打包修改好的recipe.zip。注意上面的打包命令recipe.zip后面接一個(gè)空格然后是一個(gè)英文的符號(hào)點(diǎn)。生成的新recipe.zip即在手機(jī)存儲(chǔ)根目錄。 將改好的recipe.zip放入virGLOverlay_suhang2040_src/assets/目錄下。 然后apktool_m回編,合體完成。 其它:將virgl overlay 0.0.7與exagear合體。 跟將virgl overlay 0.0.1與exagear合體的主要不同之處在于: virgl overlay 0.0.1的so只有一個(gè)libnative-lib.so。0.0.7版本有兩個(gè)。 0.0.7的overlay.smali有三處地方需要修改,多一個(gè)/hack_settings需要修改。 overlay.smali用aktool_m轉(zhuǎn)成java模式,可以看出與0.0.1的差異。 0.0.7的overlay.smali不僅加載的so變了,還多了一個(gè)/hack_settings判斷語(yǔ)句。recipe.zip處也要多加一個(gè)hack_settings的文件,并寫入0 0 0 0 1 。 以上差異就是是否能夠成功將virgl overlay 0.0.7與exagear合體的主要要點(diǎn)。 用0.0.1合體的方法原封不變則會(huì)合體失敗。需要稍微調(diào)整下。 virgl overlay 0.0.7與exagear合體的教程v2完。 virGLOverlay_suhang2040_007_v2.apk為合體好后的apk。 v2版使用說明: 手機(jī)存儲(chǔ)根目錄/Exagear/ed/ed.conf這個(gè)文件中,0是關(guān),1是開。 pulse=1#打開pulseaudio。pulseaudio服務(wù)端要用termux的。如上面的教程所示,export PULSE_SERVER="tcp:127.0.0.1"。寫的是127.0.0.1。xdsdl是用export PULSE_SERVER="tcp:127.0.0.1:4713"的。 hud=1#打開mesa的幀數(shù)顯示。但是,經(jīng)測(cè)試,virgl overlay 0.0.7不能正常開hud,會(huì)導(dǎo)致茶壺不會(huì)動(dòng),游戲黑屏有聲等問題,要保持hud關(guān)閉,即設(shè)為0。 dxtn=1#打開virgl overlay 0.0.7版本的DXTn選項(xiàng)。 只有apk,沒有數(shù)據(jù)包,自備即可,建議使用前官方eltechs的wine30,mesa用GFOXSH的1830。 v2版更新說明: v2版本可以在不關(guān)閉模擬器的情況下,開啟和關(guān)閉virgl服務(wù)。 可以通過ed.conf開關(guān)DXTn。 你在開啟和關(guān)閉virgl服務(wù)的上面看到的那些設(shè)置選項(xiàng)是沒用的。只是添加上了菜單,因?yàn)橐恍﹋ava沖突的問題,尚不可用。 最后: 若未能解決添加的那些設(shè)置選項(xiàng)無效的問題。則不再更新。 如何添加的這些菜單,未寫在上面的教程中,因?yàn)閷懫饋頃?huì)教程較長(zhǎng),且尚未成功。 virgl-overlay-rebuild-v.0.0.7-gen_signed.apk為A大神發(fā)布的原版apk,共享用戶名為com.test.test。 virgl-overlay-rebuild-v.0.0.7-gen_signed_mcat.apk共享用戶名為com.mact。 virgl-overlay-rebuild-v.0.0.7-gen_signed_suhang.apk共享用戶名為com.suhang.test。 均為默認(rèn)的apk簽名。 分別搭配同共享用戶名和同應(yīng)用簽名的模擬器的apk使用。
標(biāo)簽: