Socket 打包混淆

1. Android SDK自带了混淆工具Proguard

  它位于SDK根目录\tools\proguard下面。 ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。它可以将类、字段和方法使用短无意义的名称进行重命名。最后,预校验的Java6或针对Java MicroEdition的所述处理后的码。
  如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三方包是不能混淆的,这就需要我们手动编写混淆规则来保持不能被混淆的部分。
  项目中如果含有多个module时,在主app中设置了混淆其他module都会混淆。

2. 在 App module build.gradle 中配置

android {
    buildTypes {
        release {
           //shrinkResources true    // 移除未被使用的资源
            minifyEnabled true       // 开启代码混淆
            zipAlignEnabled true     // 开启Zip压缩优化
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false       // 关闭代码混淆
            zipAlignEnabled false     // 关闭Zip压缩优化
            //shrinkResources false   // 不移除未被使用的资源
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

task clearJar(type: Delete) {
    delete 'build/libs/sdk.jar'//这行表示如果你已经打过一次包了,再进行打包则把原来的包删掉
}

task makeJar(type: Copy) {
    from('build/intermediates/aar_main_jar/release/') //这行表示要打包的文件的路径,根据下面的内容,其实是该路径下的classes.jar
    into('build/libs/')  //这行表示打包完毕后包的生成路径,也就是生成的包存在哪
    include('classes.jar')  //看到这行,如果你对分包有了解的话,你就可以看出来这行它只是将一些类打包了
    rename ('classes.jar', 'sdk.jar')
    exclude('test/', 'BuildConfig.class', 'R.class')//去掉不需要打包的目录和文件
    exclude{it.name.startsWith('R');}//去掉R开头的文件
}

makeJar.dependsOn(clearJar, build)

3. proguard-rules.pro 中添加混淆配置

# --------------------------------------------基本指令区-------------------------------------#
# 忽略警告
-ignorewarnings

# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5

# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames

# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses

# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers

# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify

# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose

#指定外部模糊字典
#-obfuscationdictionary dictionary1.txt
#指定class模糊字典
#-classobfuscationdictionary dictionary1.txt
#指定package模糊字典
#-packageobfuscationdictionary dictionary2.txt

# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
#-optimizations !code/simplification/cast,!field/*,!class/merging/*
#混淆时所采用的算法(谷歌推荐算法)
-optimizations !code/simplification/arithmetic,!field,!class/merging,!code/allocation/variable

# 添加支持的jar(引入libs下的所有jar包)
#-libraryjars libs(*.jar)

#将文件来源重命名为“SourceFile”字符串
-renamesourcefileattribute SourceFile

# 保留Annotation不混淆
-keepattributes *Annotation*
#保持注解不被混淆
-keep class * extends java.lang.annotation.Annotation {*;}

# 保持泛型不被混淆
-keepattributes Signature
#保持反射不被混淆
-keepattributes EnclosingMethod
#保持异常不被混淆
-keepattributes Exceptions
#保持内部类不被混淆
-keepattributes Exceptions,InnerClasses
#抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable

# --------------------------------------------默认保留区-------------------------------------#
# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Fragment
-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


# 保留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 ;
}

#保留指定格式的构造方法不被混淆
-keepclasseswithmembers class * {
    public init(android.content.Context, android.util.AttributeSet);
    public init(android.content.Context, android.util.AttributeSet, int);
}

# 保留在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 (android.content.Context);
    public (android.content.Context, android.util.AttributeSet);
    public (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 ;
    !private ;
    !private ;
    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);
}


# 保持 - Library. 保持所有公共和受保护类, 字段, 和方法.
-keep public class * {
    public protected ;
    public protected ;
}

#-------------------------------------删除代码区--------------------------------------#
#删除代码中Log相关的代码
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

# --------------------------------------------项目保留区-------------------------------------#
-keep class com.socket.entity.basemsg.** { *; }
-keep class com.socket.entity.OriginReadData

4. 打包,jar|aar

  4.1 点击第一个红色方框中按钮,选择第一个 Run'...',等待打包完成,如图:

Socket 打包混淆_第1张图片

  4.2 在 Gradle Tasks 中操作

  Android studio 默认是没有打开的,可以去菜单选项 Setting ->  Experimental -> 去掉 Only include test tasks in the Gradle task...选项,-> apply,点击 OK,重启即可,如图:

Socket 打包混淆_第2张图片

  4.3 点击 Android studio 右上角 Gradle 选项,选择 Run Configurations 选项,双击第二个 makeJar 即可,如下图:

Socket 打包混淆_第3张图片

  4.4 配置程序及生成的 jar 和 arr 包目录,如下图:

Socket 打包混淆_第4张图片

5. 完成操作,混淆过后的 jar 包 和 aar 包代码片段,如下图:

Socket 打包混淆_第5张图片

你可能感兴趣的:(Android,Socket,Android,Java,TCP)