Android studio利用gradle打jar包并混淆的方法详解
本文主要介绍了Androidstudio利用gradle打jar包并混淆的方法,下面话不多说,来看看详细的介绍吧。
首先打jar包的配置很简单,使用jar的task,可以参考gradle官方文档,具体代码如下:
taskbuildJar(type:Jar,dependsOn:['assembleRelease']){ destinationDir=file('build/outputs/jar/') appendix="" baseName="" version=SDK_VERSION //manifest信息 defmap=['Version':SDK_VERSION, 'Gradle':project.gradle.gradleVersion, 'Vendor':'', 'Date':newDate().getDateTimeString() ] manifest.attributes(map) from('build/intermediates/classes/release/') exclude('**/BuildConfig.class') exclude('**/BuildConfig\$*.class') exclude('**/R.class') exclude('**/R\$*.class') include('**/*.class') }
但是发现上面打出来的jar包中的代码没有被混淆,于是加混淆。使用混淆的proguard.gradle.ProGuardTasktask时,发现总是报如下错误:
java.io.IOException:Theoutputjar[....jar]mustbespecifiedafteraninputjar,oritwillbeempty.
按照上面的提示,outjars是写在injars后面啊,itwillbeempty是提示哪里有问题?以为是proguard-rules.pro文件中的配置有问题,结果把文件清空,还是报上面的错误,错误原因不得而知了。在这个问题上耗了很长时间,最终还是没有解决。
突然看到上面的assembleReleasetask想起了平常打APK时,会使用到这个task,打出来的APK会自动混淆。
那这个assembleReleasetask就会依赖处理混淆的task,于是查看了输出日志:
TohonourtheJVMsettingsforthisbuildanewJVMwillbeforked.Pleaseconsiderusingthedaemon:https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html. Observedpackageid'system-images;android-22;google_apis;x86'ininconsistentlocation'android-sdk-windows-studio\system-images\addon-google_apis-google-22 \x86'(Expected'android-sdk-windows-studio\system-images\android-22\google_apis\x86') Observedpackageid'system-images;android-22;google_apis;x86'ininconsistentlocation'android-sdk-windows-studio\system-images\addon-google_apis-google-22 \x86'(Expected'android-sdk-windows-studio\system-images\android-22\google_apis\x86') Incrementaljavacompilationisanincubatingfeature. :sdk:preBuildUP-TO-DATE :sdk:extractProguardFiles :sdk:preReleaseBuild :sdk:checkReleaseManifest :sdk:preDebugAndroidTestBuildUP-TO-DATE :sdk:preDebugBuildUP-TO-DATE :sdk:preDebugUnitTestBuildUP-TO-DATE :sdk:preReleaseUnitTestBuildUP-TO-DATE :sdk:prepareComAndroidSupportAnimatedVectorDrawable2510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportAppcompatV72510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportCompat2510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportCoreUi2510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportCoreUtils2510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportFragment2510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportMediaCompat2510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportV42510LibraryUP-TO-DATE :sdk:prepareComAndroidSupportSupportVectorDrawable2510LibraryUP-TO-DATE :sdk:prepareReleaseDependencies :sdk:compileReleaseAidlUP-TO-DATE :sdk:compileReleaseNdkUP-TO-DATE :sdk:compileLintUP-TO-DATE :sdk:copyReleaseLintUP-TO-DATE :sdk:compileReleaseRenderscriptUP-TO-DATE :sdk:generateReleaseBuildConfig :sdk:generateReleaseResValuesUP-TO-DATE :sdk:generateReleaseResourcesUP-TO-DATE :sdk:mergeReleaseResourcesUP-TO-DATE :sdk:processReleaseManifestUP-TO-DATE :sdk:processReleaseResourcesUP-TO-DATE :sdk:generateReleaseSources :sdk:incrementalReleaseJavaCompilationSafeguard :sdk:compileReleaseJavaWithJavac :sdk:compileReleaseJavaWithJavac-isnotincremental(e.g.outputshavechanged,nopreviousexecution,etc.). 注:某些输入文件使用或覆盖了已过时的API。 注:有关详细信息,请使用-Xlint:deprecation重新编译。 :sdk:extractReleaseAnnotations :sdk:mergeReleaseShadersUP-TO-DATE :sdk:compileReleaseShadersUP-TO-DATE :sdk:generateReleaseAssetsUP-TO-DATE :sdk:mergeReleaseAssetsUP-TO-DATE :sdk:mergeReleaseProguardFilesUP-TO-DATE :sdk:packageReleaseRenderscriptUP-TO-DATE :sdk:packageReleaseResourcesUP-TO-DATE :sdk:processReleaseJavaResUP-TO-DATE :sdk:transformResourcesWithMergeJavaResForReleaseUP-TO-DATE :sdk:transformClassesAndResourcesWithProguardForRelease ProGuard,version5.2.1 Readinginput... Readingprogramdirectory[sdk\build\intermediates\classes\release](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-media-compat\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-compat\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-fragment\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-core-ui\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\animated-vector-drawable\25.1.0\jars\classes.jar](filte red) Readinglibraryjar[android-sdk-windows-studio\extras\android\m2repository\com\android\support\support-annotations\25.1.0\support-annotations-25.1.0.jar](f iltered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-v4\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-vector-drawable\25.1.0\jars\classes.jar](filter ed) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\appcompat-v7\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[sdk\build\intermediates\exploded-aar\com.android.support\support-core-utils\25.1.0\jars\classes.jar](filtered) Readinglibraryjar[\android-sdk-windows-studio\platforms\android-25\android.jar] Readinglibraryjar[\android-sdk-windows-studio\platforms\android-25\optional\org.apache.http.legacy.jar] Note:duplicatedefinitionoflibraryclass[android.net.http.HttpResponseCache] Note:duplicatedefinitionoflibraryclass[android.net.http.SslCertificate$DName] Note:duplicatedefinitionoflibraryclass[android.net.http.SslError] Note:duplicatedefinitionoflibraryclass[android.net.http.SslCertificate] Note:duplicatedefinitionoflibraryclass[org.apache.http.params.CoreConnectionPNames] Note:duplicatedefinitionoflibraryclass[org.apache.http.params.HttpConnectionParams] Note:duplicatedefinitionoflibraryclass[org.apache.http.params.HttpParams] Note:duplicatedefinitionoflibraryclass[org.apache.http.conn.scheme.SocketFactory] Note:duplicatedefinitionoflibraryclass[org.apache.http.conn.scheme.LayeredSocketFactory] Note:duplicatedefinitionoflibraryclass[org.apache.http.conn.scheme.HostNameResolver] Note:duplicatedefinitionoflibraryclass[org.apache.http.conn.ConnectTimeoutException] Note:therewere11duplicateclassdefinitions. (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass) Initializing... Note:you'reignoringallwarnings! Ignoringunusedlibraryclasses... Originalnumberoflibraryclasses:5857 Finalnumberoflibraryclasses:383 Printingkeptclasses,fields,andmethods... Shrinking... Printingusageto[sdk\build\outputs\mapping\release\usage.txt]... Removingunusedprogramclassesandclasselements... Originalnumberofprogramclasses:52 Finalnumberofprogramclasses:48 Obfuscating... Printingmappingto[sdk\build\outputs\mapping\release\mapping.txt]... Writingoutput... Preparingoutputjar[sdk\build\intermediates\transforms\proguard\release\jars\3\3\main.jar] Copyingresourcesfromprogramdirectory[sdk\build\intermediates\classes\release](filtered) Printingclassesto[sdk\build\outputs\mapping\release\dump.txt]... :sdk:transformClassesAndResourcesWithSyncLibJarsForRelease :sdk:mergeReleaseJniLibFoldersUP-TO-DATE :sdk:transformNative_libsWithMergeJniLibsForReleaseUP-TO-DATE :sdk:transformNative_libsWithSyncJniLibsForReleaseUP-TO-DATE :sdk:bundleRelease :sdk:compileReleaseSources :sdk:assembleRelease :sdk:buildJar BUILDSUCCESSFUL.
好家伙,被我发现了。其中从:sdk:transformClassesAndResourcesWithProguardForRelease这个task就可以看到,下面一堆日志是关于ProGuard混淆工具的,最后可以看到:
Preparingoutputjar[sdk\build\intermediates\transforms\proguard\release\jars\3\3\main.jar]
这个main.jar就是混淆后的jar包,只不过这个jar还包含了R类和BuildConfig类的信息,所以将这个信息过滤掉就可以。但问题也来了,jar包都已经打好了,怎么配置混淆?解决方法是只要把jar包当输入就行了,最终配置如下:
taskbuildJar(type:Jar,dependsOn:['assembleRelease']){ destinationDir=file('build/outputs/jar/') appendix=""//SDK的后缀名称 baseName=""//SDK名称 version=SDK_VERSION//这个常量是在gradle.properties中配置的 //manifest信息 defmap=['Version':SDK_VERSION, 'Gradle':project.gradle.gradleVersion, 'Vendor':'', 'Date':newDate().getDateTimeString() ] manifest.attributes(map) from(project.zipTree('build/intermediates/transforms/proguard/release/jars/3/3/main.jar')) exclude('**/BuildConfig.class') exclude('**/BuildConfig\$*.class') exclude('**/R.class') exclude('**/R\$*.class') include('**/*.class') }
总结
OK,任务搞定。以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。