天天看點

Android代碼混淆常見問題解決方案總結

什麼是代碼混淆呢?混淆就是對釋出出去的程式進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即使反編譯成功也很難得出程式的真正語義      
為什麼要進行Android代碼混淆?Android是基于Java的,Java源代碼編譯成中間“位元組碼”存儲于class檔案中,很容易被反編譯成Java源代碼。為了防止辛辛苦苦開發的東西輕易流失,就需要對将要釋出出去的程式進行混淆。接下來切入今天的正題,Android代碼混淆,可以參考上篇android應用的反編譯(點選打開連結),加深對代碼混淆要性的了解      
Android混淆用到的工具:ProGuard,還具有代碼優化的作用,工作方式:去除無效的代碼,将代碼中的類名、函數名替換為晦澀難懂的名字。隻能混淆java代碼,對其它的如資源檔案等無影響,相關聯的檔案主要有proguard、proguard-project.txt、project.properties,如下圖所示: 
        
Android代碼混淆常見問題解決方案總結
為什麼要配置proguard-project.txt檔案,如果不配置,啟用混淆功能時會把所有的java代碼混淆,而Android工程中有些代碼是不能被混淆的,是以該檔案配置的是哪些檔案不能混淆。不能被混淆的檔案主要有以下幾類:a 引用的第三方jar,已經被第三方公司混淆,再次混淆的話,執行程式就會報找不到該jar中的類;b 用到泛型的類;c 用到反射的類; d 用到java和js互動的類      
基本的配置有以下三種:1 不混淆該包中的所有類 -keep class com.alipay.android.app.** {*; } 
                 	      2 忽略混淆引起的包中所有類産生的警告 -dontwarn com.alipay.android.app.**
             		      3 表明目前是一個jar(需要對jar包中的所有包下的類進行1和2處理) -libraryjarslibs/pinyi						n4j-2.5.0.jar       
衍生配置如下:a  不混淆某個類的構造函數  -         keepclassmembers               class                    com.ticktick.example.Test {       
public              void              setTestString(java.lang.String);
               						 }                             	      b  不混淆某個包中的特定類           -keep               class              com.ticktick.example.Test { * ; }
                                    	      c  不混淆某個類的特定的函數          -keepclassmembers               class                    com.ticktick.example.Test {      
public              void              setTestString(java.lang.String);                   					 }                

	              d  不混淆某個類的子類          -keep               public              class              *               extends              com.ticktick.example.Test
               
      e  不混淆某個接口的實作          -keep               class              * implementscom.ticktick.example.TestInterface {                 
public              static              final              com.ticktick.example.TestInterface$Creator *;                                  					}           
其它配置:-optimizationpasses 3 
              	  -dontusemixedcaseclassnames #混淆時不會産生形形色色的類名 
                  -dontskipnonpubliclibraryclasses#指定不去忽略非公共的類庫 
                  -dontpreverify#不預校驗 
                  -verbose 
                  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#優化 
                
注意:根據以上并不能保證所有不該混淆的都有配置,可以通過運作程式,通過程式給出的錯誤log資訊,在proguard-project.txt檔案中補              充不需要混淆的配置,這樣既能達到保護代碼不洩露,又能優化程式并同時保證程式應有的功能運作正常                
常見問題歸類:1 用到afinal和gson jar包做,且已經做過jar防混淆處理,還需要對用到的實體進行防混淆配置
        	 	  -keep class cn.gyyx.android.qibao.model.** {*; }
                    	  -dontwarn cn.gyyx.android.qibao.model.**
         	      2 解決missing a type錯誤
               		  #過濾泛型 
                    	  -keepattributes Signature
            		  -keep class sun.misc.Unsafe { *; }
                    	  #Application classes that will be serialized/deserialized over Gson
 		          -keep class com.google.gson.examples.android.model.** { *; } 
    
   		      3 過濾Javascript webview.addJavascriptInterface(this, "install");
               		  this就是需要過濾的類
               		  -keepclassmembers class cn.gyyx.android.qibao.context.fragment.servantchild.AppRecommendF			 		  ragment{
    				public *;
        		  }
          		  -keepattributes *Annotation*
           		  -keepattributes *JavascriptInterface*      
附上配置截圖:供參考

        
Android代碼混淆常見問題解決方案總結
    以上所有配置完善後,簽名打包一個apk,試着反編譯檢視程式源碼,對照一下原工程的代碼,就可以知道代碼混淆的強大威力,經過混淆之後再也不用擔心辛辛苦苦的代碼被拿走了