1. 程式人生 > >Android 專案如何新增程式碼混淆

Android 專案如何新增程式碼混淆

在網上搜“程式碼混淆”關鍵詞,可以看到n多教程。包括本篇部落格,大部分重要內容也是從網上各位大神的部落格裡面看到然後摘取和總結出來的。雖然網上都有,但是對於我個人來說,很難找到一篇部落格概括完全的,所以還是總結一下,也算是學習的紀錄。

首先看看程式碼混淆是什麼。

總的來說,程式碼混淆有兩種重要功能。其一,混淆程式碼。其二,優化程式碼。

進行程式碼混淆的程式被稱為程式碼混淆器(混淆工具)。進行程式碼混淆的意義主要在於對程式碼進行一定程度的加密。那麼,混淆器是如何進行程式碼加密的呢,或者說,混淆過的程式碼為什麼會有加密的效果呢?

首先說一點我比較堅持的觀點“我們寫的程式碼是給人看的,不是給機器看的”。通常,我們寫程式碼的時候,程式碼都需要有一定的規範,而且變數名、函式名一般要能讓人看到就知道是什麼功能。所以,當我們不進行混淆的情況下發布了一個apk包,別人就可以通過反編譯工具對apk包進行反編譯,基本還原我們的原始碼。這樣肯定是對我們不利的。此時就需要用到程式碼混淆。

程式碼混淆的基本方法就是將我們寫的易於讀懂的程式碼,等價的替換為難以讀懂而邏輯正確的程式碼,就是說,機器能夠執行這段程式碼,但是一般人讀不懂這段程式碼。這樣,別人反編譯了我們的apk包,得到的混淆後的程式碼看起來基本就是一堆雜亂無章、無法閱讀的程式碼。

程式碼混淆的時候還會進行一些優化,例如刪除某些沒用被使用到的程式碼,以及簡單的重組程式碼,減少中間過程。

比較重要的一點是,程式碼混淆並不能完全的加密程式碼,只是提高了程式包被反編譯的難度,對程式碼起到一定的保護作用。

關於程式碼混淆的定義,詳情可以看這裡 程式碼混淆——百科

現在瞭解了程式碼混淆,就看看如何使用程式碼混淆吧。

我自己用來測試的是使用Android studio 建立的工程。

在android 2.3之後,sdk中就已經集成了混淆器proguard(目錄在sdk\tools\proguard),所以我們可以很方便的直接在工程中開啟程式碼混淆。

eclipse  android工程開啟混淆功能,我們需要手動在專案檔案.properties(我的是project.properties檔案)中新增下面的程式碼

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):  
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt


某些方式建立的專案中可能已經有如上兩行了,只是預設被註釋掉了,只要把proguard.config這一行解註釋就好了。這樣程式碼混淆功能就開啟了,在打簽名包時,專案會自動進行程式碼混淆。

對於eclipse工程來說,程式碼混淆的規則,在 proguard-project.txt 檔案中,我們需要根據規則去選擇哪些程式碼需要混淆,哪些程式碼(一般我們引用的第三發jar包,如果已經被混淆過,就不能再混淆,否則會報錯。一般我們對外開放的介面不需要混淆)不需要混淆。編寫proguard-project.txt檔案的規則,後面介紹

android-studio工程開啟混淆功能,我們需要在 app/build.gradle檔案中新增如下程式碼。

buildTypes {
        debug {
            //啟用程式碼混淆
            minifyEnabled false
            //混淆規則配置檔案
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //
            signingConfig signingConfigs.debug
        }
        release {
            //是否優化zip
            zipAlignEnabled true
            // 移除無用的resource檔案
            shrinkResources true
            //啟用程式碼混淆
            minifyEnabled true
            //混淆規則配置檔案
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //
            signingConfig signingConfigs.release
        }
    }


關於程式碼混淆規則改如何寫,我也不知道,哈哈,找了幾篇大神的部落格,其中有寫到,可以參考一下。

 Android 程式設計下的程式碼混淆 (感謝博主),其中包含如何取捨對哪些程式碼進行混淆,也有一些關於混淆規則檔案如何編寫的內容。

看完以上內容,自己動手配置程式碼混淆應該不是問題。不過我們使用程式碼混淆的時候可能還有一些坑,例如工程中引用了很多外部的庫,導致程式碼中函式數量超過了65535,混淆的時候可能會出錯。此時需要分檔案混淆,也就是把所有的程式碼分成兩個部分來進行混淆。