Android代碼混淆

最近在研究apk瘦身時巧鸭,發(fā)現(xiàn)代碼混淆有很大作用孵运,所以就去簡單研究了一下。

我認為,代碼混淆可以保護核心功能不泄漏以及apk瘦身寇僧;但是也有個缺點:就是人為的可能會把不能混淆的代碼混淆,導致crash频祝。

經(jīng)過整理發(fā)現(xiàn)代碼混淆可以分為三部分:

  • 基本指令以及一些固定不混淆的代碼沧踏;
  • 某些第三方包;
  • 自己書寫的一些不要混淆的代碼欣簇。
    注:其中第二部分规脸,可以根據(jù)情況擴展或去掉某些未曾用到的指令坯约;第三部分需要根據(jù)自己的情況去添加;

代碼混淆

俗話說莫鸭,授人以魚不如授人以漁闹丐,但是先有魚總是好的,所以接下來就會先介紹一下代碼混淆的基本使用被因。

1. 開啟混淆代碼
在app module下的gradle文件中

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

默認minifyEnable是false卿拴,我們只需要改為true就開啟了混淆。這里只需要在release的時候開啟混淆即可氏身,代碼混淆會加長APK的生成時間巍棱,而且android studio2.0以后使用instance run會停用ProGuard。

這時候打包蛋欣,安裝航徙,如果引入了其他第三方的代碼的話,不出意外時會crash的陷虎,雖然proguard-android.txt文件中已經(jīng)包含了一些不混淆的指令了到踏,那些事系統(tǒng)常規(guī)的指令,對于自定義的一些指令就需要自己在app下的proguard-rules.pro文件中去定義尚猿。
2. PROGUARD模板

proguard-rules.pro

我看這個庫里邊的內(nèi)容也用分割線做了一下簡單的分割窝稿,包含的也是上文說到的三部分,下面簡單介紹一下具體包含的內(nèi)容凿掂。

  • 基本指令:包含了壓縮級別伴榔,忽略警告,混淆警告等庄萎;

  • 固定不混淆的代碼:包含繼承四大組件中的內(nèi)容踪少,support包,view相關糠涛、序列化相關援奢、R文件、枚舉忍捡、native方法等集漾;

  • 第三方包:這一部分需要根據(jù)項目情況去處理,這里支持了我們公司常用框架里邊的第三方包砸脊;

  • 自己書寫的不需要混淆的代碼:這里就需要根據(jù)自己的情況去書寫了具篇,而我們只需要知道哪些東西是不能混淆的就能編寫了。
    下面來說一下凌埂,混淆的規(guī)則:

  • 第三方庫栽连。一般都會提供混淆規(guī)則,如果沒有提供,報錯后秒紧,我們就可以保護報錯的類,不讓其混淆挨下,實在不行就用最暴力的解決辦法熔恢,把其全部代碼都不混淆。

  • 運行時動態(tài)改變代碼臭笆。一般例如反射叙淌,實體類。

  • 被JNI中調(diào)用的類愁铺。

  • WebView中Js調(diào)用的方法鹰霍。

  • View相關的類和事件。
    這兩步過后茵乱,基本就完成了代碼混淆茂洒,運行后發(fā)現(xiàn)問題再解決即可,下面就開始介紹一些混淆中的語法瓶竭。

1督勺、常用命令

命令 作用
-keep 防止該類所有內(nèi)容被移除或重命名
-keepnames 防止類和成員被重命名
-keepclassmembers 防止成員被移除或者被重命名
-keepclasseswithmembers 防止擁有該成員的類和成員被移除或者被重命名
-keepclasseswithmembernames 防止擁有該成員的類和成員被重命名

2. 常用規(guī)則

  • 類:需要使用完全限定名;

  • *:通配符斤贰,任意字符串智哀,不包含包名分隔符(.);

  • **:通配符荧恍,任意字符串瓷叫,包含包名分隔符(.);

  • extends:繼承某類的類送巡;

  • implement:實現(xiàn)某接口的類摹菠;

  • $:內(nèi)部類;

  • <init>:所有構(gòu)造方法授艰;

  • <fields>:所有成員變量辨嗽;

  • <methods>:所有方法;

  • …:任意參數(shù)淮腾;

  • 修飾符:public private protected

3. 例子

含義 指令語句
不混淆某個類 -keep public class packageName.className{ *; }
不混淆某個包的所有類 -keep class packageName.**{ *; }
不混淆某個類的子類 -keep public class * extends packageName.className{ *; }
不混淆某個接口的子類 -keep public class * implements packageName.className{ *; }
不混淆某個類的構(gòu)造方法 -keepclassmembers class packageName.className{ public <init style="box-sizing: border-box;">(); }</init>
不混淆某個類的某個方法 -keepclassmembers class packageName.className{ public void methodName(…); }
不混淆某個類的內(nèi)部類 -keep class packageName.className$*{ *; }

混淆的步驟

