1. 程式人生 > >Android輕鬆實現程式碼混淆

Android輕鬆實現程式碼混淆

1、簡介

程式碼混淆(Obfuscated code)亦稱花指令,是將計算機程式的程式碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。

混淆的目的是為了加大反編譯的成本,但是並不能徹底防止反編譯。

2、如何開啟混淆

通常我們需要找到專案路徑下app目錄下的build.gradle檔案,找到minifyEnabled這個配置,然後設定為true即可,如下:

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

3、proguard又是什麼呢

這是java官網給出的定義:

ProGuard is a free Java Class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or higher, or for Java Micro Edition.

作用:

  1. proguard是一個集檔案壓縮,優化,混淆校驗等功能的工具
  2. 檢測並刪除無用的類,變數,方法和屬性
  3. 優化位元組碼並刪除無用的指令
  4. 通過將類名,變數名和方法名重新命名為無意義的名稱實現混淆效果
  5. 還校驗處理後的程式碼

4、常見語句

-optimizationpasses 5

程式碼混淆壓縮筆記,在0~7之間

-dontusemixedcaseclassnames

混淆後類名都小寫

-dontskipnonpubliclibraryclasses

不去忽略非公共的庫的類

-dontskipnonpubliclibraryclassmembers

不去忽略非公共的庫的類的成員

-dontpreverify

不做預校驗的操作

-verbose
-printmapping proguardMapping.txt

生成原類名和混淆後的類名的對映檔案

