Android APK 混淆 簽名 打包 加固 重簽名 全流程

一.相信有不少小伙伴還在為Apk上架應用市場而苦惱吧,現在就分享一下apk從代碼變為可上傳應用市場的安裝包的詳細流程,仔細閱讀,相信您會有收獲。

1.配置混淆文件(Android studio對應module下的 proguard-rules.pro文件):混淆文件主要分為三部分,一部分為固定的配置代碼,一部分為你不想要混淆的自定義Application類或者網絡請求基類,另一部分為你使用的所有第三方插件的混淆代碼。

----------------------------------------------------------------我是小坑分割線----------------------------------------------------------------------------
插播一則廣告,gson類也要防混淆,第三方實體類和自己的自定義控件類也要防混淆,切記~
----------------------------------------------------------------我是小坑分割線----------------------------------------------------------------------------
A.固定的配置代碼,同時要做禁LOG處理(即在你proguard-android.txt中一定不要加-dontoptimize才起作用):

        # 代碼混淆壓縮比,在0~7之間,默認為5,一般不做修改
        -optimizationpasses 5

        # 混合時不使用大小寫混合,混合后的類名為小寫
        -dontusemixedcaseclassnames

        # 指定不去忽略非公共庫的類
        -dontskipnonpubliclibraryclasses

        # 這句話能夠使我們的項目混淆后產生映射文件
        # 包含有類名->混淆后類名的映射關系
        -verbose
        
        # 指定不去忽略非公共庫的類成員
        -dontskipnonpubliclibraryclassmembers

        # 不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。                                          
        -dontpreverify

        # 保留Annotation不混淆
       -keepattributes *Annotation*,InnerClasses

       # 避免混淆泛型
       -keepattributes Signature

       # 拋出異常時保留代碼行號
       -keepattributes SourceFile,LineNumberTable

       # 指定混淆是采用的算法,后面的參數是一個過濾器
       # 這個過濾器是谷歌推薦的算法,一般不做更改
       -optimizations !code/simplification/cast,!field/*,!class/merging/*


       #############################################
       #
       # Android開發中一些需要保留的公共部分
       #
       #############################################

       # 保留我們使用的四大組件,自定義的Application等等這些類不被混淆
       # 因為這些子類都有可能被外部調用
       -keep public class * extends android.app.Activity
       -keep public class * extends android.app.Appliction
       -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


       # 保留support下的所有類及其內部類
       -keep class android.support.** {*;}

       # 保留繼承的
       -keep public class * extends android.support.v4.**
       -keep public class * extends android.support.v7.**
       -keep public class * extends android.support.annotation.**

       # 保留R下面的資源
       -keep class **.R$* {*;}

       # 保留本地native方法不被混淆
       -keepclasseswithmembernames class * {
           native <methods>;
       }

       # 保留在Activity中的方法參數是view的方法,
       # 這樣以來我們在layout中寫的onClick就不會被影響
       -keepclassmembers class * extends android.app.Activity{
           public void *(android.view.View);
       }

       # 保留枚舉類不被混淆
       -keepclassmembers enum * {
           public static **[] values();
           public static ** valueOf(java.lang.String);
       }

       # 保留我們自定義控件(繼承自View)不被混淆
       -keep public class * extends android.view.View{
           *** get*();
           void set*(***);
           public <init>(android.content.Context);
           public <init>(android.content.Context, android.util.AttributeSet);
           public <init>(android.content.Context, android.util.AttributeSet, int);
       }

       # 保留Parcelable序列化類不被混淆
       -keep class * implements android.os.Parcelable {
           public static final android.os.Parcelable$Creator *;
       }

       # 保留Serializable序列化的類不被混淆
       -keepclassmembers class * implements java.io.Serializable {
           static final long serialVersionUID;
           private static final java.io.ObjectStreamField[] serialPersistentFields;
           !static !transient <fields>;
           !private <fields>;
           !private <methods>;
           private void writeObject(java.io.ObjectOutputStream);
           private void readObject(java.io.ObjectInputStream);
           java.lang.Object writeReplace();
           java.lang.Object readResolve();
       }

       # 對于帶有回調函數的onXXEvent、**On*Listener的,不能被混淆
       -keepclassmembers class * {
           void *(**On*Event);
           void *(**On*Listener);
       }

       # webView處理,項目中沒有使用到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, jav.lang.String);
       }
       
       # 移除Log類打印各個等級日志的代碼,打正式包的時候可以做為禁log使用,這里可以作為禁止log打印的功能使用  
       # 記得proguard-android.txt中一定不要加-dontoptimize才起作用
       # 另外的一種實現方案是通過BuildConfig.DEBUG的變量來控制
      -assumenosideeffects class android.util.Log {
          public static int v(...);
          public static int i(...);
          public static int w(...);
         public static int d(...);
         public static int e(...);
      }          

B.你不想混淆的實體類(注:doudou.soga.com.doudou為你的包名,bean為對應的文件夾名字,** { ; }代表該文件夾下的所有類):
#--------------------------2.實體類---------------------------------
-keep class doudou.soga.com.doudou.bean.
* { ; } #實體類不參與混淆
-keep class doudou.soga.com.doudou.widget.
* { ; } #自定義控件不參與混淆
-keep class doudou.soga.com.doudou.app.
* { *; } #網絡請求和自定義Applicattion類不參與混淆

C.第三方控件混淆代碼(這些代碼都可以百度Copy到,為你使用的所有第三方插件的混淆代碼。我就隨便列一兩個):

      #--------------------------3.第三方包-------------------------------
      
      ################gson##################
      -keep class com.google.gson.** {*;}
      #-keep class com.google.**{*;}
      -keep class sun.misc.Unsafe { *; }
      -keep class com.google.gson.stream.** { *; }
      -keep class com.google.gson.examples.android.model.** { *; }
      -keep class com.google.** {
          <fields>;
          <methods>;
      }
      -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();
      }
      -dontwarn com.google.gson.**

       ####################jpush##################
      -keep class cn.jpush.** { *; }
      -keep public class com.umeng.fb.ui.ThreadView { } #雙向反饋功能代碼不混淆
      -dontwarn cn.jpush.**
      -keepclassmembers class * {
          public <init>(org.json.JSONObject);
      }
       -keep public class cn.jiguang.analytics.android.api.** {
              *;
          }
       #不混淆R類
      -keep public class com.jph.android.R$*{
          public static final int *;
      }
      -keepclassmembers enum * {
          public static **[] values();
          public static ** valueOf(java.lang.String);
      }

      ################ButterKnife###################
          -keep class butterknife.** { *; }
          -dontwarn butterknife.internal.**
          -keep class **$$ViewBinder { *; }

          -keepclasseswithmembernames class * {
              @butterknife.* <fields>;
          }

          -keepclasseswithmembernames class * {
              @butterknife.* <methods>;
          }

2.接著,那么就要修改module下的build.gradle的minifyEnabled 為True

       android{ 
          buildTypes {
              release {
                     minifyEnabled true    //注意,在這里?。。。?                     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                 }
             }
         }    

3.混淆文件配置好了,那么可以開始簽名打包了。若是多渠道打包,(我采用的是JPUSH),那么還要在清單文件AndroidManifest.xml最底層配置這一行代碼(meizu-market代表魅族應用市場,JPUSH統計代碼請參閱極光官方文檔):

    <!-- JPUSH_CHANNEL 是為了方便開發者統計APK分發渠道。-->
    <!-- 例如: -->
    <!-- 發到 Google Play 的APK可以設置為 google-play; -->
    <!-- 發到其他市場的 APK 可以設置為 xxx-market。 -->
    <!-- 渠道統計報表位于控制臺頁面的 “統計”-“用戶統計”-“渠道分布” 中-->
    <meta-data android:name="JPUSH_CHANNEL" android:value="meizu-market"/>

4.正式開始打包,首先Android Studio --Build -- Generate Signed APK ,然后配置你的簽名信息,下一步直接打包就行拉。附贈一張截圖

圖片.png

注釋:
Key store path:簽名文件配置的路徑+名字
Password:密碼(每次簽名都要輸入的,后面也可以記住密碼)
Confirm:確認密碼
Alias:別名
Validity:簽名有效時間
Certificate:證書
First and Last Name:開發者名字
Organizational Unit:組織單位
Organization:組織
City or Locality:城市或地區
State or Province:州或省
Country Code(xx):中國可填86

5.打包完成以后,在項目路徑下會生成一個.apk文件(注:DouDou為項目名,app為module名),然后可以直接下載360加固寶加固(注:加固完成以后需要重新簽名一次才能安裝!?。。。。?,360加固寶有自帶的簽名工具可以一鍵加固簽名

圖片.png
圖片.png

6.加固完成的.apk文件體積會略有增大,就能直接上傳應用市場了。隨手分享,喜歡的朋友可以關注微信公眾號MiHomes,后續會有更多更好的博客推送給您。

另:歡迎指出不足,會進行更正

末尾:移動互聯&人力資源交流群,可加微信zy666128入群交流。


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容