免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
一步步深入smali,完美去廣告
userphoto

2012.10.13

關注
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2:android SDK環(huán)境
下載地址:http://dl.google.com/android/android-sdk_r08-windows.zip
3:常用的APK反編譯工具,見附件
4:學習常用Dalvik指令集,地址:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
以下是我的文檔結構(記住這個結構,以下的過程都會基于此結構):
d:\android
d:\android\sdk---sdk所在目錄
d:\android\crack---破解反編譯工具所在目錄
d:\android\crack\apktool---apktool目錄
d:\android\crack\auto-sign---簽名工具
sdk包下載后,解壓得到如下結構:
D:\android\sdk\add-ons
D:\android\sdk\platforms
D:\android\sdk\platform-tools
D:\android\sdk\tools
D:\android\sdk\SDK Manager.exe
運行SDK Manager.exe,在彈出的窗口中找到:Avaliable packages,右側展開:Android Respository
在里面找到:SDK Platform Android 2.2,API 8,revision 2(安裝2.2版的虛擬機)
接下來會下載安裝,時間可能會長點,耐心等
接下來需要設幾個系統(tǒng)環(huán)境變量
XP:我的電腦-〉右鍵-〉屬性-〉高級-〉環(huán)境變量
Win7:計算機-〉右鍵-〉屬性-〉高級系統(tǒng)設置-〉環(huán)境變量
在彈出的窗口中點擊:新建
按以下值填寫
變量名:ANDROID_SDK_HOME
變量值:D:\android\sdk (看你自己的目錄而定)
接著在系統(tǒng)變量的框里下滾找到:Path
雙擊打開
在最后面加入值 ;D:\android\sdk\tools\(注意前面的分號,目錄按你自己目錄而定)
點擊確定,關閉窗口,重啟電腦
打開 /sdk/tools/目錄,雙擊android.bat,在彈出的窗口中,選擇:Virtual devices
點擊右側的:New 新建虛擬機
輸入虛擬機的名稱,Target中選擇要使用的系統(tǒng)版本,SD Card的Size那里填SD卡的大小,通常填128就成
然后點擊下面的 Create AVD 創(chuàng)建
回到剛才的界面,列表中列出了剛新建的虛擬機,雙擊打開虛擬機
等很長時間虛擬機啟動
反編譯工具:crack.zip
游戲原文件:a.apk



二:去除游戲Zoo Trip中的廣告,完美去廣告是指刪掉程序中一切跟廣告調用相關的類,方法,視圖
將apk文件拷貝到 d:\android\crack\apktool 目錄下,為方便操作,重命名為a.apk
打開cmd窗口
輸入: 
cd d:\android\crack\apktool
d:
輸入:adb devices
檢測虛擬設備是否連上,正常的會返回:emulator-5554   device 類似信息
輸入:adb install a.apk
在虛擬設備上安裝原apk文件,并運行查看效果,先玩一通,看下廣告都在哪
廣告總共出現在四處:


第一處:程序啟動界面

第二處:游戲結束界面(此處有兩個廣告,中間的那個大的對話框樣的為非google廣告)

第三處:分數提交界面

第四處:更多游戲界面
接下來我們來看apk文件的內部
輸入:apktool d a.apk
反編譯apk文件,得到目錄a
輸入:apktool b a
看文件能否順利編譯回去。
一切正常后,打開 a\build\apk 把里面的classes.dex拷貝到:d:\android\crack\dex 目錄下,將文件拖動到dex2jar.bat上面,將自動轉成jar文件,然后運行jd-gui.exe,打開剛剛生成的classes.dex.dex2jar.jar,然后會看到對應的java代碼,這種方式查看到的代碼并不是完整的源碼,有很多的出入,僅供參考。


