时间过得好快,一转眼进公司就这么久了。论语:温故而知新可以为师矣。回顾一下进公司以后学了的东西吧。
AS:
Git:
GitHub:
aar:
Maven:
gradle:
混淆机制
这个其实很简单
#project的根目录-->这里写死吧,因为写根目录的话它指的是module的根目录而不是project的根目录,或许我不会更好的方法
aar.path=C:/TongsonCode/GitHub/hello-maven/
#版本name&&release
APP_VERSION_NAME=1.0.0
#groupId
PUBLISH_GROUP_ID = pr.Tongson
#artifactId
PUBLISH_ARTIFACT_ID = demo
//申请maven插件
apply plugin: 'maven'
// ext is a gradle closure allowing the declaration of global properties
ext {
PUBLISH_GROUP_ID = "${PUBLISH_GROUP_ID}"
PUBLISH_ARTIFACT_ID = "${PUBLISH_ARTIFACT_ID}"
PUBLISH_VERSION = android.defaultConfig.versionName
}
//上传文档配置
uploadArchives {
repositories.mavenDeployer {
def deployPath = file(getProperty('aar.path'))
repository(url: "file://${deployPath.absolutePath}")
pom.project {
groupId project.PUBLISH_GROUP_ID
artifactId project.PUBLISH_ARTIFACT_ID
version project.PUBLISH_VERSION
}
}
}
这个其实更特么简单了!
//依赖中添加
dependencies {
//compile 'groupId:artifactId:release'
compile 'pr.Tongson:demo:1.0.0'
}
//仓库中添加
repositories {
jcenter()
maven {
// https://github.com/gepriniusce/hello-maven
// maven的github链接/分支
// url "https://raw.githubusercontent.com/gepriniusce/hello-maven/master"
url "https://raw.githubusercontent.com/gepriniusce/hello-maven/master"
}
}
https://github.com/gepriniusce/hello-world
https://github.com/gepriniusce/hello-maven
buildTypes {
release {
//是否开启小功能
minifyEnabled false
//混淆器-->文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Keep用来保留Java的元素不进行混淆. keep有很多变种,他们一般都是
-keep
-keepclassmembers
-keepclasseswithmembers
dontwarn是一个和keep可以说是形影不离,尤其是处理引入的library时.
-dontwarn
反射中使用的元素
GSON的序列化与反序列化
枚举也不要混淆
四大组件不建议混淆
注解不能混淆
其他不该混淆的
-include {filename} 从给定的文件中读取配置参数
-basedirectory {directoryname} 指定基础目录为以后相对的档案名称
-injars {class_path} 指定要处理的应用程序jar,war,ear和目录
-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称
-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。
保留选项
-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}
-dontwarn 如果有警告也不终止
-whyareyoukeeping {class_specification}
优化
-dontoptimize 不优化输入的类文件
-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用
-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
混淆
-dontobfuscate 不混淆输入的类文件
-printmapping {filename}
-applymapping {filename} 重用映射增加混淆
-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称
-overloadaggressively 混淆时应用侵入式重载
-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中
-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
-keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and
InnerClasses.
-renamesourcefileattribute {string} 设置源文件中给定的字符串常量
1) Proguard returned with error code 1. See console
更新proguard版本
android-support-v4 不进行混淆
添加缺少相应的库
2) 使用gson包解析数据时,出现 missing type parameter 异常
在 proguard-project.txt 中添加
-dontobfuscate
-dontoptimize
在 proguard-project.txt 中添加
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.* { ; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.* { ; }
3) 类型转换错误
在 proguard-project.txt 中添加
-keepattributes Signature
4) 空指针异常
混淆过滤掉相关类与方法
5) java.lang.reflect.UndeclaredThrowableException
-keep interface com.dev.impl.**
6) Error: Unable to access jarfile ..libproguard.jar
路径问题
7) java.lang.NoSuchMethodError
这也是最常见的问题,因为找不到相关方法,方法被混淆了,混淆过滤掉相关方法便可。
gradle配置中
configurations.all {
resolutionStrategy.cacheChangingModulesFor 10, 'seconds'
}
参考:
http://www.androidchina.net/6295.html
http://android.jobbole.com/84057/
在module中的build.gradle中android {里}
// If you need to add more flavors, consider using flavor dimensions.
productFlavors {
mock {
applicationIdSuffix = ".mock"
}
prod {
}
}
在module中的src文件夹里面创建目录:
根据加上对应name的文件夹,然后在里面做修改就好了
其实这里
mock ==main
prod ==main
然后渠道文件夹里的内容把main里的内容覆盖而已。
而打包机制这个就要对gradle Task的理解了。