Android項目實戰(二十五):Android studio 混淆+打包+驗證是否成功

来源:http://www.cnblogs.com/xqxacm/archive/2016/09/22/5897435.html
-Advertisement-
Play Games

前言: 單挑Android項目,最近即時通訊用到環信,集成sdk的時候 官方有一句 即:混淆規則。 自己沒寫過關於混淆打包的文章,在此補上。 下麵瞭解Android studio環境下 項目混淆打包的操作。 一、打包: 即 將Android項目生成.apk文件,讓用戶去安裝。 1、工具欄 Build ...


前言:

單挑Android項目,最近即時通訊用到環信,集成sdk的時候 官方有一句

在 ProGuard 文件中加入以下 keep。

-keep class com.hyphenate.** {*;} -dontwarn com.hyphenate.**

 

即:混淆規則。 自己沒寫過關於混淆打包的文章,在此補上。

下麵瞭解Android studio環境下 項目混淆打包的操作。

 

----------------------------------------------------------------------------------------

一、打包:

即 將Android項目生成.apk文件,讓用戶去安裝。

1、工具欄 Build->Generate Signed APK..

2、出現這個界面,第一次進入的話編輯框都是空的,然後點擊Crete new...按鈕

3、這裡,填一些相關信息,具體內容就不詳說了

 

4、然後回到第一步,這時候點擊按鈕Next, Build Type選擇release Finish即可,然後在 APK Destination Folder目錄下就生成項目的apk包

 

打包過程如上,over。

----------------------------------------------------------------------------------------

 二、混淆

做開發的都知道我們可以通過一些工具來反編譯一個Apk,得到其中的資源,意圖好的也許就是為了參考你項目中優秀的代碼。意圖不好的也許會反編譯Apk來找到你項目中的漏洞,對項目安全做出威脅。

所以現在我們在打包一個項目之前,都要對項目進行混淆處理,讓Apk無法被輕易的反編譯,提高產品的安全性。

混淆操作需要進行一些配置。

在app目錄下的build.gradle文件中修改android{} 區域內代碼

1、

 //執行lint檢查,有任何的錯誤或者警告提示,都會終止構建
    lintOptions {
        abortOnError false
    }

2、

buildTypes {
        debug {
            // 顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
            versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
        }

        release {
            // 不顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            //Zipalign優化
            zipAlignEnabled true

            // 移除無用的resource文件
            shrinkResources true
            //前一部分代表系統預設的android程式的混淆文件,該文件已經包含了基本的混淆聲明,後一個文件是自己的定義混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }

 

3、修改 proguard

首先是一些固定的

-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}

#指定代碼的壓縮級別
-optimizationpasses 5

#包明不混合大小寫
-dontusemixedcaseclassnames

#不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses

 #優化  不優化輸入的類文件
-dontoptimize

 #預校驗
-dontpreverify

 #混淆時是否記錄日誌
-verbose

 # 混淆時所採用的演算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#保護註解
-keepattributes *Annotation*

# 保持哪些類不被混淆
-keep public class * extends android.app.Fragment
-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
#如果有引用v4包可以添加下麵這行
-keep public class * extends android.support.v4.app.Fragment


#忽略警告
-ignorewarning

##記錄生成的日誌數據,gradle build時在本項目根目錄輸出##
#apk 包內所有 class 的內部結構
-dump proguard/class_files.txt
#未混淆的類和成員
-printseeds proguard/seeds.txt
#列出從 apk 中刪除的代碼
-printusage proguard/unused.txt
#混淆前後的映射
-printmapping proguard/mapping.txt
########記錄生成的日誌數據,gradle build時 在本項目根目錄輸出-end######

#如果引用了v4或者v7包
-dontwarn android.support.**

####混淆保護自己項目的部分代碼以及引用的第三方jar包library-end####



#保持 native 方法不被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

#保持自定義控制項類不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

#保持自定義控制項類不被混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

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

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable

#保持 Serializable 不被混淆並且enum 類也不被混淆
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

#保持枚舉 enum 類不被混淆
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

-keepclassmembers class * {
    public void *ButtonClicked(android.view.View);
}

#不混淆資源類
-keepclassmembers class **.R$* {
    public static <fields>;
}

#避免混淆泛型 如果混淆報錯建議關掉
#-keepattributes Signature

 

 然後是根據項目中添加的第三方 額外添加的,一般在第三方的文檔中都有

比如:

#gson
#如果用用到Gson解析包的,直接添加下麵這幾行就能成功混淆,不然會報錯。
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }

#mob
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}
-keep class **.R$* {*;}
-keep class **.R{*;}
-dontwarn cn.sharesdk.**
-dontwarn **.R$*

#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

######引用的其他Module可以直接在app的這個混淆文件里配置