接下來的過程需要很大的耐心與細心,進行以下操作前,請認真學習常用Dalvik指令集(至少要花一天時間),保證能看懂一般的smali代碼!?。?br>打開里面的AndroidManifest.xml文件
找到以<activity 打頭的xml節(jié)點,在android程序中的 activity 通常是指一個界面,但是一個界面并不會是一個activity,一個activity可能包括多個界面
這里一共出現了六處,其中節(jié)點中帶有 <action android:name="android.intent.action.MAIN" /> 這類信息的是主活動,可以理解成主界面
我們首先來刪掉主界面的廣告
通過AndroidManifest.xml中的描述,我們知道主界面對應的類的名稱是:".CoverActivity" 字符"."前面的東西是程序命名空間,在AndroidManifest.xml 中的package="com.droidhen.game.zootrip" 中定義,也就是說主界面的類名是:
com.droidhen.game.zootrip.CoverActivity,所以我們依次展開 smali\com\droidhen\game\zootrip 在里面找到CoverActivity.smali文件并打開,
這里可以看到兩個以CoverActivity打頭的,其中的CoverActivity$1.smali是CoverActivity中的子類,可以不用看
用編輯器在 smali\com\droidhen 文件夾中查找 GoogleAdView(GoogleAdView這個是google廣告的標志)
共找到四個文件:MoreActivity.smali Ad.smali AdController.smali OnlineScoreActivity.smali,都打開
第一個對應的是:更多游戲的界面,第二個只是定義了一個結構,第三個里面出現最多,是廣告的實際控制類,第四個是在線排行的界面
接下來回到第一屏的CoverActivity.smali,在里面搜索 AdController
第一處:

Code :
.method private tryMore()V
   .locals 1
   .prologue
   .line 83
   sget-object v0, Lcom/droidhen/game/zootrip/global/AdController;->INSTANCE:Lcom/droidhen/game/zootrip/global/AdController;
   invoke-static {p0, v0}, Lcom/droidhen/activity/MoreHelper;->showMoreGames(Landroid/content/Context;Lcom/droidhen/Ad;)V
   .line 84
   return-void
.end method
相當于以下代碼:
private void tryMore(){
       MoreHelper.showMoreGames(this, AdController.INSTANCE);
}
通過字面意思,能明白此方法是用戶點擊主界面上"More"按紐時執(zhí)行的,因為我們最終需要移除掉所有廣告調用的類,所以此處的showMoreGames方法中的參數Lcom/droidhen/Ad必須刪除,打開 com/droidhen/activity/MoreHelper.smali,由于代碼比較少,我直接全翻一下:
Code :
package com.droidhen.activity;
import com.droidhen.Ad;
class MoreHelper{
       public static Ad AD;
       public void showMoreGames(Context context, Ad ad){
               Intent intent = new Intent(context, MoreActivity.class);
               MoreHelper.AD=ad;
               context.startActivity(intent);
       }
}
這個類的主要作用是存儲了一個靜態(tài)com.droidhen.Ad值,并且跳轉到MoreActivity活動。,我們要刪掉里面的Ad,不能直接刪掉方法,還得看MoreActivity中的調用。
用jd-gui查看 com.droidhen.activity.MoreActivity 類,搜索下onCreate方法,這個名稱的方法是android程序中活動的初始調用方法,可以看到這樣的:Ad localAd = MoreHelper.AD;看到沒有,在MoreHelper中定義的靜態(tài)com.droidhen.Ad在這里被調用了,我要實現的就是如何去掉他的調用,進而去掉MoreHelper中的com.droidhen.Ad,打開com.droidhen.activity.MoreActivity.smali,查找 com/droidhen/Ad,依次刪掉以下:
Code :.line 35
   sget-object v0, Lcom/droidhen/activity/MoreHelper;->AD:Lcom/droidhen/Ad;
       
   
Code :.line 36
   .local v0, ad:Lcom/droidhen/Ad;
       
接下來還有一個if語句,怎樣判斷if語句的開始與終結:
       if-eqz v0, :cond_0 這里的 :cond_0就是這一個循環(huán)的標識,搜索下一個:cond_0出現的地方就是這一整塊語句的終結處,所以我們刪掉如下:
Code :
       if-eqz v0, :cond_0
   .line 37
   new-instance v2, Lcom/google/ads/GoogleAdView;
   invoke-direct {v2, p0}, Lcom/google/ads/GoogleAdView;-><init>(Landroid/content/Context;)V
   .line 38
   .local v2, googleAdView:Lcom/google/ads/GoogleAdView;
   new-instance v3, Landroid/widget/LinearLayout$LayoutParams;
   .end local v3           #params:Landroid/widget/LinearLayout$LayoutParams;
   const/4 v7, -0x2
   invoke-direct {v3, v9, v7}, Landroid/widget/LinearLayout$LayoutParams;-><init>(II)V
   .line 39
   .restart local v3       #params:Landroid/widget/LinearLayout$LayoutParams;
   invoke-virtual {v4, v2, v3}, Landroid/widget/LinearLayout;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
   .line 40
   invoke-interface {v0, p0, v2, v10}, Lcom/droidhen/Ad;->show(Landroid/app/Activity;Lcom/google/ads/GoogleAdView;Z)V
   .line 42
   .end local v2           #googleAdView:Lcom/google/ads/GoogleAdView;
   :cond_0
現在回到MoreHelper.smali中,刪除方法中的第二個com.droidhen.Ad類型的參數,修改后的smali如下:
Code :
.class public Lcom/droidhen/activity/MoreHelper;
.super Ljava/lang/Object;
.source "MoreHelper.java"
# direct methods
.method public constructor <init>()V
   .locals 0
   .prologue
   .line 8
   invoke-direct {p0}, Ljava/lang/Object;-><init>()V
   return-void
.end method
.method public static showMoreGames(Landroid/content/Context;)V
   .locals 2
   .parameter "context"
   .prologue
   .line 12
   new-instance v0, Landroid/content/Intent;
   const-class v1, Lcom/droidhen/activity/MoreActivity;
   invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
   .line 13
   .local v0, intent:Landroid/content/Intent;
   .line 14
   invoke-virtual {p0, v0}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V
   .line 15
   return-void
.end method
接下來回到CoverActivity.smali,修改掉第一處AdController出現的方法 tryMore 改成如下:
Code :
.method private tryMore()V
   .locals 1
   .prologue
   .line 83
   invoke-static {p0}, Lcom/droidhen/activity/MoreHelper;->showMoreGames(Landroid/content/Context;)V
   .line 84
   return-void
.end method
保存后 可以通過運行 apktool b a 編譯一下,看有沒有邏輯錯誤,有的話編譯會報錯。
在CoverActivity.smali里面接著搜索 AdController,找到如下:
Code :
   .line 36
   const/4 v1, 0x0
   invoke-static {p0, v1}, Lcom/droidhen/game/zootrip/global/AdController;->initAdArea(Landroid/app/Activity;Z)V
代碼的意思是調用AdController的initAdArea方法,字面意思是插入廣告視圖,這個直接刪掉就成。
接下來搜索,提示找不到,表示CoverActivity修改完畢,現在我們編譯一下來看下效果。
CMD窗口輸入:apktool b a
打開 D:\android\crack\apktool\a\dist 里面是生成好的apk,拷貝到 D:\android\crack\sign ,然后拖動文件到sign.bat上進行程序簽名
CMD窗口輸入: adb uninstall com.droidhen.game.zootrip
刪掉原來的程序
CMD窗口輸入: adb install ../sign/a.apk.apk
安裝新程序,安裝完后運行程序,這時可能會看到程序異常退出了,原因是什么呢
在CMD窗口輸入:adb logcat 查看日志文件,等窗口停止?jié)L動時按下 ctrl+c停止,看到里面有一句:
Code :
E/AndroidRuntime(  509): FATAL EXCEPTION: main
E/AndroidRuntime(  509): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.droidhen.game.zootrip/com.droidhen.game.zootrip.CoverActivity}:java.lang.RuntimeException: Binary XML file line #10: You must supply a layout_width attribute.
Binary XML file line #10: You must supply a layout_width attribute. 
這句的意思是說你必須指定layout_width屬性值,這是因為當smali中沒有相應的類來支持這個布局視圖顯示時,屬性缺失錯誤,這時打開cover.xml文件(為什么是cover.xml,這個可以通過搜索CoverActivity的setContentView方法得到,具體可以再問我),刪除cover.xml下面的:
<com.google.ads.GoogleAdView android:layout_height="50.0dip" android:layout_alignParentTop="true" style="\@style/ad_style" />
然后重新編譯,重新簽名,重新安裝,打開后如下圖
 

