android studio 使用gradle打jar包并混淆

Gregg1281 8年前
   <p>昨天准备把写好的代码使用gradle打jar包出来,并打算加混淆。打jar包容易,结果在混淆上走了弯路。</p>    <p>首先打jar包的配置很简单,使用jar的task,具体代码如下:</p>    <pre>  <code class="language-java">task buildJar(type: Jar, dependsOn: ['assembleRelease']) {      destinationDir = file('build/outputs/jar/')      appendix = ""      baseName = ""      version = SDK_VERSION        // manifest信息      def map = ['Version': SDK_VERSION,                 'Gradle': project.gradle.gradleVersion,                 'Vendor': '',                 'Date': new Date().getDateTimeString()          ]      manifest.attributes(map)        from('build/intermediates/classes/release/')      exclude('**/BuildConfig.class')      exclude('**/BuildConfig\$*.class')      exclude('**/R.class')      exclude('**/R\$*.class')      include('**/*.class')  }  </code></pre>    <p>但是发现上面打出来的jar包中的代码没有被混淆,于是加混淆。使用混淆的proguard.gradle.ProGuardTask task时,发现总是报如下错误:</p>    <pre>  <code class="language-java">java.io.IOException: The output jar [....jar] must be specified after an input jar, or it will be empty.  </code></pre>    <p>按照上面的提示, outjars 是写在 injars 后面啊, it will be empty 是提示哪里有问题?以为是 proguard-rules.pro 文件中的配置有问题,结果把文件清空,还是报上面的错误,错误原因不得而知了。在这个问题上耗了很长时间,最终还是没有解决。</p>    <p>突然看到上面的 assembleRelease task想起了平常打APK时,会使用到这个task,打出来的APK会自动混淆。那这个 assembleRelease task就会依赖处理混淆的task,于是查看了输出日志:</p>    <pre>  <code class="language-java">To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html.  Observed package id 'system-images;android-22;google_apis;x86' in inconsistent location 'android-sdk-windows-studio\system-images\addon-google_apis-google-22  \x86' (Expected 'android-sdk-windows-studio\system-images\android-22\google_apis\x86')  Observed package id 'system-images;android-22;google_apis;x86' in inconsistent location 'android-sdk-windows-studio\system-images\addon-google_apis-google-22  \x86' (Expected 'android-sdk-windows-studio\system-images\android-22\google_apis\x86')  Incremental java compilation is an incubating feature.                  :sdk:preBuild UP-TO-DATE                                                                                                                                                  :sdk:extractProguardFiles  :sdk:preReleaseBuild  :sdk:checkReleaseManifest  :sdk:preDebugAndroidTestBuild UP-TO-DATE  :sdk:preDebugBuild UP-TO-DATE  :sdk:preDebugUnitTestBuild UP-TO-DATE  :sdk:preReleaseUnitTestBuild UP-TO-DATE  :sdk:prepareComAndroidSupportAnimatedVectorDrawable2510Library UP-TO-DATE        :sdk:prepareComAndroidSupportAppcompatV72510Library UP-TO-DATE        :sdk:prepareComAndroidSupportSupportCompat2510Library UP-TO-DATE  :sdk:prepareComAndroidSupportSupportCoreUi2510Library UP-TO-DATE  :sdk:prepareComAndroidSupportSupportCoreUtils2510Library UP-TO-DATE  :sdk:prepareComAndroidSupportSupportFragment2510Library UP-TO-DATE        :sdk:prepareComAndroidSupportSupportMediaCompat2510Library UP-TO-DATE        :sdk:prepareComAndroidSupportSupportV42510Library UP-TO-DATE  :sdk:prepareComAndroidSupportSupportVectorDrawable2510Library UP-TO-DATE  :sdk:prepareReleaseDependencies  :sdk:compileReleaseAidl UP-TO-DATE        :sdk:compileReleaseNdk UP-TO-DATE  :sdk:compileLint UP-TO-DATE  :sdk:copyReleaseLint UP-TO-DATE  :sdk:compileReleaseRenderscript UP-TO-DATE  :sdk:generateReleaseBuildConfig                   :sdk:generateReleaseResValues UP-TO-DATE  :sdk:generateReleaseResources UP-TO-DATE  :sdk:mergeReleaseResources UP-TO-DATE        :sdk:processReleaseManifest UP-TO-DATE  :sdk:processReleaseResources UP-TO-DATE        :sdk:generateReleaseSources  :sdk:incrementalReleaseJavaCompilationSafeguard                   :sdk:compileReleaseJavaWithJavac                   :sdk:compileReleaseJavaWithJavac - is not incremental (e.g. outputs have changed, no previous execution, etc.).  注: 某些输入文件使用或覆盖了已过时的 API。                                                                                                                                 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。                                                                                                                     :sdk:extractReleaseAnnotations                     :sdk:mergeReleaseShaders UP-TO-DATE        :sdk:compileReleaseShaders UP-TO-DATE  :sdk:generateReleaseAssets UP-TO-DATE  :sdk:mergeReleaseAssets UP-TO-DATE  :sdk:mergeReleaseProguardFiles UP-TO-DATE  :sdk:packageReleaseRenderscript UP-TO-DATE  :sdk:packageReleaseResources UP-TO-DATE        :sdk:processReleaseJavaRes UP-TO-DATE  :sdk:transformResourcesWithMergeJavaResForRelease UP-TO-DATE  :sdk:transformClassesAndResourcesWithProguardForRelease                   ProGuard, version 5.2.1  Reading input...                                                          Reading program directory [sdk\build\intermediates\classes\release] (filtered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-media-compat\25.1.0\jars\classes.jar] (filtered)    Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-compat\25.1.0\jars\classes.jar] (filtered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-fragment\25.1.0\jars\classes.jar] (filtered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-core-ui\25.1.0\jars\classes.jar] (filtered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\animated-vector-drawable\25.1.0\jars\classes.jar] (filte  red)  Reading library jar [android-sdk-windows-studio\extras\android\m2repository\com\android\support\support-annotations\25.1.0\support-annotations-25.1.0.jar] (f  iltered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-v4\25.1.0\jars\classes.jar] (filtered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-vector-drawable\25.1.0\jars\classes.jar] (filter  ed)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\appcompat-v7\25.1.0\jars\classes.jar] (filtered)  Reading library jar [sdk\build\intermediates\exploded-aar\com.android.support\support-core-utils\25.1.0\jars\classes.jar] (filtered)  Reading library jar [\android-sdk-windows-studio\platforms\android-25\android.jar]  Reading library jar [\android-sdk-windows-studio\platforms\android-25\optional\org.apache.http.legacy.jar]  Note: duplicate definition of library class [android.net.http.HttpResponseCache]  Note: duplicate definition of library class [android.net.http.SslCertificate$DName]  Note: duplicate definition of library class [android.net.http.SslError]  Note: duplicate definition of library class [android.net.http.SslCertificate]  Note: duplicate definition of library class [org.apache.http.params.CoreConnectionPNames]  Note: duplicate definition of library class [org.apache.http.params.HttpConnectionParams]  Note: duplicate definition of library class [org.apache.http.params.HttpParams]  Note: duplicate definition of library class [org.apache.http.conn.scheme.SocketFactory]  Note: duplicate definition of library class [org.apache.http.conn.scheme.LayeredSocketFactory]  Note: duplicate definition of library class [org.apache.http.conn.scheme.HostNameResolver]  Note: duplicate definition of library class [org.apache.http.conn.ConnectTimeoutException]  Note: there were 11 duplicate class definitions.        (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)  Initializing...  Note: you're ignoring all warnings!                                       Ignoring unused library classes...                                          Original number of library classes: 5857    Final number of library classes:    383  Printing kept classes, fields, and methods...  Shrinking...  Printing usage to [sdk\build\outputs\mapping\release\usage.txt]...  Removing unused program classes and class elements...                       Original number of program classes: 52                                    Final number of program classes:    48  Obfuscating...  Printing mapping to [sdk\build\outputs\mapping\release\mapping.txt]...  Writing output...  Preparing output jar [sdk\build\intermediates\transforms\proguard\release\jars\3\3\main.jar]    Copying resources from program directory [sdk\build\intermediates\classes\release] (filtered)  Printing classes to [sdk\build\outputs\mapping\release\dump.txt]...  :sdk:transformClassesAndResourcesWithSyncLibJarsForRelease                   :sdk:mergeReleaseJniLibFolders UP-TO-DATE  :sdk:transformNative_libsWithMergeJniLibsForRelease UP-TO-DATE        :sdk:transformNative_libsWithSyncJniLibsForRelease UP-TO-DATE  :sdk:bundleRelease                   :sdk:compileReleaseSources  :sdk:assembleRelease  :sdk:buildJar                                   BUILD SUCCESSFUL.  </code></pre>    <p>好家伙,被我发现了。其中从 :sdk:transformClassesAndResourcesWithProguardForRelease 这个task就可以看到,下面一堆日志是关于 ProGuard 混淆工具的,最后可以看到:</p>    <pre>  <code class="language-java">Preparing output jar [sdk\build\intermediates\transforms\proguard\release\jars\3\3\main.jar]  </code></pre>    <p>这个 main.jar 就是混淆后的jar包,只不过这个jar还包含了 R 类和 BuildConfig 类的信息,所以将这个信息过滤掉就可以。但问题也来了,jar包都已经打好了,怎么配置混淆?解决方法是只要把jar包当输入就行了,最终配置如下:</p>    <pre>  <code class="language-java">task buildJar(type: Jar, dependsOn: ['assembleRelease']) {      destinationDir = file('build/outputs/jar/')      appendix = "" // SDK的后缀名称      baseName = "" // SDK名称      version = SDK_VERSION // 这个常量是在gradle.properties中配置的        // manifest信息      def map = ['Version': SDK_VERSION,                 'Gradle': project.gradle.gradleVersion,                 'Vendor': '',                 'Date': new Date().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')  }  </code></pre>    <p>OK,任务搞定。</p>    <p> </p>    <p>来自:http://www.jacpy.com/2017/02/28/android-studio-gradle-make-jar-and-proguard.html</p>    <p> </p>