Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> AndroidStudio生成自定義的混淆jar包

AndroidStudio生成自定義的混淆jar包

編輯:關於Android編程

今天我就給大家交給大家studio如何生成帶混淆的jar包,其實和上一篇文章差不多,只不過是多了一些混淆文件。首先我們先新建一個module(我把它新建成了一個library)。在用AndroidStudio生成混淆jar的時候也百度過很多文章,但是大多都沒有用。

\

 

為了一會給大家演示混淆後的效果,這裡創建了幾個文件MainActivity、UserBean、LogUtil詳細見demo

\

 

然後再在module的gradle中配置如下

 

def SDK_BASENAME = "mylibs";
def SDK_VERSION = "_v1.0";
def sdkDestinationPath = "build/outputs/jar/";
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文件

\

 

全部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 ;
}

# 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 ;
}

# 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 ;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep ;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep (...);
}

#################################以下是自己添加的混淆協議###################################
#下面代碼中的路徑配置,你要修改成與你相對應的路徑

#引入依賴包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

-keep class com.lcw.mylibrary.LogUtil{
    public *;
}

最後的我是禁止混淆LogUtil工具類,以便形成對比。根據混淆配置是AndroidStudio默認不混淆MainActivity,我們在也不混淆LogUtil。

 

 

然後你就在Terminal中輸入

 

gradlew makeJar

 

或者是雙擊 makeJar

\

 

\

 

我們將生成的jar包解壓可以看到MainActivity和LogUtil沒有被混淆,這就說明成功了。

\

 


注意:有可能你在執行命令的時候遇到下面類似的錯誤提示classes.jar is specified twice,說我們的classes.jar 指定了兩次

\

解決方式:在proguard-rules.pro中將其注釋掉即可

\

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved