android項目對apk進(jìn)行混淆

????混淆apk是一個很基礎(chǔ)的工作赦肃,博客上也有一堆介紹溅蛉,本文提供一下這類工作的解決思路。在安卓源碼下面和android studio里面的做法差異不大他宛,本文以android源碼舉例船侧。
????首先在對應(yīng)mk文件里面添加proguard enabled的語句,系統(tǒng)有一個自帶的build/core/proguard.flags,默認(rèn)是使用這個文件,而且一般項目默認(rèn)是關(guān)閉的厅各,這也是有原因的镜撩。因為這里的proguard.flags是沒有針對app的配置的,使用默認(rèn)的混淆讯检,app很有可能就不工作了琐鲁。

LOCAL_PROGUARD_ENABLED := obfuscation full
LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags 

????添加了mk文件修改之后,在Android.mk同級根目錄創(chuàng)建本app自有的proguard.flags人灼。新增內(nèi)容如下围段,這里需要注意,網(wǎng)上很多demo投放,基本分為三部分奈泪,一部是保留app基礎(chǔ)功能部分的內(nèi)容不混淆;2是保持app對外接口,例如get灸芳、set涝桅、isxx、AIDL烙样、public冯遂、native層的接口或者類;3.是第三方j(luò)ar包或接口≮嘶瘢混淆的基本原理就是將上訴類或接口進(jìn)行統(tǒng)一簡單字母的替換蛤肌,如果改變了這些對外接口的名字壁却,很有可能被別人使用的時候就找不到對應(yīng)哦接口

#第一部分是基礎(chǔ)部分,可照搬的配置
#obfuscate nonpubulic element
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers   

#ignore native method 這個挺重要的裸准,保留native方法不被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

#ignore support.v4/v7 support包不混淆
-keep class android.support.** { *; }
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.** { *; }
-keep public class * extends android.support.v7.**
-keep interface android.support.v7.app.** { *; }
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.**    # ignore warning

#ignore basic setting 四大組件什么的不混淆展东,事實上,基礎(chǔ)部分混淆意義不大
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.app.Instrumentation
-keep public class * extends android.media.AudioManager
-keep public class * extends android.view.KeyEvent
-keep public class * extends android.content.Intent
-keep public class * extends android.content.IntentFilter
-keep public class * extends android.content.Context
-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 * extends android.bluetooth.**
-keep public class * extends android.os.**



#keep annotation not obfuscate
-keep class * extends java.lang.annotation.Annotation {*;}

#keep JSON reflection
-keepattributes Signature

#keep line number when exception 這個也挺重要的炒俱,混淆的時候保留異常行號盐肃,方便debug
-keepattributes SourceFile,LineNumberTable

#obfuscate non public class
-dontskipnonpubliclibraryclasses

-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

#resource
-keepclassmembers class **.R$* {
    public static <fields>;
}

-dontusemixedcaseclassnames

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

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

-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*(...);
}

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

-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
#下面是自己的AIDL和相關(guān)類的混淆,可以將所有public的方法都保留权悟,也可以保留所有方法
-keep public class com.android.xxx.EventInstance{
    *;
}
-keep public class com.android.xxx.MessageEvent{
    *;
}
-keep public class com.android.xxx.AIDLListener{
    *;
}
-keep public class com.android.xxx.AIDLControllerUtil{
    *;
}
-keep public class com.android.xxx.AIDLControllerService{
    public protected <methods>;
}
-keep public interface com.android.xxx.AIDLController{
    *;
}
-keep public interface com.android.xxx.EventListener{
    *;
}

-keep public class com.google.vr.vrcore.controller.api.IControllerListener
-keep public class com.google.vr.vrcore.controller.api.IControllerService
-keep public class com.google.vr.vrcore.controller.ControllerService$Bt_node_data
-keep public class com.google.vr.vrcore.controller.ControllerService{
    public protected <methods>;
}

????一些第三方的庫如何不進(jìn)行混淆砸王,這個根據(jù)項目特點,可以自行搜索僵芹,比如百度的地圖包什么的处硬。
????然后是如何驗證和解決混淆過程遇到的問題小槐,因為是對接口名進(jìn)行替換拇派,如果出現(xiàn)混淆問題的話,log里面一定會有類似

com.google.vr.vrcore.controller.  b//無法找到的異常

這個時候只需要對相關(guān)接口進(jìn)行例外(-keep)即可凿跳,然后用android-studio件豌,直接打開或者dex2jar進(jìn)行反解可以看到相關(guān)的接口是否被簡單替換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末控嗜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疆栏,更是在濱河造成了極大的恐慌,老刑警劉巖壁顶,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異若专,居然都是意外死亡许蓖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門调衰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膊爪,“玉大人嚎莉,你說我怎么就攤上這事∏髀幔” “怎么了赃额?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵琼懊,是天一觀的道長。 經(jīng)常有香客問我爬早,道長哼丈,這世上最難降的妖魔是什么筛严? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任桨啃,我火速辦了婚禮车胡,結(jié)果婚禮上照瘾,老公的妹妹穿的比我還像新娘。我一直安慰自己析命,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布簇搅。 她就那樣靜靜地躺著软吐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凹耙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天备典,我揣著相機(jī)與錄音虐沥,去河邊找鬼熊经。 笑死欲险,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的槐壳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼务唐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枫笛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喧兄,失蹤者是張志新(化名)和其女友劉穎啊楚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恭理,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年涯保,在試婚紗的時候發(fā)現(xiàn)自己被綠了拍嵌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茄猫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脆侮,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布靖避,位于F島的核電站比默,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏命咐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一榛臼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沛善,春花似錦、人聲如沸金刁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抵屿。三九已至,卻和暖如春轧葛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尿扯。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工衷笋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留芳杏,地道東北人辟宗。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像空幻,于是被迫代替她去往敵國和親容客。 傳聞我的和親對象是個殘疾皇子秕铛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容