Android Studio 打包混淆(二)

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.$*{*;}


 

     

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值