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阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容