Android -- 混淆

混淆本質

把原來有具體含義的類名,變量名,方法名,修改爲讓人看不懂的名字,例如方法名getxx混淆爲方法名a。javascript

Android Studio中的混淆

Android工程目錄下有個文件,proguard-rules.pro,內容是:html

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /usr/local/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

proguard-rules.pro是AS中專用的proguard配置文件,其實只是後綴名不一樣,與Eclipse中的proguard-project.txt是同樣的,配置規則相同,後面會詳細提到。 java

在gradle中處理混淆的語句是:android

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

這個proguard-android.txt是sdk中groguard默認的文件,而文件是存在於sdk/tools/proguard/中:web

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-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
-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
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-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
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-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.**

將runProguard設置爲true,gradle混淆編譯:apache

./gradlew assembleRelease

語法

# -------------------------------------
# android 原始混淆模板
# -------------------------------------

# ----------------------------------
#  經過指定數量的優化能執行
#  -optimizationpasses n
# ----------------------------------
-optimizationpasses 5

# ----------------------------------
#   混淆時不會產生形形色色的類名 
#   -dontusemixedcaseclassnames
# ----------------------------------
#-dontusemixedcaseclassnames
# ----------------------------------
#      指定不去忽略非公共的庫類
#  -dontskipnonpubliclibraryclasses
# ----------------------------------
#-dontskipnonpubliclibraryclasses

# ----------------------------------
#       不預校驗
#    -dontpreverify
# ----------------------------------
# -dontpreverify

# ----------------------------------
#      輸出生成信息
#       -verbose
# ----------------------------------
-verbose

# ----------------------------------
#        優化選項
#   optimizations  {optimization_filter} 
# ----------------------------------
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}
# -----------------
# modify 修改合併
# -----------------
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#--------------------------
# 保護類型   -keepattributes 說明
# Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, 
# LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, 
# RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, and AnnotationDefault
# --------------------
-keepattributes **
-libraryjars <java.home>/lib/rt.jar

# ----------------------
#  不壓縮指定的文件
#  -dontshrink
# ----------------------
-dontshrink

# ----------------------
#  不優化指定的文件
#  -dontoptimize
# -----------------------
-dontoptimize

# -----------------------
#  不混淆指定的文件
#  -dontobfuscate
# -----------------------

# ----- 混淆包路徑 -------
-repackageclasses ''
-flattenpackagehierarchy ''
-target 1.6

# -------- 如下是使用了 roboguice-1.1.2.jar 以及 guice-2.0-no_app.jar 功能須要保護的字段及類相關 --------
-keep class com.google.inject.Binder
-keepclassmembers class * {
    @com.google.inject.Inject <init>(...);
}
-keepclassmembers class * {
    void *(**On*Event); 
}
-keepclassmembers class **.R$* {
    public static <fields>;
}

# ------ 編譯時須要用到的 jar 包
-libraryjars D:/dev_rc/android-sdk-windows/add-ons/addon_google_apis_google_inc_11/libs/maps.jar

# ------ 保護 谷歌第三方 jar 包,界面特效 ----------
-keep class android.support.v4.**
-dontwarn android.support.v4.**

# ------ 保護百度地址jar包 --------
-keep class com.baidu.mapapi.** { *; }
-dontwarn com.baidu.mapapi.**

# --- 打包時忽略如下類的警告 --
-dontwarn com.classpackage.AA

#-keepnames class * implements java.io.Serializable
# ---------保護全部實體中的字段名稱----------
-keepclassmembers class * implements java.io.Serializable {
    <fields>;
}

# --------- 保護類中的全部方法名 ------------
-keepclassmembers class * {
    public <methods>;
}

更多可查看:http://proguard.sourceforge.net/index.html#manual/examples.htmljson

-keep {Modifier} {class_specification} 保護指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification} 保護指定類的成員,若是此類受到保護他們會保護的更好
-keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是全部指定的類和類成員是要存在。
-keepnames {class_specification} 保護指定的類和類的成員的名稱(若是他們不會壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護指定的類的成員的名稱(若是他們不會壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護指定的類和類的成員的名稱,若是全部指定的類成員出席(在壓縮步驟以後)
-printseeds {filename} 列出類和類的成員-keep選項的清單,標準輸出到給定的文件

#壓縮

-dontshrink 不壓縮輸入的類文件
-printusage {filename}
-whyareyoukeeping {class_specification}

#優化

-dontoptimize 不優化輸入的類文件
-assumenosideeffects {class_specification} 優化時假設指定的方法,沒有任何反作用
-allowaccessmodification 優化時容許訪問並修改有修飾符的類和類的成員

#混淆

-dontobfuscate 不混淆輸入的類文件
-obfuscationdictionary {filename} 使用給定文件中的關鍵字做爲要混淆方法的名稱
-overloadaggressively 混淆時應用侵入式重載
-useuniqueclassmembernames 肯定統一的混淆類的成員名稱來增長混淆
-flattenpackagehierarchy {package_name} 從新包裝全部重命名的包並放在給定的單一包中
-repackageclass {package_name} 從新包裝全部重命名的類文件中放在給定的單一包中
-dontusemixedcaseclassnames 混淆時不會產生形形色色的類名
-keepattributes {attribute_name,...} 保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string} 設置源文件中給定的字符串常量

後面的文件名,類名,或者包名等可使用佔位符代替windows

?表示一個字符api

能夠匹配多個字符,可是若是是一個類,不會匹配其前面的包*] 能夠匹配多個字符,會匹配前面的包名。android-studio

在android中在android Manifest文件中的activity,service,provider, receviter,等都不能進行混淆。一些在xml中配置的view也不能進行混淆,android提供的默認配置中都有。

混淆的輸出文件及用處

混淆以後,會給咱們輸出一些文件,在gradle方式下是在/build/proguard/目錄下,ant是在/bin/proguard目錄,eclipse構建在/proguard目錄像。

分別有如下文件:

+ dump.txt 描述apk文件中全部類文件間的內部結構。

+ mapping.txt 列出了原始的類,方法,和字段名與混淆後代碼之間的映射。

+ seeds.txt 列出了未被混淆的類和成員

+ usage.txt 列出了從apk中刪除的代碼

當咱們發佈的release版本的程序出現bug時,能夠經過以上文件(特別時mapping.txt)文件找到錯誤原始的位置,進行bug修改。同時,可能一開始的proguard配置有錯誤,也能夠經過錯誤日誌,根據這些文件,找到哪些文件不該該混淆,從而修改proguard的配置。

一些經常使用包的混淆配置

sharesdk混淆注意

-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}

Gson混淆配置

-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.idea.fifaalarmclock.entity.***
-keep class com.google.gson.stream.** { *; }

Umeng sdk混淆配置

-keepclassmembers class * {
   public <init>(org.json.JSONObject);
}

-keep class com.umeng.**

-keep public class com.idea.fifaalarmclock.app.R$*{
    public static final int *;
}

-keep public class com.umeng.fb.ui.ThreadView {
}

-dontwarn com.umeng.**

-dontwarn org.apache.commons.**

-keep public class * extends com.umeng.**

-keep class com.umeng.** {*; }

我是天王蓋地虎的分割線

相關文章
相關標籤/搜索