第一屏的廣告已刪除,點擊more后的界面也不再有廣告
未完待續(xù)......(可自己嘗試修改后面的界面)


現在開始去除第二屏的廣告
首先我們需要知道用戶點擊 play 按紐時轉向的是哪個活動(即Activity)
在上一節(jié)中有講到cover.xml,但沒有說怎么找到這個文件的,現在說下:
打開之前的CoverActivity.smali,在其中搜索setContentView,每一個android程序的Activity都必定有一個setContentView方法,setContentView中指定了本活動所使用的布局文件是哪一個。
我們可以看到這樣的代碼:
Code :
   .line 30
   const/high16 v1, 0x7f03
   invoke-virtual {p0, v1}, Lcom/droidhen/game/zootrip/CoverActivity;->setContentView(I)V
這句的意思是調用id為 0x7f030000 的視圖文件 0x7f03這里是一個16位整型變量,16位標準的格式是0x后面8位,不足8位的用0補齊
然后我們在 res/values/public.xml 中搜索 0x7f030000 即可找到cover.xml
在Android程序中,一個活動跳轉到另一個活動,通常用要用到startActivity方法,我們在CoverActivity中搜索:startActivity
找到兩處,一處在方法gotoOptions中,另一處在方法 quickStart 中,通過字面意思,我們知道,gotoOptions是指跳轉到設置頁面,quickStart的意思是:快速開始,因此調用游戲的方法應該就是這個。
quickStart方法中的startActivity使用的參數類型是:android.content.Intent,通過里面的代碼我們可以看到:
Code :
   .line 78
   new-instance v0, Landroid/content/Intent;
   const-class v1, Lcom/droidhen/game/zootrip/GameActivity;
   invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
   .line 79
   .local v0, intent:Landroid/content/Intent;
   invoke-virtual {p0, v0}, Lcom/droidhen/game/zootrip/CoverActivity;->startActivity(Landroid/content/Intent;)V
相當于
Code :
android.content.Intent intent=new android.content.Intent(this, com.droidhen.game.zootrip.GameActivity.class);
startActivity(intent);
也就是說此處跳轉的活動是GameActivity,接下來修改 smali/com/droidhen/game/zootrip/GameActivity.smali吧
打開文件后,搜索前面說到的:AdController
第一處:方法more
Code :
.method more()V
   .locals 1
   .prologue
   .line 151
   sget-object v0, Lcom/droidhen/game/zootrip/global/AdController;->INSTANCE:Lcom/droidhen/game/zootrip/global/AdController;
   invoke-static {p0, v0}, Lcom/droidhen/activity/MoreHelper;->showMoreGames(Landroid/content/Context;Lcom/droidhen/Ad;)V
   .line 152
   invoke-virtual {p0}, Lcom/droidhen/game/zootrip/GameActivity;->finish()V
   .line 153
   return-void
.end method
這與前面CoverActivity中的tryMore方法一樣的修改,改成如下:
Code :
.method more()V
   .locals 1
   .prologue
   .line 151
   invoke-static {p0}, Lcom/droidhen/activity/MoreHelper;->showMoreGames(Landroid/content/Context;)V
   .line 152
   invoke-virtual {p0}, Lcom/droidhen/game/zootrip/GameActivity;->finish()V
   .line 153
   return-void
