28. 項目上線(一)之代碼混淆

收藏待读

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相關類、四大組件、自定義控件等,這些類若被混淆,則在程序打包後運行時將無法找到該類,因此需要將這些內容保持原樣,不進行混淆。

原文 : 簡書

相關閱讀

免责声明:本文内容来源于簡書,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。