-optimizations !code/simplification/cast,!field/*,!class/merging/*

指定混淆時採用的演算法

-keepattributes *Annotation*,InnerClasses

註解不混淆

-keepattributes Signature

泛型不混淆

-keepattributes SourceFile,LineNumberTable

丟擲異常時保留程式碼行號

用的最多的指令

-keep class XXXX

保留類名不變,也就是類名不混淆,而類中的成員名不保證。當然也可以是繼承XXX類的所有類名不混淆

-keepclasseswithmembers class XXXX

保留類名和成員名,當然也可以是類中特定方法

5、哪些不混淆

  • 反射中使用的元素
  • 與網路請求相關實體類
  • 使用註解的元素
  • 四大元件
  • WebView中與JS互動的類
  • 列舉 等

6、混淆檔案編寫

按照以上的規則和基本語句,我們將混淆檔案分為兩個區域:
定製化區域:分為實體類、第三方、js相關、反射相關,應按專案真實情況進行編寫,具體會在稍後提到;
基本不動區直接複製即可。

#-------------------------------------------定製化區域----------------------------------------------
#---------------------------------1.實體類---------------------------------


#---------------------------------2.第三方包-------------------------------



#---------------------------------3.與js互相呼叫的類------------------------



#---------------------------------4.反射相關的類和方法-----------------------



#-------------------------------------------基本不用動區域--------------------------------------------
#---------------------------------基本指令區----------------------------------
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------預設保留區---------------------------------
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}

-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-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();
}
-keep class **.R$* {
 *;
}
-keepclassmembers class * {
    void *(**On*Event);
}

#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
   public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, jav.lang.String);
}
#------------------------------------------------------------------------------------

實體類:

-keep class 你的實體類所在的包.* { ; }

實體類由於涉及到與服務端的互動,各種gson的互動如此等等,是要保留的。將你專案中實體類都挑出來,用以上語法進行保留。
如果實體類都在同一一個包下,就和上面一樣,很簡單;如果實體類分佈在各個包下,不好意思,挨個新增。

第三方包

需到專案的build.gradle檔案中找到所有添的依賴,然後去官網或者github找到對應的混淆程式碼,新增到我們自己的混淆檔案中。
如果是添的jar包的話,就像如下來寫

#log4j
-libraryjars log4j-1.2.17.jar
-dontwarn org.apache.log4j.**
-keep class  org.apache.log4j.** { *;}

大致意思就是不混淆,不報warn。如果gradle報錯的話,可以考慮註釋掉-libraryjars log4j-1.2.17.jar這句。

與JS互動相關

如果沒有可跳過

-keep class 你的類所在的包.** { *; }

如果是內部類的話這樣寫:

-keepclasseswithmembers class 你的類所在的包.父類$子類 { <methods>; }

反射相關

沒有可跳過

-keep class 你的類所在的包.** { *; }

ok,這樣就可以了,其實混淆很簡單!

這裡寫圖片描述

掃描二維碼,加入我們,獲取更多資訊!

相關推薦

Android輕鬆實現程式碼混淆

1、簡介 程式碼混淆(Obfuscated code)亦稱花指令,是將計算機程式的程式碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。 混淆的目的是為了加大反編譯的成本,但是並不能徹底防止反編譯。 2、如何開啟混淆 通常我們需要找到

安全程式設計之Android APK打包程式碼混淆

第一步:在專案工程目錄下的proguard-rules.pro檔案中配置自定義的混淆規則 #注意: #1.引用外部的jar包 如果不是自己寫的最好不混淆它們,因為外部jar包有可能已經混淆過 #2.不要混淆XML佈局中使用的自定義控制元件類,混淆後加載佈局會報找不到該控制

Android 輕鬆實現 RecyclerView 懸浮條

SuspensionBar簡介:a RecyclerView suspension bar implementation like InstagramA RecyclerView suspension bar implementation like Instagram

Android 輕鬆實現語音識別

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ />

Android開發之程式碼混淆

應用混淆(ProGuard) ProGuard是一個免費的JAVA類檔案壓縮,優化,混淆器。 它探測並刪除沒有使用的類,欄位,方法和屬性,它刪除沒有用的說明並使用位元組碼得到最大優化,它使用無意義的名字重新命名類,欄位和方法。 我們先來介紹下ProGuard 我們為啥要使用ProGu

android 2.2 程式碼混淆

 2.3以上版本:AndroidSDK自帶proguard混淆 在Android SDK中自帶有proguard程式碼混淆器,但在預設的情況下該混淆器是沒有開啟的。該混淆器在SDK中的路徑是android-sdk-windows\tools\proguard 啟

Android輕鬆實現播放Gif圖片

       Android的開發框架為我們的開發提供了不少很棒的控制元件,我們在開發的時候不需要太多的編碼就能輕鬆方便的使用這些控制元件,不過有些時候這些系統自帶的控制元件並不能夠完全滿足我們的需求。這時就需要我們發揮自己的想象力來實現我們特定需求的控制元件。     

搭建區域網Maven私服並結合Android Studio實現程式碼複用

每一種技術,每一個框架都不是憑空產生,都是為了解決特定需求.因此使用什麼技術取決於我們的需求,作為一個研發人員,我們不僅僅要懂得編碼,更要有洞察真實需求的能力. 首先介紹一下我們公司的現狀:我們公司有很多APP,每年會優化或者開發5個以上的APP,而

android學習之程式碼混淆小結

之前一直沒有對程式碼混淆有一個很明確的認識,今天重新對程式碼混淆做了一番瞭解,並記錄一下在Androidstudio上是如何做程式碼混淆的。 第一步: buildTypes { release { minifyEnabled true prog

Android實現 程式碼控制 EditText 只能輸入固定長度的數字

// 輸入固定長度 editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(

示例:Android註解實現程式碼注入

前面的部落格Android中的註解中, 我們簡單描述了Android中註解的含義和用途。 除了基本的用法外,註解還可以幫助我們實現程式碼注入,達到類似IoC的效果。 本篇部落格以一個簡單的例子,記錄一下相關的內容。 通常的情況下,我們初始化介面的程式

Android 專案的程式碼混淆Android proguard 使用說明

簡介Java程式碼是非常容易反編譯的。為了很好的保護Java原始碼,我們往往會對編譯好的class檔案進行混淆處理。ProGuard是一個混淆程式碼的開源專案。它的主要作用就是混淆,當然它還能對位元組碼進行縮減體積、優化等,但那些對於我們來說都算是次要的功能。官網地址:htt

Android輕鬆實現分享功能

在Android開發中,要實現分享功能,可能首先想到第三方的ShareSDK,其實,想要分享一些圖片,文字之類的完全沒必要在App中整合第三方SDK,利用原生的SDK就可以輕鬆實現分享功能。 Activity的跳轉方式   眾所周知,Activi

Android 中的程式碼混淆

在Android開發工作中,我們都或多或少接觸過程式碼混淆。比如我們想要整合某個SDK,往往需要做一些排除混淆的操作。 本文為本人的一些實踐總結,介紹一些混淆的知識和注意事項。希望可以幫助大家更好的學習和使用程式碼混淆。 什麼是混淆 關於混淆維基百科上該詞條的解釋為 程式碼混淆(Obfuscat

Android程式碼混淆官方實現方法

首先檢視一下 “project.properties” 這個檔案: # This file is automatically generated by Android Tools.# Do not modify this file -- YOUR CHANGES WILL

Android 打包 + 程式碼混淆

一:打包生成一個 Apk            生成一個 Apk 是比較簡單的,直接使用 Android Stuido 的打包工具就可以快速的生成一個 Apk 檔案,在這裡多插一句題外話吧,嘿嘿,就是關於使用多渠道打包和一套程式碼打

android截圖程式碼實現方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

如何藉助ImageAI輕鬆實現目標檢測(只需十行程式碼)

知乎轉載https://www.zhihu.com/question/26483508/answer/447708695 只需10行Python程式碼,我們就能實現計算機視覺中目標檢測。 from imageai.Detection import

android簡單 實現 日曆,生日 原生簡單輕鬆搞定

先看下佈局    對應的一個輸入框點選觸發 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an

一行css程式碼輕鬆實現前端響應式佈局(vw+rem)

大家知道rem可以用來做響應式佈局,只是html元素上的font-size樣式需要根據螢幕寬度來指定。 之前有用@media媒體查詢,根據各種螢幕寬度寫html的樣式,也用過類似lib-flexible這樣的js庫動態改變html樣式,總覺得挺麻煩的。 今天突然想到vw這個單位,發現用它來做響應式佈局實在