.end method
第二處:
Code :invoke-static {p0, v4}, Lcom/droidhen/game/zootrip/global/AdController;->initAdArea(Landroid/app/Activity;Z)V
直接刪除
這里需要了解下 AdController類中的initAdArea方法,作用是用來初始化廣告位的相關屬性。
刪除上面的代碼同樣還要刪除下面兩處代碼:
Code :
   .line 57
   const/high16 v2, 0x7f07
   invoke-static {p0, v2, v4}, Lcom/droidhen/score/ScoreUtil;->showView(Landroid/app/Activity;IZ)V
Code :
   .line 112
   const/high16 v1, 0x7f07
   const/4 v2, 0x1
   invoke-static {p0, v1, v2}, Lcom/droidhen/score/ScoreUtil;->showView(Landroid/app/Activity;IZ)V
因為ScoreUtil中的showView是用來顯示id號為0x7f070000的視圖元素,當initAdArea被刪除后,元素的相關屬性沒有初始化,所以會導致程序出錯

第三處:方法submit
Code :
.method submit()V
   .locals 4
   .prologue
   .line 158
   sget-object v0, Lcom/droidhen/game/zootrip/global/AdController;->INSTANCE:Lcom/droidhen/game/zootrip/global/AdController;
   const/4 v1, 0x1
   sget-object v2, Lcom/droidhen/game/zootrip/GameActivity;->server:Ljava/lang/String;
   const/4 v3, 0x0
   invoke-static {p0, v0, v1, v2, v3}, Lcom/droidhen/score/ScoreUtil;->redirectToSubmit(Landroid/app/Activity;Lcom/droidhen/Ad;ZLjava/lang/String;Z)V
   .line 159
   return-void
