混淆的一些事兒
Android studio寫在proguard-rules.pro中,當然寫在proguard-android.txt中也可以。
程式碼混淆,能夠提高我們程式碼的安全性,打正式的release包混淆是必備的,避免APP被反編譯,使專案中的技術洩漏。我們的APP加上混淆之後,即使被反編譯了,別人也很難閱讀,這就是混淆的好處。
此次專案中,做到分享的模組,用到了第三方的友盟分享。由於要更新友盟的SDK,在混淆配置後打包出現缺少jar包,翻了好久proguard-rules.pro檔案最後發現,友盟統計的混淆配置中有許多不需要的jar檔案配置,導致打包出錯,下面說說Android的混淆機制:
一、
首先要在gradle檔案中配置 minifyEnabled 為true ,在清單檔案中加入(對release版本的混淆處理)
android {
…
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
}
專案程式碼混淆後越亂越無規律越好,但有些地方我們是要避免混淆的,否則程式執行就會出錯,這就需要我們在proguard-rules.pro檔案中配置那些程式碼不需要混淆,避免打包後出錯。配置檔案中常見的幾個命令如:
-keep class org.apache.http.* {
-keep public class javax.**
-keep public class javax.*
第一種 既保持類名,又保持裡面的內容不被混淆;
第二種 兩顆星表示把本包和所含子包下的類名都保持;
第三種 一顆星表示只是保持該包下的類名,而子包下的類名還是會被混淆;
第二種,第三種類名不會變,但類裡面的具體方法和變數名稱還是會改變的。
如:
-keep public class * extends android.app.Activity
-keepnames class * implements java.io.Serializable
我們也可以使用Java的基本規則來保護特定類不被混淆,比如我們可以用extend,implement等這些Java規則來避免所有繼承Activity的類被混淆
如:
-keep public class * extends android.view.View {
public (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
public void set*(…);
public ; //匹配所有構造器
public ; //匹配所有域
public ; //匹配所有方法方法
}
保護類下特定的內容不被混淆
如:
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
保持列舉類不被混淆
二、
以上整理關於配置混淆的一些注意事項
1、jni 方法不可混淆,因為要與native方法保持一致(有用到WebView的JS呼叫也需要保證寫的介面方法不混淆)
具體配置
-keepclasseswithmembernames class * { # 保持native方法不被混淆 native ;
}
2、反射用到的類不混淆(列舉類因為需要反射機制,所以要避免列舉類被混淆)
3、AndroidMainfest中的類不混淆,所以四大元件和Application的子類和Framework層下所有的類預設不會進行混淆。自定義的View預設也不會被混淆;所以像網上貼的很多排除自定義View,或四大元件被混淆的規則在Android Studio中是無需加入的;
4、與服務端互動時,使用GSON、fastjson等框架解析服務端資料時,所寫的JSON物件類不混淆,否則無法將JSON解析成對應的物件;
5、使用第三方開源庫或者引用其他第三方的SDK包時,如果有特別要求,也需要在混淆檔案中加入對應的混淆規則;
6、Parcelable的子類和Creator靜態成員變數不混淆,否則會產生Android.os.BadParcelableException異常;
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆
public static final Android.os.Parcelable$Creator *;
}(序列化的另一種方式)
三、
附上一些第三方的混淆設定
Gson github地址
removes such information by default, so configure it to keep all of it.
-keepattributes Signature # Gson specific classes
-keep class sun.misc.Unsafe { ; } -keep class com.google.gson.stream.* { *; } # Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.* { ; } -keep class com.google.gson.* { ;} #這句非常重要,主要是濾掉 com.demo.demo.bean包下的所有.class檔案不進行混淆編譯,com.demo.demo是你的包名
-keep class com.demo.demo.bean.* {;}
Butterknife github地址
-keep class butterknife.* { ; } -dontwarn butterknife.internal.* -keep class *$$ViewBinder { ; } -keepclasseswithmembernames class { @butterknife.* ;
}
-keepclasseswithmembernames class * { @butterknife.* ;
}
SlidingMenu github地址
-dontwarn com.jeremyfeinstein.slidingmenu.lib.* -keep class com.jeremyfeinstein.slidingmenu.lib.*{*;}
ImageLoader github地址
Universal Image Loader
-keep class com.nostra13.universalimageloader.* { ; } -keepattributes Signature
ShareSDK 文件
-keep class cn.sharesdk.{;} -keep class com.sina.{;} -keep class .R
環信SDK 文件
-keep class com.easemob.* {;} -keep class org.jivesoftware.* {;} -keep class org.apache.* {;} -dontwarn com.easemob.** #2.0.9後的不需要加下面這個keep
-keep class org.xbill.DNS.* {;}
另外,demo中傳送表情的時候使用到反射,需要keep SmileUtils
-keep class com.easemob.chatuidemo.utils.SmileUtils {*;} #注意前面的包名,如果把這個類複製到自己的專案底下,比如放在com.example.utils底下,應該這麼寫(實際要去掉#)
-keep class com.example.utils.SmileUtils {*;}
如果使用easeui庫,需要這麼寫
-keep class com.easemob.easeui.utils.EaseSmileUtils {*;} #2.0.9後加入語音通話功能,如需使用此功能的api,加入以下keep
-dontwarn ch.imvs.* -dontwarn org.slf4j.* -keep class org.ice4j.* {;} -keep class net.java.sip.* {;} -keep class org.webrtc.voiceengine.* {;} -keep class org.bitlet.* {;} -keep class org.slf4j.* {;} -keep class ch.imvs.* {;}
Okhttputils github地址
okhttputils
-dontwarn com.zhy.http.* -keep class com.zhy.http.*{*;} #okhttp
-dontwarn okhttp3.* -keep class okhttp3.*{*;} #okio
-dontwarn okio.* -keep class okio.*{*;}
RxJava 相關文件
rx
-dontwarn rx.* -keepclassmembers class rx.* { *; } # retrolambda
-dontwarn java.lang.invoke.*
Glide github地址
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser** {
**[]VALUES;
public *;
}
下面這句不加
-keepresourcexmlelements manifest/application/[email protected]=GlideModule
再有用到的第三方可以檢視第三方的SDK文件。
附上專案中基本的混淆 (命令)
-optimizationpasses 5 # 指定程式碼的壓縮級別
-dontusemixedcaseclassnames # 是否使用大小寫混合
-dontskipnonpubliclibraryclasses # 是否混淆第三方jar
-dontpreverify # 混淆時是否做預校驗
-verbose # 混淆時是否記錄日誌
-optimizations !code/simplification/arithmetic,!field/,!class/merging/ # 混淆時所採用的演算法
-ignorewarnings # 忽略警告
-printseeds seeds.txt #未混淆的類和成員
-printusage unused.txt #列出從 apk 中刪除的程式碼
-printmapping mapping.txt #混淆前後的對映
-optimizations !code/simplification/arithmetic,!field/,!class/merging/ # 混淆時所採用的演算法
-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 # 保持哪些類不被混淆
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native ;
}
-keepclasseswithmembers class * { # 保持自定義控制元件類不被混淆
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int); # 保持自定義控制元件類不被混淆
}
-keepclassmembers class * extends android.app.Activity { # 保持自定義控制元件類不被混淆
public void *(android.view.View);
}
-keepclassmembers enum * { # 保持列舉 enum 類不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 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;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
相關推薦
混淆的一些事兒
Android studio寫在proguard-rules.pro中,當然寫在proguard-android.txt中也可以。 程式碼混淆,能夠提高我們程式碼的安全性,打正式的release包混淆是必備的,避免APP被反編譯,使專案中的技術洩漏。我們的AP
css一些事兒
默認值 內邊距 相對 wan absolute class put bottom height 1. 非替換元素 請註意,對於非替換的行內元素來說,盡管內容周圍存在內邊距與邊框,但其占用空間(行高)由 line-height 屬性決定。 替換元素:瀏覽器根據其標簽的元素與屬
正態分佈的一些事兒
本文整理了正態分佈的一些常用的性質,以供備忘之用。 目錄 概念 概率密度函式 分佈函式 特殊情況標準正態分佈 性質 相關matlab函式
Java程式設計效能優化一些事兒
1. 儘量在合適的場合使用單例 使用單例可以減輕載入的負擔,縮短載入的時間,提高載入的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面: 第一,控制資源的使用,通過執行緒同步來控制資源的併發訪問; 第二,控制例項的產生,以達到節約資源的目的;
BIO到NIO原始碼的一些事兒之BIO
此篇文章會詳細解讀由BIO到NIO的逐步演進的心靈路程,為Reactor-Netty 庫的講解鋪平道路。 關於Java程式設計方法論-Reactor與Webflux的視訊分享,已經完成了Rxjava 與 Reactor,b站地址如下: Rxjava原始碼解讀與分享:www.bilibili.com/vid
BIO到NIO原始碼的一些事兒之NIO 上
前言 此篇文章會詳細解讀NIO的功能逐步豐滿的路程,為Reactor-Netty 庫的講解鋪平道路。 關於Java程式設計方法論-Reactor與Webflux的視訊分享,已經完成了Rxjava 與 Reactor,b站地址如下: Rxjava原始碼解讀與分享:www.bilibili.com/vide
BIO到NIO原始碼的一些事兒之NIO 中
前言 此係列文章會詳細解讀NIO的功能逐步豐滿的路程,為Reactor-Netty 庫的講解鋪平道路。 關於Java程式設計方法論-Reactor與Webflux的視訊分享,已經完成了Rxjava 與 Reactor,b站地址如下: Rxjava原始碼解讀與分享:www.bilibili.com/vid
BIO到NIO原始碼的一些事兒之NIO 下 之 Selector
前言 此係列文章會詳細解讀NIO的功能逐步豐滿的路程,為Reactor-Netty 庫的講解鋪平道路。 關於Java程式設計方法論-Reactor與Webflux的視訊分享,已經完成了Rxjava 與 Reactor,b站地址如下: Rxjava原始碼解讀與分享:www.bilibili.com/vid
【基礎篇】Mac中關於eclipse外掛配置的一些事兒
eclipse 安裝外掛有三種常見的方式: 一、eclipse market,help/eclisep marketplace中搜索相關的外掛安裝,傻瓜式安裝 二、手動安裝,獲取外掛的link,然後通過help/install new software手
Android 混淆那些事兒
本文主要講述了程式碼混淆和資源混淆的原理,Studio預設的混淆方案,混淆的引數,以及如何對Apk進行程式碼混淆(自定義混淆檔案)和資源混淆(結合微信混淆和美團混淆兩種方案),避免Apk被逆向。為什麼要混淆我們的apk在打包釋出之前,都要進行混淆處理來避免原始碼
聊聊字串拼接的哪一些事兒
字串對我程式設計人員來說是字串時每天見面的常客,你不認識不熟悉他都不得行,字串的拼接更是家常便飯,那麼在實際開發過程中實現字串的拼接有哪一些方式呢?咱們一起來聊聊,來交流溝通,學習一波。也許你會說,那也太簡單了嘛,誰不會啊,哈哈,使用起來確實
聊聊多執行緒哪一些事兒(task)之 一
多執行緒,一個多麼熟悉的詞彙,作為一名程式設計師,我相信無論是從事什麼開發語言,都能夠輕輕鬆鬆說出幾種實現多執行緒的方式,並且在實際工作種也一定用到過多執行緒,比如:定時器、非同步作業等等,如果你說你沒有用過多執行緒,我懷疑你是不是一名程式設計師,哈哈。 哈
聊聊多執行緒哪一些事兒(task)之 二 延續操作
hello,又見面啦,昨天我們簡單的介紹瞭如何去建立和執行一個task、如何實現task的同步執行、如何阻塞等待task集合的執行完畢等待,昨天講的是task的最基本的知識點,如果你沒有看昨天的部落格,也不要急,你可以點選下面的地址, 聊聊多執行緒哪一些事兒(task)之 一),先看看後,在回到這兒
聊聊多執行緒那一些事兒(task)之 三 非同步取消和非同步方法
hello,咋們又見面啦,通過前面兩篇文章的介紹,對task的建立、執行、阻塞、同步、延續操作等都有了很好的認識和使用,結合實際的場景介紹,這樣一來在實際的工作中也能夠解決很大一部分的關於多執行緒的業務,但是隻有這一些是遠遠不夠的,比如,比如,如果這麼一個場景,當開啟tsak非同步任務後,有某
聊聊多執行緒那一些事兒 之 四 經典應用(取與舍、動態建立)
hello task,咱們又見面啦!!前面已經通過三篇簡單的文章,對多執行緒的建立、執行、阻塞、等待、取消、延遲操作、非同步方法等相關的知識點,通過這一些介紹,現在上手寫一個多執行緒就是分分鐘的小事件。如果需要看前三排文章的小夥伴,可以點選下面連結快速閱讀謝謝! &nb
聊聊多執行緒那一些事兒 之 五 async.await深度剖析
hello task,咱們又見面啦!!是不是覺得很熟讀的開場白,哈哈你喲這感覺那就對了,說明你已經閱讀過了我總結的前面4篇關於task的文章,謝謝支援!感覺不熟悉的也沒有關係,在文章末尾我會列出前四篇文章的地址,可以點選詳細閱讀。 前幾篇文章分享
聊聊RabbitMQ那一些事兒之一基礎應用
聊聊RabbitMQ那一些事兒之一基礎應用 Hi,各位熱愛技術的小夥伴您們好,今年的疫情害人啊,真心祝願您和您的家人大家都平平安安,健健康康。年前到現在一直沒有總結點東西,寫點東西,不然久了自己感覺自己都要被廢啦。這個週末花了一些時間來梳理了一下RabbitMQ的相關知識點。先來一個基礎篇,先用起來。我也
前端開發中一些容易混淆的概念匯總
提交表單 容易 html text bmi blog 技術分享 mit script ★:HTML中,按鈕button與submit區別是什麽? 1,button 定義可點擊按鈕(多數情況下,用於通過 JavaScript 啟動腳本)。 2,submit 定
關於數據計量單位的一些混淆
關於 也有 系統 但是 win 就是 區分 硬盤 linux中 最近呢在做初賽題 發現對於數據單位的換算 都是按照1KB=1024B的這種計量方式來的 其實這種計量方式在1999年以後都是naive的 正確的方式是 1KB = 1000B 1MB = 1000KB 1GB
sessionid固定與session混淆的一些隨想
使用 自己 sessionid 混淆 網站 刷新 進行 頁面 系列 以前一直覺得sessionid固定和session混淆就是兩個一樣的東西,後來發現兩者還是要分開來的,主要因為利用場景的不同!!! sessionid固定和session混淆還是需要區分開來的一般情況下:s