1、混淆打包配置
在Module中的build.gradle中添加task,具体如下:
- 方法一:
task buildSdkJar(type: Jar, dependsOn: ['build']) { delete 'build/libs/speechsdk.jar' delete 'build/libs/speechsdkp.jar' //导出的jar文件名称 archiveName = 'speechsdkp.jar' //从哪个目录打包jar from('build/intermediates/classes/debug') //导出的jar文件的存放目录(未指定则默认存放在build/libs下) destinationDir = file('build/libs') //去掉不要的类(AndroidManifest.xml中package包名) exclude('com/auto/xxx/BuildConfig.class') exclude('com/auto/xxx/BuildConfig\$*.class') exclude('**/R.class') exclude('**/R\$*.class') //需要打包的类(相应的类位于的包) include('com/auto/xxx/**/*.class') from fileTree(dir: 'src/main',includes: ['assets/**']) include('assets/**') // 若是有.so包,需要include,引用jar之处需要在libs下copy .so文件,否则找不到 include('libs/armeabi-v7a/**') include('libs/x86_64/**') } task buildProguardJar(dependsOn: ['buildSdkJar'], type: proguard.gradle.ProGuardTask) { //输入 jar injars 'speechsdkp.jar' //输出 jar outjars 'build/libs/speechsdk.jar' configuration 'proguard-rules.pro' }
- 方法二:
task buildProguardJar(type: proguard.gradle.ProGuardTask) { //输入 jar injars 'build/intermediates/bundles/release/classes.jar' //输出 jar outjars 'build/libs/speechsdk.jar' configuration 'proguard-rules.pro' }
上述两种方法都可行,方法一是更具有灵活性,但容易出错,方法二,简单方便。两种方法都是通过Gradle -> Module名 - >Tasks ->other ->buildProguardJar(任务名)进行打包。
2、Module处理
Module的build.gradle中的dependencies依赖比较多,如下,有.so、jar 、module 和jcenter中的包。而util模块中也依赖很多,或者存在交叉处。
sourceSets {
main {
// libs中有.so文件,需配置
jniLibs.srcDirs = ['libs']
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
// 包含其他的module ->最好将该依赖的module打包成Jar,然后去掉该项
compile project(path: ':util')
compile 'com.squareup.retrofit2:converter-gson:2.4.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
}
最好改成如下配置:
- 首先将依赖的module单独打成Jar,同时将其依赖的jar都放到libs中,dependencies中去掉该项
- 将compile改成provided,最好不要选用compile,因为用compile时,可能会重复包含某个jar,造成多个.dex的错误。
- 点击buildProguardJar任务进行打包
上述的做法,将每个module单独打成jar , jar中没有包含其他的内容,最后需要将jar 协调module中libs中的包全部提供给需要之处。
dependencies {
provided fileTree(include: ['*.jar'], dir: 'libs')
provided 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
provided 'com.squareup.retrofit2:converter-gson:2.4.0'
provided 'com.squareup.okhttp3:logging-interceptor:3.4.1'
}
provided与compile的区别:
- compile是从repository(默认是jCenter())里下载一个依赖包进行编译并打包,compile project是将另一个module(等同eclipse中的library库文件)进行编译并打包
- provided只提供编译支持,但是不会写入apk。比如我在编译的时候对某一个jar文件有依赖,但是最终打包apk文件时,我不想把这个jar文件放进去,可以用这个命令。
- compile files是从本地的libs目录下寻找picasso-2.4.0.jar这个文件进行编译并打包。类似的命令有`compile fileTree(dir: 'libs', include: '*.jar')`意思是将libs目录下所有jar文件进行编译并打包。
3、Module资源问题
方法一:生成arr
Android Studio可以打包生成arr,包含资源文件,具体路径:build->outputs->arr->xxxrelease.arr,调用之处的build.gradle的,在android下配置
repositories{
flatDir{
dirs'libs'
}
}
在dependencies中增加
compile(name:'quwanma',ext:'aar')
但arr具体不兼容性,只能Android平台使用。
方法二:利用反射方法获取资源,把资源文件放入调用之处的module中,也不会报错了。
// 反射获取layout
this.getResources().getIdentifier("layout_test", "layout", this.getPackageName());
// 反射获取字符串
this.getResources().getIdentifier("name", "string", this.getPackageName());
// 反射获取drawable
this.getResources().getIdentifier("bjmgf", "drawable", getPackageName());
4、混淆遇到的问题
内部类混淆问题,项目中遇到new Runnable时,里面的run方法被混淆优化掉了,代码执行报错,代码中用到Runnable之处很多,一时找不到很好的解决方案。通过不混淆 java.lang.xxx,不混淆java.lang.Runnable接口以及其实现类都不行,不得以通过不混淆相应包下内部类。各位解决了该问题,请告知我。
// 包下很多此种用法
-keep class com.xfz.auto.xxx.**$*{*;}
// 单独不混淆某个类的内部类
-keep class com.xfz.auto.xxx.$*{*;}