# 如果使用了Gson之類的工具要使被它解析的JavaBean類即實體類不被混淆。
-keep class com.matrix.app.entity.json.** { *; }
-keep class com.matrix.appsdk.network.model.** { *; }

#####混淆保護自己項目的部分代碼以及引用的第三方jar包library#######
#如果在當前的application module或者依賴的library module中使用了第三方的庫,並不需要顯式添加規則
#-libraryjars xxx
#添加了反而有可能在打包的時候遭遇同一個jar多次被指定的錯誤,一般只需要添加忽略警告和保持某些class不被混淆的聲明。
#以libaray的形式引用了開源項目,如果不想混淆 keep 掉,在引入的module的build.gradle中設置minifyEnabled=false
-keep class com.nineoldandroids.** { *; }
-keep interface com.nineoldandroids.** { *; }
-dontwarn com.nineoldandroids.**
# 下拉刷新
-keep class in.srain.cube.** { *; }
-keep interface in.srain.cube.** { *; }
-dontwarn in.srain.cube.**
# observablescrollview:tab fragment
-keep class com.github.ksoichiro.** { *; }
-keep interface com.github.ksoichiro.** { *; }
-dontwarn com.github.ksoichiro.**

 

至此,執行第一步打包,就可以生成混淆後的Apk了。

 

 

----------------------------------------------------------------------------------------

 三、反編譯Apk,驗證Apk是否混淆過

這裡使用一個工具 

  dex2jar(源碼文件獲取) 下載

下載後有這兩個文件

1、將打包後的apk文件 手動改變文件類型為.zip ,然後解壓縮,會得到一系列文件

找到其中的classes.dex文件(它就是java文件編譯再通過dx工具打包而成的)並將它複製到我們下載的dex2jar-2.0文件中去

2、在命令行下定位到dex2jar.bat所在目錄,輸入

d2j-dex2jar.bat   classes.dex

註意第一個命令,需要對應你文件夾中的 d2j-dex2jar.bat文件

 

 在該目錄下會生成一個classes_dex2jar.jar的文件,然後打開工具jd-gui文件夾里的jd-gui.exe,

 之後用該工具打開之前生成的classes_dex2jar.jar文件,便可以看到源碼了,效果如下: 命名變成了a,b,c,d等等說明成功

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要: 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 大概花了4,5天時間,做了一個對資料庫幾張表的維護的系統,採用的是MVC4+easyui構建,先附上幾張截圖讓大家瞭解下: 功能無非就是,增,刪,改,查,分頁顯示,功能很簡單,但是,主要是講下碰到的幾個問題: 一,大家都知道,通過點擊左邊 ...
  • IE7 下,不能夠自定義<select>/<option>的樣式,所以為了方便起見,用div可以進行模擬 註意事項:1、如果有多個併列,互相之間會相互影響,IE7下,會被遮擋,為避免此問題,所有 設置層級為:1,選中時,層級改為22、<a>標簽,缺少herf屬性的話,IE7下將無hover效果3、使 ...
  • 使用volley進行網路請求:需先將volley包導入androidstudio中 File下的Project Structrue,點加號導包 volley網路請求步驟: 1. 創建請求隊列 RequestQueue queue = Volley.newRequestQueue(this); 2.創 ...
  • 本文結合之前的動態創建fragment來進行一個實踐,來實現用Fragment創建一個選項卡 本文地址:http://www.cnblogs.com/wuyudong/p/5898075.html ,轉載請註明源地址。 項目佈局 新建Fragment1.java~Fragment4.java,其中F ...
  • 大家好,好久沒有跟新了。其實也就昨天到今天的時間。 前言:實際上,GIF動圖文件中包含了一組圖片及其信息數組,這些信息數據記錄著這一組圖片中各張圖片的播放時長等信息,我們可以將圖片和這些信息或取出來,使用UIImageView的幀動畫技術進行動畫播放。 好了不多說了 開始上代碼吧: 首先自己找一個G ...
  • 隨著Android應用開發規模的擴大,客戶端業務邏輯也越來越複雜,已然不是簡單的數據展示了。如同後端開發遇到瓶頸時採用的組件拆分思想,客戶端也需要進行架構設計,拆分視圖和數據,解除模塊之間的耦合,提高模塊內部的聚合度。 開始之前先上一張內部分享時用的PPT圖: 以上是筆者在客戶端開發過程中面臨的問題 ...
  • 1、SpannableString、SpannableStringBuilder與String的關係 首先SpannableString、SpannableStringBuilder基本上與String差不多,也是用來存儲字元串,但它們倆的特殊就在於有一個SetSpan()函數,能給這些存儲的Str... ...
  • Android Weekly Issue #223 中文筆記, 本期內容包括: Offline時間戳處理; Accessibility的安全問題可能並不是個問題; 如何在單元測試和UI測試之間共用代碼; Android中的指紋認證; 編譯時間Kotlin vs Java; MVP結合RxJava,... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...