A. android studio 代碼混淆錯誤
1,androidstudio1.3之後的版本就沒有GenerateSignedAPK—RunProGuard這個選項了!要在build.grandle把minifyEnabled改成Ture就可以了!minifyEnabledtrue下面是我使用的代碼:#指定代碼的壓縮級別-optimizationpasses5#包明不混合大小寫-dontusemixedcaseclassnames#不去忽略非公共的庫類-#優化不優化輸入的類文件-dontoptimize#預校驗-dontpreverify#混淆時是否記錄日誌-verbose#混淆時所採用的演算法-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*#保護註解-keepattributes*Annotation*#保持哪些類不被混淆#-keeppublicclass*extendsandroid.app.Fragment#如果有引用v4包可以添加下面這行-keeppublicclass*extendsandroid.support.v4.app.Fragment#忽略警告-ignorewarning#####################記錄生成的日誌數據,gradlebuild時在本項目根目錄輸出#################apk包內所有class的內部結構-mpclass_files.txt#未混淆的類和成員-printseedsseeds.txt#列出從apk中刪除的代碼-printusageunused.txt#混淆前後的映射-printmappingmapping.txt#####################記錄生成的日誌數據,gradlebuild時在本項目根目錄輸出-end################################混淆保護自己項目的部分代碼以及引用的第三方jar包library##########################-libraryjarslibs/xUtils-2.6.14.jar#-libraryjarslibs/alipaysdk.jar#-libraryjarslibs/alipaysecsdk.jar#-libraryjarslibs/alipayutdid.jar#-libraryjarslibs/wup-1.0.0-SNAPSHOT.jar#-libraryjarslibs/weibosdkcore.jar#三星應用市場需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar#-libraryjarslibs/sdk-v1.0.0.jar#-libraryjarslibs/look-v1.0.1.jar#我是以libaray的形式引用了一個圖片載入框架,如果不想混淆keep掉-keepclasscom.nostra13.universalimageloader.**{*;}#忽略警告-dontwarncom.veidy.mobile.common.**#保留一個完整的包-keepclasscom.veidy.mobile.common.**{*;}#如果引用了v4或者v7包-dontwarnandroid.support.**############混淆保護自己項目的部分代碼以及引用的第三方jar包library-end###################-keeppublicclass*extendsandroid.view.View{#public(android.content.Context);#public(android.content.Context,android.util.AttributeSet);#public(android.content.Context,android.util.AttributeSet,int);#publicvoidset*();#}#保持native方法不被混淆-*{native;}#保持自定義控制項類不被混淆#-keepclasseswithmembersclass*{#public(android.content.Context,android.util.AttributeSet);#}#保持自定義控制項類不被混淆#-keepclasseswithmembersclass*{#public(android.content.Context,android.util.AttributeSet,int);#}#保持自定義控制項類不被混淆#-keepclassmembersclass*extendsandroid.app.Activity{#publicvoid*(android.view.View);#}#保持Parcelable不被混淆-keepclass*implementsandroid.os.Parcelable{publicstaticfinalandroid.os.Parcelable$Creator*;}#保持Serializable不被混淆-keepnamesclass*implementsjava.io.Serializable#保持Serializable不被混淆並且enum類也不被混淆-keepclassmembersclass*implementsjava.io.Serializable{;privatestaticfinaljava.io.ObjectStreamField[]serialPersistentFields;!static!transient;!private;!private;privatevoidwriteObject(java.io.ObjectOutputStream);privatevoidreadObject(java.io.ObjectInputStream);java.lang.ObjectwriteReplace();java.lang.ObjectreadResolve();}#保持枚舉enum類不被混淆如果混淆報錯,建議直接使用上面的-keepclassmembersclass*implementsjava.io.Serializable即可#-keepclassmembersenum*{#publicstatic**[]values();#publicstatic**valueOf(java.lang.String);#}-keepclassmembersclass*{publicvoid*ButtonClicked(android.view.View);}#不混淆資源類-keepclassmembersclass**.R$*{publicstatic;}#避免混淆泛型如果混淆報錯建議關掉#–keepattributesSignature#移除log測試了下沒有用還是建議自己定義一個開關控制是否輸出日誌-.util.Log{publicstaticbooleanisLoggable(java.lang.String,int);publicstaticintv();publicstaticinti();publicstaticintw();publicstaticintd();publicstaticinte();}
B. android開發代碼混淆都混淆哪些
代碼混淆(code obfuscation)是指將計算機程序的代碼,轉換成一種功能上等價,所謂功能上的等價是指其在變換前後功能相同或相近。其解釋如下:程序P經過混淆變換為P『,若P沒有結束或錯誤結束,那麼P』也不能結束或錯誤結束;而且P『程序的結果應與程序P具有相同的輸出。否則P』不是P的有效的混淆。
目前對於混淆的分類,普遍是以Collberg 的理論為基礎,分為布局混淆(layout obfuscation)、數據混淆(data obfuscation)、控制混淆(control obfuscation)和預防混淆(preventive obfuscation)這四種類型。
1. 布局混淆
布局混淆是指刪除或者混淆軟體源代碼或者中間代碼中與執行無關的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。軟體源代碼中的注釋文本、調試信息可以直接刪除,用不到的方法和類等代碼或數據結構也可以刪除,這樣即可以使攻擊者難以理解代碼的語義,也可以減小軟體體積,提高軟體裝載和執行的效率。軟體代碼中的常量名、變數名、類名和方法名等標識符的命名規則和字面意義有利於攻擊者對代碼的理解,布局混淆通過混淆這些標識符增加攻擊者對軟體代碼理解的難度。標識符混淆的方法有多種,例如哈希函數命名、標識符交換和重載歸納等。哈希函數命名是簡單地將原來標識符的字元串替換成該字元串的哈希值,這樣標識符的字元串就與軟體代碼不相關了;標識符交換是指先收集軟體代碼中所有的標識符字元串,然後再隨機地分配給不同的標識符,該方法不易被攻擊者察覺;重載歸納是指利用高級編程語言命名規則中的一些特點,例如在不同的命名空間中變數名可以相同,使軟體中不同的標識符盡量使用相同的字元串,增加攻擊者對軟體源代碼的理解難度。布局混淆是最簡單的混淆方法,它不改變軟體的代碼和執行過程。
2. 數據混淆
數據混淆是修改程序中的數據域,而對代碼段不作處理。常用的數據混淆方式有合並變數、分割變數、數組重組、字元串加密等。
合並變數是將幾個變數合並為一個數據,原來的每個變數占據其中一個區域,類似於一個大的數據結構。分割變數則是將一個變數分割為兩個變數,對分割前後提供一種映射關系,將對一個變數的操作轉化為對分割後兩個變數的操作。
數組重組有數組的分割、合並、折疊和平滑等幾種方式。分割是將一個數組分成2個或多個相同維度的數組;合並則相反;折疊是增加數組的維數;平滑則是相反。
在ELF文件中,全局變數和常量字元串存放在數據段中,反匯編工具可以輕易查找到字元串與代碼之間的引用關系。在軟體破解中,通過一些字元串提示可以很方便的找到代碼關鍵語句,從而破解軟體。字元串加密則可以對這些明顯的字元串進行加密存儲,在需要時再進行解密。
3. 控制混淆
控制混淆也稱流程混淆,它是改變程序的執行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟體的目的。一般採用的技術有插入指令、偽裝條件語句、斷點等。偽裝條件語句是當程序順序執行從A到B,混淆後在A和B之間加入條件判斷,使A執行完後輸出TRUE或FALSE,但不論怎麼輸出,B一定會執行。
控制混淆採用比較多的還有模糊謂詞、內嵌外聯、打破順序等方法。
模糊謂詞是利用消息不對稱的原理,在加入模糊謂詞時其值對混淆者是已知的,而對反混淆者卻很難推知。所以加入後將干擾反匯編者對值的分析。模糊謂詞的使用一般是插入一些死的或不相關的代碼(bogus code),或者是插入在循環或分支語句中,打斷程序執行流程。
內嵌(in-line)是將一小段程序嵌入到被調用的每一個程序點,外聯(out-line)是將沒有任何邏輯聯系的一段代碼抽象成一段可被多次調用的程序。
打破順序是指打破程序的局部相關性。由於程序員往往傾向於把相關代碼放在一起,通過打破順序改變程序空間結構,將加大破解者的思維跳躍。
4. 預防混淆
預防混淆一般是針對專用的反編譯器設計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設計。預防混淆對於特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進行設計。
C. android混淆會混淆註解嗎
android混淆會混淆註解。
如果不想註解被混淆,可以參考如下代碼試試:
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation { *; }
D. Android之如何混淆代碼和相關配置
項目發布之前混淆是必不可少的工作,混淆可以增加別人反編譯閱讀代碼的難度,還可以縮小APK包。
使用步驟:
1、修改project.properties文件:
Java代碼 收藏代碼
# 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一行前面的#注釋;
2、配置proguard-project.txt文件:
這個是主配置文件,裡面配置哪些需要混淆,哪些不需要混淆的選項;
提供給外部的類、方法、變數等名字不能混淆;
在AndroidManifest中配置的類(Activity、Service等的子類及Framework類默認不會進行混淆)
不混淆Parcelable的子類,防止android.os.BadParcelableException
Jni中調用的類
反射用到的類
項目中的實體類
3、導出項目:
export簽名項目。
4、查看是否混淆成功:
用反編譯工具反編譯並對比未混淆的代碼;
5、運行ProGuard及其生成的文件介紹
在以release模式下打包apk時會自動運行ProGuard,這里的release模式指的是通過ant release命令或eclipse project->android tools->export signed(unsigned) application package生成apk。在debug模式下為了更快調試並不會調用proguard。
如果是ant命令打包apk,proguard信息文件會保存於<project_root>/bin/proguard文件夾內;如果用eclipse export命令打包,會在<project_root>/proguard文件夾內。其中包含以下文件:
mapping.txt表示混淆前後代碼的對照表,這個文件非常重要。如果你的代碼混淆後會產生bug的話,log提示中是混淆後的代碼,希望定位到源代碼的話就可以根據mapping.txt反推。
mp.txt描述apk內所有class文件的內部結構
seeds.txt列出了沒有被混淆的類和成員
usage.txt列出了源代碼中被刪除在apk中不存在的代碼
目前市面上有很多第三方應用加固的平台, 如果新應用發布前需要掃描或者加固的話,可以先試試免費的,例如騰訊御安全,建議自己先去加固測試下。
E. android 混淆 什麼意思
Android代碼混淆,是為了你的apk被他人反編譯之後拿到源碼,如果你混淆了,那反編譯後的apk所有的java類都被改成了a.java/c.java之類的文件名,類裡面的屬性也變成abc之類的了,想拿到你的源碼就不可能了,直接在gradle(app)文件的android節點下加上下邊代碼。
buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
F. 如何混淆android代碼以及注意事項
2.3SDK的兩個新特點:
1.剛安裝上2.3時,查看sdk目錄,發現在 ools下新增了一文件夾「proguard」,如下圖,我就在想是不是Google終於官方對proguard考慮進去了。理論上,對java的混淆都是可以的,但關鍵在於如何編寫proguard的混淆腳本。
注意要點:
1.混淆以後的包會比混淆前的包小一點,一定要注意這點.
如果混淆不成功,請在第2步,將proguard.config=proguard.cfg修改為proguard.config=E:Mobile_DevelopGoogle_AndroidpublicGoldenBeach_newproguard.cfg這種類似的用絕對路徑,請注意絕對路徑中的文件夾名不能含有空格,如果有空格請替換為"_".
2.android在用proguard混淆時,一般情況下使用系統自帶的配置文件就可以保持大部分外部需要引用的類,比如Activity,view擴展等等,但是有些情況下一些引入的外部lib,如果被混淆也會出現各種各樣的問題,如果不想混淆這些包,就要加上
-keep class packagename.** {*;}
這樣就能完整保持原有class了
G. android代碼混淆以及怎麼判斷一個apk代碼是否被混淆過
1、proguard原理
java代碼編譯成二進制class文件,這個class文件也可以反編譯成源代碼,除了注釋外,其他的code基本都可以看到。為了防止重要code被泄露,我們往往需要混淆,即把方法名,變數名,類名,包名等這些java元素的名稱改成讓人意想不到的名稱,這樣代碼結構就沒有變化,還可以運行,但是想弄懂代碼的架構卻很難。proguard就起到了這樣的作用:
一、它可以分析一組class的結構,根據用戶的配置,然後把這些class文件中可以混淆的java元素進行混淆
二、刪除無效的代碼
三、對代碼進行優化(使用adt插件導出的apk,還進行zipalign優化)
預設情況下,proguard會混淆所有代碼,但是下面幾種情況是不能改變java元素的名稱,否則就會導致程序出錯。
一、用到反射的地方(android中的api常用@hide注釋掉,開發者在調用相應的方法時,需要用到反射)
二、當app的代碼要依賴於系統的介面時,如被系統代碼調用的回調方法,這種方法比較復雜
三、java元素名稱是配置文件中配置好的
所以在使用proguard時,我們需要有個配置文件告訴proguard,哪些java元素是不能混淆的。
2、proguard配置
-dontwarn預設proguard會檢查每一個引用是否正確,但是第三方庫里往往有些不會用到的類,沒有正確引用,如果不配置的話,系統就會報錯。
-keep指定的類和類成員被保留作為入口
-keepclassmembes指定的類成員被保留。
-keepclasswithmembers指定的類和類成員被保留,假如指定的類成員存在的話。
H. android項目對apk進行混淆
混淆apk是一個很基礎的工作,博客上也有一堆介紹,本文提供一下這類工作的解決思路。在安卓源碼下面和android studio裡面的做法差異不大,本文以android源碼舉例。
首先在對應mk文件裡面添加proguard enabled的語句,系統有一個自帶的build/core/proguard.flags,默認是使用這個文件,而且一般項目默認是關閉的,這也是有原因的。因為這里的proguard.flags是沒有針對app的配置的,使用默認的混淆,app很有可能就不工作了。
添加了mk文件修改之後,在Android.mk同級根目錄創建本app自有的proguard.flags。新增內容如下,這里需要注意,網上很多demo,基本分為三部分,一部是保留app基礎功能部分的內容不混淆;2是保持app對外介面,例如get、set、isxx、AIDL、public、native層的介面或者類;3.是第三方jar包或介面。混淆的基本原理就是將上訴類或介面進行統一簡單字母的替換,如果改變了這些對外介面的名字,很有可能被別人使用的時候就找不到對應哦介面
一些第三方的庫如何不進行混淆,這個根據項目特點,可以自行搜索,比如網路的地圖包什麼的。
然後是如何驗證和解決混淆過程遇到的問題,因為是對介面名進行替換,如果出現混淆問題的話,log裡面一定會有類似
這個時候只需要對相關介面進行例外(-keep)即可,然後用android-studio,直接打開或者dex2jar進行反解可以看到相關的介面是否被簡單替換。
I. android 混淆
其實不要混淆的主旨就在於混淆會改變方法的名字,類的名字,但是對於外部的一些引用是通過名字找到對應的方法,類,這些可能是通過string找到方法,類,但是string里的欄位是不會進行混淆,所以還是會保留原來的名字,這樣混淆過後通過原來的名字去找混淆後的名字,是肯定找不到,所以就會報出nosuchfileException,(對於gson,反射,jsbridge,第三方庫都是這個原因),至於說枚舉類型,我還暫時沒懂 為什麼,還望共同學習,一起成長。
文章是讀了兩篇博客寫出來,也是自己總結,消化成自己的知識了,若有什麼錯誤的地方,還望指出,相信讀了這兩篇文章之後你也會懂混淆,一個是如何混淆,一個是哪些該混淆,為什麼不能混淆
-keepclasseswithmembernames class * { # 保持native方法不被混淆 native <methods>; }
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *; }
發布一款應用除了設minifyEnabled為ture,你也應該設置zipAlignEnabled為true,像Google Play強制要求開發者上傳的應用必須是經過zipAlign的,zipAlign可以讓安裝包中的資源按4位元組對齊,這樣可以減少應用在運行時的內存消耗。
原文: http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/
其實不要混淆的主旨就在於混淆會改變方法的名字,類的名字,但是對於外部的一些引用是通過名字找到對應的方法,類,這些可能是通過string找到方法,類,但是string里的欄位是不會進行混淆,所以還是會保留原來的名字,這樣混淆過後通過原來的名字去找混淆後的名字,是肯定找不到,所以就會報出nosuchfileException,(對於gson,反射,jsbridge,第三方庫都是這個原因),至於說枚舉類型,我還暫時沒懂 為什麼,還望共同學習,一起成長。
文章是讀了兩篇博客寫出來,也是自己總結,消化成自己的知識了,若有什麼錯誤的地方,還望指出,相信讀了這兩篇文章之後你也會懂混淆,一個是如何混淆,一個是哪些該混淆,為什麼不能混淆
J. 寫給Android 混淆小白的快速混淆方法
簡單來說,Android 進行ProGuard,可以起到壓縮,混淆,預檢,優化的功能,雖然不能說更安全但還是一個不容忽視的環節。
首先在build.gradle 中將混淆的開關打開,即 minifyEnabled 置為 true
然後就要去proguard-rules.pro寫入我們的混淆的規則(如文件其名),防止重要的類被混淆移除了。
省事第一步,先套個模板,就是找到網上博客上別人分享好的模板,像四大組件,主流開源庫,JNI調用本地方法,R資源等的混淆規則都一般有了,注意一點就是套模板,也要套個時間比較近的,沒有翻車的模板,可以能比較節省自己的時間,畢竟這么多行不一定能快速看出來,打個包出來才發現有問題就尷尬啦。
一般來說,用了混淆的模板後,我們還會有很多項目專屬的需要混淆的部分,例如我們的自定義View,Json解析的實體類,反射用到的類,還有我們依賴的非主流的開源框架,SDK等等。
對於自定義View,很多的模板都會將繼承與View的類用keep指令防止被混淆。有個偷懶的方法就是把自定義View 放入同一個包,再把這個包的類都寫入混淆規則,就可以搞定了。
對於Json解析的實體類,反射用到的類都是同理可得,找到那些不能被移除的,把它們寫入自己的混淆規則裡面。
所以如果在做項目時,有提前想到要給項目做混淆的,在導入依賴時就順手把對應混淆規則寫了,那事後就快活似神仙了。
首先,先判斷下它是否內置了混淆規則。如果不聲明它的混淆規則也正常運行,說明已經它帶了混淆。
但是生活往往不會一帆風順,一般來說會有各種報錯,所以還是需要對它聲明混淆。
最簡單的辦法就是找到依賴的這個包,就這個包的類都寫入混淆規則。例如:
項目里導入了一個非主流的開源庫,然後我需要對它寫入混淆規則,確保它能正常工作。
這時候不可以認為直接去使用它的地方,將有關它 import的類 keep class 就可以。
因為可能它內部還會使用包內其他類,所以最好仔細排查,最簡(tou)單(lan)就是把這個包的類都 用 keep 指令,防止它們被混淆。如下所示:
一般來說就可以防止這個開源庫里的類被混淆了。
例如
先使用 -libraryjars 命令 ,對導入的jar包和 so 文件進行聲明保留它們。
如果依舊出錯,嘗試去External library文件夾 或者使用 這個SDK的地方 找到這個 SDK的包找到,並把這個包里的類 都用 keep 指令保持不被移除。如:
根據包名,寫入混淆規則
一般來說,這樣就可以避免這個SDK的類被混淆啦
好了,最後附上一份自己做的項目的混淆規則(偽模板)