28. 項目上線(一)之代碼混淆
上一節對歡迎模塊進行了綜述(可參見設置模塊 進行了解),接下來將從設置模塊開始詳細介紹:
- [項目上線(一)之代碼混淆]
- [項目上線(二)之項目打包]
- [項目上線(三)之項目加固]
- [項目上線(四)之項目發佈]
知識點
- 掌握代碼混淆方式以及項目打包流程,實現項目打包。
- 掌握第三方加固軟件的使用,使用該軟件對項目進行加固
- 掌握項目發佈到市場的流程,能夠將頭條項目上傳到應用市場
當應用程序開發完成之後,需要將程序放到應市場中供用戶使用。在上傳到應用市場之前,需要對需程序代碼進行混淆、打包、加固等,以提高程序的安全性。所有企業的項目都必須經歷這一步。
1. 代碼混淆
為了放置自己開發的程序被別人反編譯並保護自己的勞動成果,一般情況下需要對程序進行代碼混淆。代碼混淆(也稱花指令)是指保持程序功能不變,將程序代碼轉換成一種難以閱讀和理解的形式。代碼混淆為應用程序增加一層保護措施,但是並不能完全防止程序被反編譯。
1.1修改build.gradle文件
由於需要開啟項目的混淆設置,因此需要在build.gradle文件的buildTypes中添加相關屬性,具體代碼如下所示:
buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
在上述代碼中, minifyEnabled用於設置是否開啟混淆,默認情況下為false,需要開啟混淆時設置為true。shrinkResources屬性用於去除無用的resource文件。proguardFiles getDefaultProguardFile用於加載混淆的配置文件,配置文件中含有混淆的相關規則。
1.2 編寫proguard-rules.pro文件
代碼混淆需要指定混淆規則,例如指定代碼壓縮級別、混淆時採用的算法、排出混淆的類等,這些混淆規則是在proguard-rules.pro文件中編寫的。
-ignorewarnings #抑制警告 -keep class com.com.itheima.topline.bean.* *{*;} #保持實體類不被混淆 -optimizationpasses 5 #指定代碼的壓縮級別 -dontusemixedcaseclassnames #是否使用大小寫混合 -dontpreverify #混淆時是否做預校驗 -verbose #混淆時是否記錄日誌 #指定混淆時採用的算法 -optimizationpasses !code/simplification/arithmetic,!field/*,!class/merging/* #百度地圖混淆 -keep class com.amap.api.* *{*;} -keep class.com.autonavi.amap.mapcore.* *{*;} #對於繼承Android的四大組件等系統類,保持不被混淆 -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService -keep class android.support.* *{*;} -keepclasseswithmembernames class * { #保持native不被混淆 native; } #保持自定義控件類不被混淆 -keepclassmembers class * extends android.app.Activity{ public void * (android.view.View); } #保持枚舉類enum不被混淆 -keepclassmembers enum * { public static * *[] values(); public static * *valueOf(java.lang.String); } #保持Parcelable的類不被混淆 -keep class * implements android.os.Parcelable{ public static final android.os.Parcelable&Creator *; } #保持繼承自View對象中的set/get方法以及初始化方法的方法名不被混淆 -keep public class * extends android.view.View{ * * * get*(); void set *(* * *); public (android.content.Context); public (android.content.Context,android.util.AttributeSet); public (android.content.Context,android.util.AttributeSet,int); } #對所有類的初始化方法的方法名不進行混淆 -keepclasseswithmembers class * { public (android.content.Context,android.util.AttributeSet); public (android.content.Context,android.util.AttributeSet,int); } #保持Serializable序列化的類不被混淆 -keepclassmembers class * implements java.io.Serializable{ static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } #對於R(資源)下的所有類及其方法,都不能被混淆 -keep class * *.R$*{ *; } #對於帶有回調函數onXXEvent的,不能被混淆 -keepclassmembers class * { void * (* * On * Event); } #Webview混淆的處理 -keepclassmembers class fqcn.of.javascript.interface.for.Webview{ public *; } -keepclassmembers class * extends android.webkit.WebViewClient{ public void * (android.webkit.WebView,java.lang.String,android.graphics.Bitmap); public boolean * (android.webkit.WebView,java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient{ public void * (android.webkit.WebView,java.lang.String); }
從上述代碼可以看出,在proguard-rules.pro文件中需要指定混淆時的一些屬性,如代碼壓縮級別、是否使用大小寫混合、混淆時的算法等。同時,在文件中還需要指定排除哪些類不被混淆,如Activity相關類、四大組件、自定義控件等,這些類若被混淆,則在程序打包後運行時將無法找到該類,因此需要將這些內容保持原樣,不進行混淆。
原文 : 簡書