美文网首页Android安卓开发使用锦集android
Android APK 混淆 签名 打包 加固 重签名 全流程

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

作者: MiHomes | 来源:发表于2017-06-30 16:35 被阅读1855次

    一.相信有不少小伙伴还在为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

    相关文章

      网友评论

      • 坚持DD:我也是用360加固的。有更好的推荐吗?
      • HuZC:360加固宝会帮你集成360统计,在360账号后台会看到,至于在不需要询问权限的情况下偷偷获取用户隐私还是有可能的:smirk:
        MiHomes:可是,比如你集成极光的东西,极光也会帮你统计某些数据,难道就不用了吗
        MiHomes::wink: 是否有推荐
      • 32b1fece160c:我也在用360加固,也没什么的,下面那个人说话也太粗鲁了吧,有什么不好的话,好好说话,指出他的缺点就行啊
        MiHomes:@邓志杨 没事:smile:
        9c84afe32d66:回头看了自己的回复 ,确实粗鲁了点, 说声抱歉 :pray:
        MiHomes: @吉他人生 嗯,开始用到现在,正常使用中。
      • 9c84afe32d66:360加固保?你确定没有在开玩笑?
        MiHomes: @邓志杨 好,我一会换一种加固方式。您有推荐吗
        9c84afe32d66:@MiHomes 感觉这种东西太不可控了 我的程序, 他的壳无论做什么事我都是不可控的, 比如获
        取用户隐私, 加载广告等.
        MiHomes:只是觉得简便就用了,怎么了?

      本文标题:Android APK 混淆 签名 打包 加固 重签名 全流程

      本文链接:https://www.haomeiwen.com/subject/ydgycxtx.html