AndroidStudio如何生成混淆jar包


首先把module設置為library

修改對應module下面的build.gradle,把apply plugin后面的值修改為1apply plugin: 'com.android.library'並且刪除
applicationId 
 
apply plugin: 'com.android.library'//apply plugin: 'com.android.application'android {    compileSdkVersion 23    buildToolsVersion "23.0.3"    defaultConfig {//        applicationId "com.east.xg.usbdata"        minSdkVersion 15        targetSdkVersion 23        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.3.0'    compile files('libs/xUtils-2.6.14.jar')    compile files('libs/Bughd_android_sdk_v1.3.7.jar')}task makeJar(type: Copy) {    delete 'build/libs/mysdk.jar'    from('build/intermediates/bundles/release/')    into('build/libs/')    include('classes.jar')    rename ('classes.jar', 'mysdk.jar')}makeJar.dependsOn(build)//在終端執行生成JAR包// gradlew makeJar
Android Studio中對於library類型的Moudle,默認打出來的是AAR包, 
但有時候我們的SDK還需要共享給一些其他eclipse的項目使用,這樣我們就需要輸出JAR包, 
可以通過在Moudle中的build.gradle加入task來實現
task makeJar(type: Copy) {    delete 'build/libs/mysdk.jar' from('build/intermediates/bundles/release/')    into('build/libs/')    include('classes.jar')    rename ('classes.jar', 'mysdk.jar')}makeJar.dependsOn(build)//在終端執行生成JAR包// gradlew makeJar


在終端執行生成JAR包

gradview makeJar

在以下目錄就可以找到我們生成的JAR包

 
聲明:打出來的jar只有源代碼的.class 文件,不包含資源文件

然后再在module的gradle中配置如下
 
def SDK_BASENAME = "hibotlibs";def SDK_VERSION = "_v1.0";def sdkDestinationPath = "build/libs/";def zipFile = file('build/intermediates/bundles/release/classes.jar')task deleteBuild(type: Delete) {    delete sdkDestinationPath + SDK_BASENAME + SDK_VERSION + ".jar"}task makeJar(type: Jar) {    from zipTree(zipFile)    from fileTree(dir: 'src/main', includes: ['assets/**']) // 打包assets目錄下的所有文件    baseName = SDK_BASENAME + SDK_VERSION    destinationDir = file(sdkDestinationPath)}makeJar.dependsOn(deleteBuild, build)

 

  上面的配置具體我就不講解他們是什么意思了。

     因為我們是自己手動混淆了,所以要指定混淆規則,然后打開module的proguard-rules.pro文件,將AndroidStudio默認的混淆文件復制、粘貼到proguard-rules.pro中。

全部proguard-rules.pro配置如下
###########################以下是AndroidStudio自帶的混淆配置協議################################ 表示混淆時不使用大小寫混合類名-dontusemixedcaseclassnames# 表示不跳過library中的非public的類-dontskipnonpubliclibraryclasses# 打印混淆的詳細信息-verbose# Optimization is turned off by default. Dex does not like code run# through the ProGuard optimize and preverify steps (and performs some# of these optimizations on its own).-dontoptimize# 表示不進行校驗,這個校驗作用 在java平台上的-dontpreverify# Note that if you want to enable optimization, you cannot just# include optimization flags in your own project configuration file;# instead you will need to point to the# "proguard-android-optimize.txt" file instead of this one from your# project.properties file.#使用注解需要添加-keepattributes *Annotation*-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native#指定不混淆所有的JNI方法-keepclasseswithmembernames class * {    native <methods>;}# keep setters in Views so that animations can still work.# see http://proguard.sourceforge.net/manual/examples.html#beans#所有View的子類及其子類的get、set方法都不進行混淆-keepclassmembers public class * extends android.view.View {   void set*(***);   *** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick# 不混淆Activity中參數類型為View的所有方法-keepclassmembers class * extends android.app.Activity {   public void *(android.view.View);}# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations# 不混淆Enum類型的指定方法-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}# 不混淆Parcelable和它的子類,還有Creator成員變量-keepclassmembers class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator CREATOR;}# 不混淆R類里及其所有內部static類中的所有static變量字段-keepclassmembers class **.R$* {    public static <fields>;}# The support library contains references to newer platform versions.# Don't warn about those in case this app is linking against an older# platform version.  We know about them, and they are safe.# 不提示兼容庫的錯誤警告-dontwarn android.support.**# Understand the @Keep support annotation.-keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {*;}-keepclasseswithmembers class * {    @android.support.annotation.Keep <methods>;}-keepclasseswithmembers class * {    @android.support.annotation.Keep <fields>;}-keepclasseswithmembers class * {    @android.support.annotation.Keep <init>(...);}#################################以下是自己添加的混淆協議####################################下面代碼中的路徑配置,你要修改成與你相對應的路徑#引入依賴包rt.jar(jdk路徑)(注意:如在makeJar的時候提示指定了兩次,可以將其注釋掉)#-libraryjars 'C:\Android_Develop_Tools\Java\jdk1.8.0_101\jre\lib\rt.jar'#引入依賴包android.jar(android SDK路徑)(注意:如在makeJar的時候提示指定了兩次,可以將其注釋掉)#-libraryjars 'C:\Android_Develop_Tools\sdk\platforms\android-23\android.jar'#如果用到Appcompat包,需要引入(注意:如在makeJar的時候提示指定了兩次,可以將其注釋掉)#-libraryjars 'D:\AndroidStudioProjects\MyApplication\mylibrary\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.4.0\jars\classes.jar'#-libraryjars 'D:\AndroidStudioProjects\MyApplication\mylibrary\build\intermediates\exploded-aar\com.android.support\support-v4\23.4.0\jars\classes.jar'#忽略警告-ignorewarnings#保證是獨立的jar,沒有任何項目引用,如果不寫就會認為我們所有的代碼是無用的,從而把所有的代碼壓縮掉,導出一個空的jar-dontshrink#保護泛型-keepattributes Signature#下面的Test類將不會被混淆,這樣的類是需要被jar包使用者直接調用的-keep class com.example.mylibrary.usbSendType.ClassicType{    public *;}-keep class com.example.mylibrary.usbSendType.EleType{    public *;}-keep class com.example.mylibrary.usbSendType.LightType{    public *;}-keep class com.example.mylibrary.usbSendType.MotorPType{    public *;}
然后你就在Terminal中輸入
gradlew makeJar
或者是雙擊 makeJar
我們將生成的jar包解壓可以看到ClassicType和EleType、LightType、MotorPType沒有被混淆,這就說明成功了。
生成自定義的混淆jar包,也可以參考
http://blog.csdn.net/lsyz0021/article/details/53107595

 

當然我們不希望自己提供的jar 也給其他開發者帶來同樣的困擾,所以我們期待可以有選擇性的選擇需要打包的class,排除不需要的class ,如BuildConfig.class、R.class 等

task makeJar(type: Jar) {    from file('build/intermediates/classes/release')    archiveName = 'sdk.jar'    destinationDir = file('build/libs')    //過濾不需要的class    exclude "**/**/BuildConfig.class"    exclude "**/**/BuildConfig\$*.class"    exclude "**/R.class"    exclude "**/R\$*.class"    //指定打包的class    include "com/test/**/*.class"}makeJar.dependsOn(build)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

通過上述腳本就可以實現選擇性的打包,關於打包時的混淆配置等,感興趣的朋友可以參考: 
http://my.oschina.net/u/2531612/blog/591366?fromerr=Xd1Kd7dY


 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com