sttdio混淆

本文详细介绍如何在Android Studio中进行代码混淆,并提供了一个完整的混淆配置文件示例。此外,还介绍了如何生成签名的APK文件,以便进行应用发布。
 

AndroidStudio中代码混淆以及打包操作

总结一下混淆

prguard-rules.pro文件中写的,其实就是混淆规则,规定哪些东西不需要混淆。自己编写的代码中大致就是一些重要的类需要混淆,而混淆的本质就是精简类名,用简单的a,b,c等单词来代替之前写的如DataUtil等易懂的类名

所以,理解了这点,也就好理解这个混淆文件该怎么写了,大致思路就是:不混淆第三方库,不混淆系统组件,一般也可以不混淆Bean等模型类,因为这些对别人都是没用的,毕竟都是开源的。。。

摸索了两天,大概了解了在AndroidStudio中代码混淆和打包发布的过程,在此记录下
关于代码混淆的作用,就不多解释了,整个过程大致如下:
  • 在app下的build.gradle文件中添加如下代码(minifyEnabled 表示是否混淆,默认是false,这里要记得设置成true): 
    这里写图片描述 
    其中proguard-Android.txt文件是本地sdk/tools/proguard文件夹下的默认文件;prguard-rules.pro文件就是用来编写混淆代码的;

  • 接下来就是在prguard-rules.pro文件中编写混淆代码:

    关于其中代码的理解,可以参考这篇文章:代码混淆详解

编写完混淆代码,混淆也就算完成了,接下来就是打包了,但是,混淆的时候可能会遇到各种问题,主要是混淆代码,因为涉及到有的类不需要混淆,混淆了就会报错运行不了,所以在编写混淆代码的时候一定要小心,其实一般注意这几点就好了:

  • 不需要导入第三方类库的代码,如上图注释的部分:-libraryjars libs/BaiduLBS_Android.jar等,按照网上说的,需要在混淆文件中导入第三方类库,防止混淆时读取包内容出错,但是如果那样做的话,会报如下错误: 
    这里写图片描述 
    是的,他说这个包被指定了两次

    原因是,在build.gradle文件中已经指定了第三方类库,这里再次指定,就会重复,所以,在此应该不需要导第三方包的代码

  • 过滤掉第三方包,也就是不需要混淆第三方包,比如常见的 android-support-v4.jar:

-ignorewarnings
-dontwarn android.support.v4.**    
-keep class android.support.v4.** { *; }  
-keep interface android.support.v4.app.** { *; }  
-keep public class * extends android.support.v4.**  
-keep public class * extends android.app.Fragment
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面是一个项目中我过滤掉的第三方包:

-keep class org.apache.**{*;}//过滤commons-httpclient-3.1.jar
-keep class com.fasterxml.jackson.**{*;}//过滤jackson-core-2.1.4.jar等
-keep class com.lidroid.xutils.**{*;}//过滤xUtils-2.6.14.jar
--keep class com.baidu.** {*;}//过滤BaiduLBS_Android.jar

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

通常关于第三方包的混淆代码,一般在其github主页上或者simple中会有提示,比如 xUtils的混淆就建议不要混淆Annotation,即:`-keep class * extends Java.lang.annotation.Annotation{*;} 
还有百度地图,在其官方文档中有说明,需要如下混淆代码:

-dontwarn com.baidu.**
-keep class com.baidu.**{*;}  
-keep class vi.com.**{*;} 
   
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
  • 接下来需要注意的就是一些固定格式的代码了,比如常见的Activity等不要混淆,Bean不要混淆等,看代码:
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Fragment 
-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 com.android.vending.licensing.ILicensingService
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里的内容大致就是对一些Android组件保持原样,不进行混淆

总结一下混淆

prguard-rules.pro文件中写的,其实就是混淆规则,规定哪些东西不需要混淆。自己编写的代码中大致就是一些重要的类需要混淆,而混淆的本质就是精简类名,用简单的a,b,c等单词来代替之前写的如DataUtil等易懂的类名

所以,理解了这点,也就好理解这个混淆文件该怎么写了,大致思路就是:不混淆第三方库,不混淆系统组件,一般也可以不混淆Bean等模型类,因为这些对别人都是没用的,毕竟都是开源的。。。

下面是整个混淆文件的代码:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\sdt1\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

#-----------------混淆配置设定------------------------------------------------------------------------
-optimizationpasses 5                                                       #指定代码压缩级别
-dontusemixedcaseclassnames                                                 #混淆时不会产生形形色色的类名
-dontskipnonpubliclibraryclasses                                            #指定不忽略非公共类库
-dontpreverify                                                              #不预校验,如果需要预校验,是-dontoptimize
-ignorewarnings                                                             #屏蔽警告
-verbose                                                                    #混淆时记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*    #优化

#-----------------导入第三方包,但是在当前版本中使用会报 input jar file is specified twice 错误,所以注释掉
#-libraryjars libs/android.support.v4.jar
#-libraryjars libs/BaiduLBS_Android.jar
#-libraryjars libs/commons-httpclient-3.1.jar
#-libraryjars libs/jackson-annotations-2.1.4.jar
#-libraryjars libs/jackson-core-2.1.4.jar
#-libraryjars libs/jackson-databind-2.1.4.jar
#-libraryjars libs/xUtils-2.6.14.jar

#-----------------不需要混淆第三方类库------------------------------------------------------------------
-dontwarn android.support.v4.**                                             #去掉警告
-keep class android.support.v4.** { *; }                                    #过滤android.support.v4
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

-keep class org.apache.**{*;}                                               #过滤commons-httpclient-3.1.jar

-keep class com.fasterxml.jackson.**{*;}                                    #过滤jackson-core-2.1.4.jar等

-dontwarn com.lidroid.xutils.**                                             #去掉警告
-keep class com.lidroid.xutils.**{*;}                                       #过滤xUtils-2.6.14.jar
-keep class * extends java.lang.annotation.Annotation{*;}                   #这是xUtils文档中提到的过滤掉注解

-dontwarn com.baidu.**                                                      #去掉警告
-dontwarn com.baidu.mapapi.**
-keep class com.baidu.** {*;}                                               #过滤BaiduLBS_Android.jar
-keep class vi.com.gdi.bgl.android.**{*;}
-keep class com.baidu.platform.**{*;}
-keep class com.baidu.location.**{*;}
-keep class com.baidu.vi.**{*;}

#-----------------不需要混淆系统组件等-------------------------------------------------------------------
-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.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keep class com.classtc.test.entity.**{*;}                                   #过滤掉自己编写的实体类


#----------------保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在------------------------------------
-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

打包发布

混淆代码编写完成,就是打包发布了,打包的时候需要注意,如果混淆代码编写有疏漏,编译打包可能会出错,如上面的那个报错一样,就是在混淆的时候重复指定了第三方包,导致编译打包出错。 
下面是打包的具体过程:

  • 如图,在AndroidStudio中找到Build–>Generate Signed APK… 
    这里写图片描述

  • 在出现的窗口中选择Create new (如果之前创建过,可以直接选择,然后在下面输入密码即可): 
    这里写图片描述

  • 接下来编写密钥信息窗口: 
    这里写图片描述

  • 填写完密钥信息后回到之前的窗户,点击Next,然后点击Finish就完成了,然后等待编译完成,在文件夹下会多一个app-release.apk文件,这个就是正式版的安装包

到此,打包完成,当然,如果需要发布到各大软件市场,可能还需要渠道打包,这个就等以后做过了再回来总结

推荐文章:使用Gradle管理你的AndroidStudio工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值