搞了好幾天,查看了上百個網站,最後摸索出一套很簡單的ant混淆編譯的方法。下面開始:
1. 拿一個普通項目來說,首先為它加上ant編譯功能。
android update project --name project_name -t 3 -p D:/temp/project_name
此時會在項目根目錄自動產生一個名為build.xml的ant指令碼。上面的project_name是你的項目名稱。
2. 加入混淆功能
就第一步來說,在命令列中已經可以使用ant進行編譯了。因為Android中是這樣的,在輸入命令ant debug的時候會自動調用D:/android-sdk-windows/tools/ant/main_rules.xml目錄下的規則檔案,所以無需自己寫ant指令碼了。既然它會調用預設的規則檔案(預設檔案沒有加入混淆功能),那麼我們想要混淆,直接在這個規則檔案上修改就好了。在名為-dex的target後加入一個target,代碼如下:
<target name="optimize" depends="compile"><jar basedir="${out.classes.absolute.dir}" destfile="temp.jar"><java jar="D:/android-sdk-windows/tools/proguard/lib/proguard.jar" fork="true" failonerror="true"><jvmarg value="-Dmaximum.inlined.code.length=32"><!-- value="-libraryjars ${library-jar}/some_lib_used.jar"> --> </arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></!--></arg></arg></arg></jvmarg></java><delete file="temp.jar"><delete dir="${out.classes.absolute.dir}"><mkdir dir="${out.classes.absolute.dir}"><unzip src="optimized.jar" mce_src="optimized.jar" dest="${out.classes.absolute.dir}"><delete file="optimized.jar"></delete></unzip></mkdir></delete></delete></jar></target>
修改上面代碼涉及到路徑的地方,改成本地對應的路徑。<arg value="-ignorewarning"/>這一行是自己加入的,意思是忽略警告。
接著在名為-dex的target中進行一個混淆依賴,加入後代碼如下:
<target name="-dex" depends="compile, optimize, -post-compile, -obfuscate" unless="do.not.compile"><if condition="${manifest.hasCode}"><then><dex-helper></dex-helper></then><else><echo>hasCode = false. Skipping...</echo></else></if></target>
實際上加入的只是optimize,意思是這個target依賴target optimize。
3. 開始編譯
可以在命令列中編譯了,編譯後把class.dex進行反編譯,可以看出來混淆成功。不知道為什麼在我們的項目中反編譯不回來,但是可以保證混淆是成功了。我拿過其他例子項目編譯後反編譯過,可以看:(不好意思,註冊一星期之內不能上傳圖片)
現在補上: