Contents
  1. 1. ProGuard配置
  • build.gradle(Project) ( 可以查看Gradle的版本 )
  • build.gradle(Module) ( 配置模块的参数 )
apply plugin: 'com.android.application' //声明该工程是android工程
android{

    signingConfigs {//获取build.properties里的密码常量,需要在buildeTypes引用
        releaseConfig {
            storeFile file(STORE_FILE)
            storePassword STORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword KEY_PASSWORD
        }
    }

    //安卓构建过程需要配置的参数
    compileSdkVersion 21//编译版本
    buildToolsVersion "21.1.2"//buildtool版本
    defaultConfig {
      //默认配置,会同时应用到debug和release版本上
      applicationId "com.taobao.startupanim"//程序包名
      minSdkVersion 15
      targetSdkVersion 21
      versionCode 1
      versionName "1.0"
  }

       buildTypes { //这里面可以配置不同版本的一些参数,比如混淆、签名配置等

    release {//release版本

        signingConfig signingConfigs.release //用keystore打包

        shrinkResources true //去掉无用的resourse文件

        minifyEnabled false//是否开启混淆

        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//加载混淆文件,开启混淆没有这句会报错
    }

    debug {

    }
  }

    lintOptions {//移除lint检查的error
        abortOnError false
    }
}

dependencies {
    //模块依赖


}    
  • Mapping(/project/app/build/outputs/mapping/)

    • dump.txt 描述apk文件中所有类文件间的内部结构。
    • mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。
    • seeds.txt 列出了未被混淆的类和成员
    • usage.txt 列出了从apk中删除的代码

  • settings.gradle (声明加入工程的module)

    include ':app',':module-b' //示例
    
  • gradle.properties (保存应用签名密码等常量)

    STORE_FILE = keystore(jks)的路径
    STORE_PASSWORD = KEYSTORE密码
    KEY_ALIAS = 别名
    KEY_PASSWORD = KEYSTORE密码
    
    • 在build.gradle的android标签下引用

      signingConfigs {  //获取应用签名的密码常量,需要在buildTypes里调用
          releaseConfig { 
              storeFile file(STORE_FILE)
              storePassword STORE_PASSWORD
              keyAlias KEY_ALIAS
              keyPassword KEY_PASSWORD
          }
      }
      

ProGuard配置

生成mapping文件
不能混淆的代码
系统接口
Jni接口
其他如四大组件、View等
第三方类库如android-support

保留选项(配置不进行处理的内容)

-keep {Modifier} {class_specification} 保护指定的类文件和类的成员 
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 
-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 
-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩

-dontshrink 不压缩输入的类文件 
-printusage {filename} 
-whyareyoukeeping {class_specification}

优化

-dontoptimize 不优化输入的类文件 
-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用 
-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆

-dontobfuscate 不混淆输入的类文件 
-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称 
-overloadaggressively 混淆时应用侵入式重载 
-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆 
-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中 
-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中 
-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名 
-keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable,SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 
-renamesourcefileattribute {string} 设置源文件中给定的字符串常量

后面的文件名,类名,或者包名等可以使用占位符代替 
?表示一个字符

可以匹配多个字符,但是如果是一个类,不会匹配其前面的包名 
可以匹配多个字符,会匹配前面的包名。  
在android中在android Manifest文件中的activity,service,provider, receviter,等都不能进行混淆。一些在xml中配置的view也不能进行混淆,android提供的默认配置中都有
  • 示例:

    sharesdk混淆注意
    
    -keep class android.net.http.SslError
    -keep class android.webkit.**{*;}
    -keep class cn.sharesdk.**{*;}
    -keep class com.sina.**{*;}
    -keep class m.framework.**{*;}
    
  • 总结:

    • 报错

      Unable to compute hash of /../AndroidStudioProjects/../classes.jar错误
      说明在打包混淆的时候需要keep一些文件,让他们不要被混淆。
      
      解决办法:
      加上-dontskipnonpubliclibraryclasses #不混淆第三方库
      
    • 没生成mapping

      minifyEnable true 开启混淆模式
      配置-ignorewarnings #生成mapping文件
      

参考
参考
参考

Contents
  1. 1. ProGuard配置