反編譯apk文件,通常是用apktool反編譯apk,而後剔除com\baidu\mobads目錄的.smali文件. java
再用notepad++搜索全部的.smali文件(查找>>文件查找).初步定爲那些類調用了百度廣告api. android
可能沒有查找獲得.若是查找的到則 api
對dex文件經行dex2jar,使用JDGUI打開jar文件,看看剛纔定位的那些類怎麼調用百度廣告的什麼api. 框架
我反編譯了一個apk,在jar中沒有找到調用廣告的api的代碼.看來只用在layout佈局文件查找. 工具
其中一個佈局文件發現了這樣的一段代碼 佈局
<com.baidu.mobads.AdView android:id="@id/ads" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" baiduadsdk:adSize="0" baiduadsdk:adId="1003fbb5" />
好,就是這段代碼使得廣告起做用. this
因此,只須要將jar中的com.baidu.mobads.AdView.class替換掉就能夠了. code
接着,打開Eclipse 新建一個項目,項目名任意. xml
接着建立一個AdView類,包名com.baidu.mobads. ip
代碼以下
package com.baidu.mobads; import android.content.Context; import android.util.AttributeSet; import android.widget.RelativeLayout; public final class AdView extends RelativeLayout { public AdView(Context paramContext) { this(paramContext, true, AdSize.Banner, ""); } public AdView(Context paramContext, AttributeSet paramAttributeSet) { this(paramContext, paramAttributeSet, true, AdSize.Banner, ""); } public AdView(Context paramContext, AttributeSet paramAttributeSet, boolean paramBoolean, AdSize paramAdSize, String paramString) { super(paramContext, paramAttributeSet); } public AdView(Context paramContext, AdSize paramAdSize, String paramString) { this(paramContext, true, paramAdSize, paramString); } AdView(Context paramContext, boolean paramBoolean, AdSize paramAdSize, String paramString) { this(paramContext, null, paramBoolean, paramAdSize, paramString); } }
當你粘貼着代碼進去的時候,發現了不少錯誤.別急.
Context,AttributeSet, RelativeLayout 這些出現了錯誤吧,關鍵沒有import吧?
要不要複製個android.jar到這項目?不用.由於決定一個類的是包名和類名.
那就建立一個Context類 ,包名android.content.代碼以下
package android.content; public class Context { }
一樣再建立一個AttributeSet, 包名android.util.代碼以下
package android.util; public class AttributeSet { }
一樣再建立一個AttributeSet, 包名android.util.代碼以下
package android.widget; import android.content.Context; import android.util.AttributeSet; public class RelativeLayout { public RelativeLayout(Context paramContext, AttributeSet paramAttributeSet) { // TODO Auto-generated constructor stub } }
到了這裏還有一個地方有問題.AdSize!!!
在com.baidu.mobads包下建立一個枚舉
package com.baidu.mobads; public enum AdSize { Banner }
好了,一切錯誤消失.有人會問,上面那幾個類怎麼都不寫實現?
首先,沒有代碼調用AdView的方法吧,那就不寫AdView的方法唄,若是有調用就直接寫這個方法,但不用寫裏面的方法體.有return的要return 一個必要的值,這個值得慢慢斟酌.
在寫Context類的使用,AdView也沒有調用到Context的方法吧.那也不寫裏面的方法了.
接着隨便建立一個類,添加個空的main方法.
點擊run,com.baidu.mobads.AdView.class 就出來了.
打開該項目的目錄,找到bin目錄.找到AdView.class
找到剛纔反編譯出來的jar文件,用winrar之類工具打開,
刪除com/baidu/mobads下的全部文件
AdView.class放在jar壓縮包的com/baidu/mobads目錄下.直接拖進去就好了.
而後使用jar2dex轉換回dex ,替換掉原來apk的dex文件.從新簽名.ok.
好神奇麼?其實java不但代碼能夠複製粘貼,連編譯出來的.class文件也能夠隨便複製粘貼刪除.
只要保證必要的框架完整就能夠了.想不被破解都難呀.
對於其餘平臺的廣告一樣適用,如谷歌廣告.
若是再狠一點的話,把整個百度廣告的api都擼一遍.想破解百度廣告的話,dex2jar.
刪掉百度的,將本身的山寨框架替換進去.再jar2dex. 再替換掉原來的dex,從新簽名OK.
不要問我是誰,咱是雷鋒的同黨!咱只爲用戶謀福利!
警告:不爲用戶謀福利,而利用此法爲本身謀私利錢財的,後果自負!