.end method
涉及到了 com.droidhen.score.ScoreUtil中的redirectToSubmit方法,所以我們得進到com.droidhen.score.ScoreUtil中去
打開 smali/com/droidhen/score/ScoreUtil.smali 搜索 redirectToSubmit,打開兩處
Code :
.method public static redirectToSubmit(Landroid/app/Activity;Lcom/droidhen/Ad;ZLjava/lang/String;Ljava/lang/String;ZZ)V
   .locals 2
   .parameter "activity"
   .parameter "ad"
   .parameter "finishSelf"
   .parameter "server"
   .parameter "category"
   .parameter "asc"
   .parameter "isFloat"
   .prologue
   .line 60
   invoke-static {p1}, Lcom/droidhen/score/OnlineScoreActivity;->setAdController(Lcom/droidhen/Ad;)V
   .line 61
   new-instance v0, Landroid/content/Intent;
   const-class v1, Lcom/droidhen/score/OnlineScoreActivity;
   invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
   .line 62
   .local v0, intent:Landroid/content/Intent;
   const-string v1, "server"
   invoke-virtual {v0, v1, p3}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
   .line 63
   const-string v1, "category"
   invoke-virtual {v0, v1, p4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
   .line 64
   const-string v1, "asc"
   invoke-virtual {v0, v1, p5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
   .line 65
   const-string v1, "float"
   invoke-virtual {v0, v1, p6}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
   .line 66
   invoke-virtual {p0, v0}, Landroid/app/Activity;->startActivity(Landroid/content/Intent;)V
   .line 67
   if-eqz p2, :cond_0
   .line 68
   invoke-virtual {p0}, Landroid/app/Activity;->finish()V
   .line 70
   :cond_0
   return-void
.end method
Code :
.method public static redirectToSubmit(Landroid/app/Activity;Lcom/droidhen/Ad;ZLjava/lang/String;Z)V
   .locals 7
   .parameter "activity"
   .parameter "ad"
   .parameter "finishSelf"
   .parameter "server"
   .parameter "asc"
   .prologue
   .line 55
   const-string v4, "0"
   const/4 v6, 0x0
   move-object v0, p0
   move-object v1, p1
   move v2, p2
   move-object v3, p3
   move v5, p4
   invoke-static/range {v0 .. v6}, Lcom/droidhen/score/ScoreUtil;->redirectToSubmit(Landroid/app/Activity;Lcom/droidhen/Ad;ZLjava/lang/String;Ljava/lang/String;ZZ)V
   .line 56
   return-void
.end method
我們要做的是像前面修改MoreHelper.smali一樣,刪除掉參數Lcom/droidhen/Ad,將以上代碼修改成下面的:
Code :
.method public static redirectToSubmit(Landroid/app/Activity;ZLjava/lang/String;Ljava/lang/String;ZZ)V
   .locals 2
   .parameter "activity"
   .parameter "finishSelf"
   .parameter "server"
   .parameter "category"
   .parameter "asc"
   .parameter "isFloat"
   .prologue
   .line 61
   new-instance v0, Landroid/content/Intent;
   const-class v1, Lcom/droidhen/score/OnlineScoreActivity;
   invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
   .line 62
   .local v0, intent:Landroid/content/Intent;
   const-string v1, "server"
   invoke-virtual {v0, v1, p2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
   .line 63
   const-string v1, "category"
   invoke-virtual {v0, v1, p3}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
   .line 64
   const-string v1, "asc"
   invoke-virtual {v0, v1, p4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
   .line 65
   const-string v1, "float"
   invoke-virtual {v0, v1, p5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
   .line 66
   invoke-virtual {p0, v0}, Landroid/app/Activity;->startActivity(Landroid/content/Intent;)V
   .line 67
   if-eqz p2, :cond_0
   .line 68
   invoke-virtual {p0}, Landroid/app/Activity;->finish()V
   .line 70
   :cond_0
   return-void
.end method
Code :
.method public static redirectToSubmit(Landroid/app/Activity;ZLjava/lang/String;Z)V
   .locals 7
   .parameter "activity"
   .parameter "finishSelf"
   .parameter "server"
   .parameter "asc"
   .prologue
   .line 55
   const-string v3, "0"
   const/4 v5, 0x0
   move-object v0, p0
   move v1, p1
   move-object v2, p2
   move v4, p3
   invoke-static/range {v0 .. v5}, Lcom/droidhen/score/ScoreUtil;->redirectToSubmit(Landroid/app/Activity;ZLjava/lang/String;Ljava/lang/String;ZZ)V
   .line 56
   return-void
.end method
然后回到 GameActivity.smali 修改對 redirectToSubmit方法的調用,將submit方法改成如下:
Code :
.method submit()V
   .locals 4
   .prologue
   .line 158
   const/4 v1, 0x1
   sget-object v2, Lcom/droidhen/game/zootrip/GameActivity;->server:Ljava/lang/String;
   const/4 v3, 0x0
   invoke-static {p0, v1, v2, v3}, Lcom/droidhen/score/ScoreUtil;->redirectToSubmit(Landroid/app/Activity;ZLjava/lang/String;Z)V
   .line 159
   return-void
.end method
接下來刪掉 res\layout\game.xml中的相應廣告布局代碼:
重新編譯,重新簽名,重新安裝,運行程序,玩一次,游戲結束時google廣告不再有了






接下來,我們檢查下游戲結束界面的幾個按紐點擊是否正常
點擊 submit 提交分數時程序報了異常
還是用adb logcat來查看具體錯誤
關于如何使用adb logcat定位錯誤:
CMD窗口輸入adb logcat后,待窗口文字滾動速度慢下來時(大概一秒一行),按下ctrl+c,停止logcat,然后滾動鼠標查找最后一個:Shutting down VM
在這行下面就能找到具體錯誤
這次的錯誤是:
Code :
E/AndroidRuntime(  244): FATAL EXCEPTION: main
E/AndroidRuntime(  244): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.droidhen.game.zootrip/com.droidhen.score.OnlineScoreActivity}: java.lang.RuntimeException: Binary XML file line #49: You must supply a layout_width attribute.
這個錯誤前面兩屏的修改也有遇到,同樣是要刪掉xml文件中googleadviwe的定義
首先我們要知道點擊submit按紐時調用的是哪個活動(可理解成哪個屏幕)
還記得AndroidManifest.xml中的那幾個Activity節(jié)點嗎,里面有一個
Code :<activity android:label="@string/app_name" android:name="com.droidhen.score.OnlineScoreActivity" android:screenOrientation="landscape" />
OnlineScore 的中文意思即為:在線分數
所以我們可以認為submit掃紐點擊跳轉的是OnlineScoreActivity
通過OnlineScoreActivity中的setContentView找到它的布局文件ID為 0x7f030003 ,通過res/values/public.xml查找到為res/layout/score.xml
打開res/layout/score.xml
報錯的代碼是:Binary XML file line #49: You must supply a layout_width attribute.
也就是說這個xml文件的49行有問題,少了layout_width屬性,這個代碼的問題可能是由于apktool工具編譯后產生的,在android的視布元素中,layout_width 與 layout_height都是必須的屬性
所以我們將以下代碼:
Code :
           <Button android:id="@id/top" android:layout_marginRight="8.0dip" android:text="@string/top" style="\@style/button_small" />
           <Button android:id="@id/previous" android:layout_marginRight="8.0dip" android:text="@string/previous" style="\@style/button_small" />
           <Button android:id="@id/next" android:layout_marginRight="8.0dip" android:text="@string/next" style="\@style/button_small" />
修改為:
Code :
           <Button android:id="@id/top" android:layout_marginRight="8.0dip" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/top" style="\@style/button_small" />
           <Button android:id="@id/previous" android:layout_marginRight="8.0dip" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/previous" style="\@style/button_small" />
           <Button android:id="@id/next" android:layout_marginRight="8.0dip" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/next" style="\@style/button_small" />
添加了這個:
Code :android:layout_height="wrap_content" android:layout_width="wrap_content"
wrap_content 意為根據內容自動調整,上面的代碼就是指定布局寬度與高度為自適應。
重新編譯,重新簽名,重新安裝
程序運行正常,點擊submit按紐也沒問題,但是顯示分數頁面的廣告還是在的
接下來刪掉廣告
在OnlineScoreActivity.smali中搜索 com/droidhen/Ad
刪除:
Code :.field private static adController:Lcom/droidhen/Ad;
刪除:[code]
.method public static setAdController(Lcom/droidhen/Ad;)V
   .locals 0
   .parameter "ad"
   .prologue
   .line 65
   sput-object p0, Lcom/droidhen/score/OnlineScoreActivity;->adController:Lcom/droidhen/Ad;
   .line 66
   return-void
.end method
[code]
由于刪的是一個方法(setAdController),所以還得確保別的地方沒有調用,在smali/com/droidhen文件夾中搜索setAdController,找到并刪掉調用的代碼。
接下來刪除:
Code :
   .line 111
   const/high16 v1, 0x7f07
   invoke-virtual {p0, v1}, Lcom/droidhen/score/OnlineScoreActivity;->findViewById(I)Landroid/view/View;
   move-result-object v0
   check-cast v0, Lcom/google/ads/GoogleAdView;
   .line 112
   .local v0, adView:Lcom/google/ads/GoogleAdView;
   sget-object v1, Lcom/droidhen/score/OnlineScoreActivity;->adController:Lcom/droidhen/Ad;
   if-eqz v1, :cond_0
   .line 113
   sget-object v1, Lcom/droidhen/score/OnlineScoreActivity;->adController:Lcom/droidhen/Ad;
   const/4 v2, 0x0
   invoke-interface {v1, p0, v0, v2}, Lcom/droidhen/Ad;->show(Landroid/app/Activity;Lcom/google/ads/GoogleAdView;Z)V
以上代碼的原文大致為:
Code :
GoogleAdView adView=(GoogleAdView)findViewById(0x7f070000);
if(this.adController!=null){
this.adController.show(this,adView,false);
}
這段代碼的意思就是查找到id為 0x7f070000 的視圖,并實例化成GoogleAdView類型,然后顯示廣告。
通過 res/values/public.xml 可以知道 0x7f070000 對應的布局元素是:ad_area,回到score.xml中刪除:
Code :<com.google.ads.GoogleAdView android:id="@id/ad_area" android:layout_width="320.0dip" android:layout_height="50.0dip" />
重新編譯,重新簽名,重新安裝
顯示分數的廣告已消失:

程序第一次運行會有一個廣告,此廣告并不是google廣告,是游戲自身的,如圖:

接下來我們來刪掉這個廣告
我們看到廣告中有一個圖片按紐:
在res\drawable文件夾中查看縮略圖,發(fā)現:r_dlg_download_default.png r_dlg_download_pressed.png r_dlg_download.xml
r_dlg_download.xml是這個按紐圖片的動態(tài)交互描述文件
在res/values/public.xml 中搜索r_dlg_download 得到ID值:0x7f070013
然后用編輯器在 smali/com/droidhen 中搜索這個ID值,找到:RecommendActivity.smali(R打頭的你要略過,因為這R打頭的是自動生成的)
從字面意思看 RecommendActivity.smali 是用于顯示 推薦
我們只需要游戲活動中刪除對RecommendActivity的調用,在smali/com/droidhen 文件夾中搜索:RecommendActivity,找到:RecommendUtil.smali(略過RecommendActivity打頭的)
進而在smali/com/droidhen 文件夾中搜索:RecommendUtil,找到并刪除:
CoverActivity.smali
Code :
   .line 38
   invoke-static {p0}, Lcom/droidhen/recommend/RecommendUtil;->fetch(Landroid/content/Context;)V
GameActivity.smali
Code :
   .line 113
   invoke-static {p0}, Lcom/droidhen/recommend/RecommendUtil;->show(Landroid/content/Context;)V
重新編譯,重新簽名,重新安裝,廣告已全面消息
接下來做清理工作,刪掉不用的類及資源
刪除文件:smali\com\droidhen\game\zootrip\global\AdController.smali
刪除文件:smali\com\droidhen\Ad.smali
刪除文件:smali\com\droidhen\game\zootrip\global\TrackUtil.smali ----此代碼是用于google廣告統(tǒng)計的
刪除文件夾 com\droidhen\recommend
刪除文件夾 smali\com\google
刪除 res\drawable 下如下文件:
[quote]
r_dlg_bg.png
r_dlg_cancel.xml
r_dlg_cancel_default.png
r_dlg_cancel_pressed.png
r_dlg_download.xml
r_dlg_download_default.png
r_dlg_download_pressed.png
[/quote]
刪除 res\values\public.xml 中的以下節(jié)點:
[quote]
   <public type="id" name="ad_area" id="0x7f070000" />
   <public type="id" name="r_dlg_icon" id="0x7f070010" />
   <public type="id" name="r_dlg_title" id="0x7f070011" />
   <public type="id" name="r_dlg_desc" id="0x7f070012" />
   <public type="id" name="r_dlg_download" id="0x7f070013" />
   <public type="id" name="r_dlg_cancel" id="0x7f070014" />
[/quote]
刪除ConverActivity.smali中如下代碼:
Code :
   .line 37
   invoke-static {p0}, Lcom/droidhen/game/zootrip/global/TrackUtil;->track(Landroid/content/Context;)V
Code :
   .line 43
   invoke-static {}, Lcom/droidhen/game/zootrip/global/TrackUtil;->stopTrack()V
重新編譯,安裝,運行
清理好的apk:a_noad.apk


本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Hero/Evo Rom 制作教程 – HtcDialer,Phone,EPST等修改
Android 中的拿來主義(編譯,反編譯,AXMLPrinter2,smali,baks...
Android無需權限顯示懸浮窗, 兼談逆向分析app
Android開發(fā)apk反編譯和二次打包教程
【轉】Android軟件去廣告方法總結[2012.3.6更新工具]
千牛群客戶端的反編譯攻防戰(zhàn)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服