上文中介紹了代碼的混淆糟需,其實Android的混淆中還包括了資源壓縮,整個過程包括:壓縮谷朝、優(yōu)化洲押、混淆、以及預校驗圆凰,其中第四步在Android中可不要杈帐,默認是去掉了的,另外三個都是默認開啟的。

  • 壓縮:會移除未被使用的類和成員變量挑童,會在優(yōu)化后再次被執(zhí)行累铅;
  • 優(yōu)化:在字節(jié)碼級別執(zhí)行優(yōu)化,讓應用運行的更快站叼;
  • 混淆:增大反編譯難度娃兽,類和類成員會被隨機命名,除非用keep保護尽楔。
    下面再簡單介紹一下再開啟資源壓縮投储,和開啟代碼混淆在一起加上shrinkResources true即可。但是這時候所有未被使用的資源都會被移除阔馋,但是有的資源我們可能是動態(tài)使用的玛荞,就需要保留。
    那么就可以創(chuàng)建一個包含標簽的XML文件呕寝,并使用tools:keep屬性指定保留的資源勋眯,使用tools:discard屬性指定要刪除的資源;多個就使用逗號隔開即可壁涎,還可以使用*通配符凡恍。例如:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

對于資源的保留,還有一個嚴格應用的檢查怔球,開啟后嚼酝,在使用Resources.getIdentifier()就可以根據(jù)動態(tài)生成的字符串查詢資源名字,例如:

String name = String.format("img_%1d", angle + 1);
res = getResources().getIdentifier(name, "drawable", getPackageName());

使用方式也很簡單竟坛,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />

到這里闽巩,混淆相關的就基本上介紹完了,然后再總結(jié)一下需要注意的東西:

  • 一定要根據(jù)混淆規(guī)則判斷自己的代碼是否需要混淆担汤;
  • 測試的版本一定需要打包后的apk涎跨;

還遺留的問題是:錯誤日志的定位問題?思路是根據(jù)輸出的mapping文件去對應崭歧,沒有詳細的去落實隅很,實際遇到了再補上具體的解決方案。

本文章參考文章

還遺留的問題是:錯誤日志的定位問題率碾?思路是根據(jù)輸出的mapping文件去對應叔营,沒有詳細的去落實,實際遇到了再補上具體的解決方案所宰。

參考

壓縮代碼和資源

寫給Android開發(fā)者的混淆使用手冊

Android Studio代碼混淆插件

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绒尊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仔粥,更是在濱河造成了極大的恐慌婴谱,老刑警劉巖蟹但,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谭羔,居然都是意外死亡华糖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門口糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缅阳,“玉大人,你說我怎么就攤上這事景描。” “怎么了秀撇?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵超棺,是天一觀的道長。 經(jīng)常有香客問我呵燕,道長棠绘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任再扭,我火速辦了婚禮氧苍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泛范。我一直安慰自己让虐,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布罢荡。 她就那樣靜靜地躺著赡突,像睡著了一般。 火紅的嫁衣襯著肌膚如雪区赵。 梳的紋絲不亂的頭發(fā)上惭缰,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音笼才,去河邊找鬼漱受。 笑死,一個胖子當著我的面吹牛骡送,可吹牛的內(nèi)容都是我干的昂羡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼各谚,長吁一口氣:“原來是場噩夢啊……” “哼紧憾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昌渤,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赴穗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般眉,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡了赵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甸赃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柿汛。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埠对,靈堂內(nèi)的尸體忽然破棺而出络断,到底是詐尸還是另有隱情,我是刑警寧澤项玛,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布貌笨,位于F島的核電站,受9級特大地震影響襟沮,放射性物質(zhì)發(fā)生泄漏锥惋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一开伏、第九天 我趴在偏房一處隱蔽的房頂上張望膀跌。 院中可真熱鬧,春花似錦固灵、人聲如沸捅伤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暑认。三九已至,卻和暖如春大审,著一層夾襖步出監(jiān)牢的瞬間蘸际,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工徒扶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粮彤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓姜骡,卻偏偏與公主長得像导坟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子圈澈,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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

  • 本篇文章:自己在混淆的時候整理出比較全面的混淆方法惫周,比較實用,自己走過的坑康栈,淌出來的路递递。請大家不要再走回頭路喷橙,可能...
    Zane_Samuel閱讀 55,321評論 8 93
  • 聲明 這篇文章更多的是做一個整理,內(nèi)容來自于ProGuard官方文檔以及各種博客等登舞,相關文章的鏈接在參考目錄里贰逾,感...
    夷陵小祖閱讀 3,675評論 0 23
  • Android知識總結(jié)[http://www.reibang.com/p/01b1de0504d2] 一、配置(...
    濤濤123759閱讀 444評論 0 1
  • 混淆代碼能有效防止被反編譯菠秒,防止自己的勞動成果被別人竊取; ProGuard是一個開源的Java代碼混淆器疙剑。它可以...
    appzy閱讀 2,287評論 2 18
  • 久違的晴天,家長會践叠。 家長大會開好到教室時言缤,離放學已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗禁灼。 放學鈴聲...
    飄雪兒5閱讀 7,513評論 16 22