Gradle的学习
Contents
- 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文件

