android代碼混淆作用,Android分享:代碼混淆那些事

1) 前言

ProGuard是一個開源的Java代碼混淆器。它可以混淆Android項目里面的java代碼,對的,你沒看錯,僅僅是java代碼。它是無法混淆Native代碼,資源文件drawable、xml等。

2) ProGuard作用

壓縮: 移除無效的類、屬性、方法等

優化: 優化字節碼,并刪除未使用的結構

混淆: 將類名、屬性名、方法名混淆為難以讀懂的字母,比如a,b,c

3) 混淆注意事項

1. 不能混淆

在AndroidManifest中配置的類,比如四大組件

JNI調用的方法

反射用到的類

WebView中JavaScript調用的方法

Layout文件引用到的自定義View

一些引入的第三方庫(一般都會有混淆說明的)

這里推薦兩個開源項目,里面收集了一些第三方庫的混淆規則

不難理解,混淆之后,類名會變成a,b,c這種,通過包名+類名自然就會找不到該類了,自然就會出現ClassNotFoundException異常。這里推薦一篇文章:

http://www.itnose.net/detail/6043297.html

2. Log處理

我們都知道,使用Log的時候,需要用到TAG,然而TAG我們一般都會寫成:

private static final String TAG = MainActivity.class.getSimpleName()

這時候MainActivity如何被混淆的話,log輸出信息就會變成V/a:xxxxxxx,所以為了讓log輸出信息維持原狀,可以將TAG處理成固定的字符串:

private static final String TAG = "MainActivity"

正好Android Studio里面的Live Templates

1bd1514a750dfaff.jpg

能讓你輕輕松松的聲明TAG

61eed0700b6af43b.gif

3. Crash信息處理

代碼混淆的時候記得加上在混淆文件里面記得加上這句:

# keep住源文件以及行號

-keepattributes SourceFile,LineNumberTable

否則你看到的崩潰信息就會變成這樣子(圖片來自bugly)

c668dbffd07b5d5f.png

4)ProGuard使用

1. 常用語法

保留

-keep {Modifier} {class_specification} 保護指定的類文件和類的成員

-keepclassmembers {modifier} {class_specification} 保護指定類的成員,如果此類受到保護他們會保護的更好

-keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。

-keepnames {class_specification} 保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)

-keepclassmembernames {class_specification} 保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)

-keepclasseswithmembernames {class_specification} 保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)

-printseeds {filename} 列出類和類的成員-keep選項的清單,標準輸出到給定的文件

壓縮

-dontshrink 不壓縮輸入的類文件

-printusage {filename}

-whyareyoukeeping {class_specification}

優化

-dontoptimize 不優化輸入的類文件

-assumenosideeffects {class_specification} 優化時假設指定的方法,沒有任何副作用

-allowaccessmodification 優化時允許訪問并修改有修飾符的類和類的成員

混淆

-dontobfuscate 不混淆輸入的類文件

-obfuscationdictionary {filename} 使用給定文件中的關鍵字作為要混淆方法的名稱

-overloadaggressively 混淆時應用侵入式重載

-useuniqueclassmembernames 確定統一的混淆類的成員名稱來增加混淆

-flattenpackagehierarchy {package_name} 重新包裝所有重命名的包并放在給定的單一包中

-repackageclass {package_name} 重新包裝所有重命名的類文件中放在給定的單一包中

-dontusemixedcaseclassnames 混淆時不會產生形形色色的類名

-keepattributes {attribute_name,…} 保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

-renamesourcefileattribute {string} 設置源文件中給定的字符串常量

通配符匹配規則

通配符

規則

匹配單個字符

*

匹配類名中的任何部分,但不包含額外的包名

**

匹配類名中的任何部分,并且可以包含額外的包名

%

匹配任何基礎類型的類型名

*

匹配任意類型名 ,包含基礎類型/非基礎類型

...

匹配任意數量、任意類型的參數

匹配任何構造器

匹配任何字段名

匹配任何方法

*(當用在類內部時)

匹配任何字段和方法

$

指內部類

2. Android Studio中使用方法

按照上面的語法規則編寫proguard-rules.pro后,需要在build.gradle中配置,需要混淆的時候,設置minifyEnabled為true即可

buildTypes {

debug {

minifyEnabled false

}

release {

signingConfig signingConfigs.release

minifyEnabled true

proguardFiles 'proguard-rules.pro'

}

}

3. ProGuard的輸出文件說明

混淆后,會在/build/proguard/目錄下輸出下面的文件

dump.txt 描述apk文件中所有類文件間的內部結構。

mapping.txt 列出了原始的類,方法,和字段名與混淆后代碼之間的映射。

seeds.txt 列出了未被混淆的類和成員

usage.txt 列出了從apk中刪除的代碼

當我們需要處理crash log的時候,就可以通過mapping.txt的映射關系找到對應的類,方法,字段等。方法如下:

sdk\tools\proguard\bin 目錄下有個retrace工具可以將混淆后的報錯堆棧解碼成正常的類名

window下為retrace.bat,linux和mac為retrace.sh,

使用方法如下:

將crash log保存為yourfilename.txt

拿到版本發布時生成的mapping.txt

執行命令retrace.bat -verbose mapping.txt yourfilename.txt

所以我們每次打包版本都需要保存最新的mapping.txt文件。如果要使用到第三方的crash統計平臺,比如bugly,還需要我們上傳APP版本對應的mapping.txt.每次都要保存最新的mapping文件,那不就很麻煩?放心,gradle會幫到你,只需要在bulid.gradle加入下面的一句。每次我們編譯的時候,都會自動幫你保存mapping文件到本地的。

android {

applicationVariants.all { variant ->

variant.outputs.each { output ->

if (variant.getBuildType().isMinifyEnabled()) {

variant.assemble.doLast{

copy {

from variant.mappingFile

into "${projectDir}/mappings"

rename { String fileName ->

"mapping-${variant.name}.txt"

}

}

}

}

}

......

}

}

5) 參考

6) 后話

打個小廣告,推薦下自己的:Android-Dev-Favorites,里面收集了Android開發的干貨,并且會不定期更新哦。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370831.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

echarts圖形,圖形自適應窗口大小

一個頁面只有一個echarts圖形時,可以寫為myChart.setOption(option);window.onresize myChart.resize;一個頁面含有多個echarts圖形時,則只有一個圖形可自適應窗口大小,另外一個則不能隨窗口大小而改變圖形大小,解決辦法為在每一…

施工部署主要不包括_建筑工程施工方案及培訓實例

[南京]大型土石方工程施工方案本資料為[南京]大型土石方工程施工方案格,共43頁。內容簡介:本工程位于南京化工園內,揚子玉帶揚巴路附近,工程項目為江蘇成品油管道配設施揚子玉帶油庫套油庫工程,由中國石化股份有限公司…

Markdown 進階

目錄 markdown進階語法 內容目錄加強代碼塊腳注流程圖時序圖LaTeX公式 markdown進階語法 內容目錄 使用 [TOC] 引用目錄,將 [TOC] 放至文本的首行,編輯器將自動生成目錄有一些編輯器不支持[TOC]標記 加強代碼塊 使用3個 "" “語言名稱”…

Python 字典 values() 方法

描述 Python 字典 values() 方法以列表形式(并非直接的列表,若要返回列表值還需調用list函數)返回字典中的所有值。 語法 values() 方法語法: D.values() 參數 無。返回值 以列表形式返回字典中的所有值。 實例 以下實例展示了 va…

適用于Atom Feed的Spring MVC

如何僅使用兩個類就將提要(Atom)添加到Web應用程序? Spring MVC呢? 這是我的假設: 您正在使用Spring框架 您有一些要發布在供稿中的實體,例如“新聞” 您的“新聞”實體具有creationDate,tit…

python數據類型所占字節數_python標準數據類型 Bytes

預備知識: bin(): """ Return the binary representation of an integer. >>> bin(2796202) 0b1010101010101010101010 """ pass ord(): """ Return the Unicode code point for a one-character…

java第六次作業

《Java技術》第六次作業 (一)學習總結 1.用思維導圖對本周的學習內容進行總結。 2.當程序中出現異常時,JVM會依據方法調用順序依次查找有關的錯誤處理程序。可使用printStackTrace 和getMessage方法了解異常發生的情況。閱讀下面的程序&#…

華為鴻蒙不再孤,華為鴻蒙OS系統不再孤單!又一款國產系統啟動內測:再掀國產替代化...

【5月10日訊】相信大家都知道,備受廣大花粉們期待的鴻蒙OS系統終于開始推送公測版本了,并且適配機型也開始不斷地增多,而根據華為官方最新消息,華為鴻蒙OS系統將會在6月份開始大規模推送正式版鴻蒙系統,這無疑將會成為…

Spring系列合并

Spring Collection合并是我第一次遇到的功能,它是對StackOverflow 問題的回答 這是一種創建基本集合(列表,集合,地圖或屬性)并在其他Bean中修改此基本集合的方法,下面通過一個示例對此進行最好的解釋- 考慮…

CSS 水平垂直居中

方法一&#xff1a; 容器確定寬高&#xff1a;知識點&#xff1a;transform只能設置在display為block的元素上。 <head> <meta charset"UTF-8"> <title>Title</title> <style type"text/css"> #container{…

linux怎么進入文件夾_Linux基礎命令《上》

上一節介紹了VMware中安裝centos7以及克隆系統&#xff0c;之中用到的幾個命名還都是開發不常用的&#xff0c;這節課就準備講解一下入門的Linux命名&#xff0c;都是日常使用的。首先呢&#xff0c;我們進入系統后&#xff0c;得先知道我是誰&#xff0c;我在哪兒&#xff1f;…

UML學習(一)-----用例圖

1、什么是用例圖 用例圖源于Jacobson的OOSE方法&#xff0c;用例圖是需求分析的產物&#xff0c;描述了系統的參與者與系統進行交互的功能&#xff0c;是參與者所能觀察和使用到的系統功能的模型圖。它的主要目的就是幫助開發團隊以一種可視化的方式理解系統的功能需求&#xf…

首款鴻蒙系統終端n,榮耀智慧屏正式發布,首款搭載鴻蒙系統終端,家庭C位新選擇...

原標題&#xff1a;榮耀智慧屏正式發布&#xff0c;首款搭載鴻蒙系統終端&#xff0c;家庭C位新選擇智能手機的普及率越來越高&#xff0c;其所能夠承擔的功能也越來越多&#xff0c;電視機對于很多中青年的用戶來講&#xff0c;更多的時候就是個擺設。在家庭中&#xff0c;看電…

oracle如何保證數據一致性和避免臟讀

oracle通過undo保證一致性讀和不發生臟讀 1.不發生臟讀2.一致性讀3. 事務槽&#xff08;ITL&#xff09;小解1.不發生臟讀 例如&#xff1a;用戶A對表更新了&#xff0c;沒有提交&#xff0c;用戶B對進行查詢&#xff0c;沒有提交的更新不能出現在用戶的查詢結果中 舉例并通個d…

Google Guava BloomFilter

當Guava項目發布版本11.0時&#xff0c;新添加的功能之一是BloomFilter類。 BloomFilter是唯一的數據結構&#xff0c;用于指示元素是否包含在集合中。 使BloomFilter有趣的是&#xff0c;它將指示元素是否絕對不包含或可能包含在集合中。 永遠不會出現假陰性的特性使BloomFil…

php 編程祝新年快樂_用于測試自動化的7種編程語言

導讀&#xff1a;本文重點介紹測試自動化中排名前七位的編程語言。當人們想要開始做自動化測試&#xff0c;此時卻需要開發自動化測試腳本&#xff0c;也就是要學習一門編程語言。那么&#xff0c;我們怎樣邁出這一步&#xff1f;也有你已經精通一種編程語言&#xff0c;也可以…

Day1 了解web前端

Day1 了解web前端 一.職業發展路線: 前端頁面制作、前端開發、前端架構師 二.1)前端工程師主要職責: 利用HTML/CSS/JavaScript等各種Web技術進行客戶端產品的開發。完成客戶端程序&#xff08;也就是瀏覽器端&#xff09;的開發&#xff0c;同時結合后臺技術模擬整體效果&am…

已阻止應用程序訪問圖形硬件_玩轉智能硬件之Jetson Nano(三)深度學習環境搭建...

0、前言iotboy&#xff1a;玩轉智能硬件&#xff08;一&#xff09;Jetson Nano安裝篇?zhuanlan.zhihu.comiotboy&#xff1a;玩轉智能硬件&#xff08;二&#xff09;Jetson Nano配置篇?zhuanlan.zhihu.com在玩轉智能硬件&#xff08;一&#xff09;和&#xff08;二&#x…

Vue.js開發環境搭建的介紹

包含了最基礎的Vue.js的框架&#xff0c;包含了打包工具和測試工具&#xff0c;開發調試的最基本的服務器&#xff0c;不需要關注細節&#xff0c;只需關注Vuejs對項目的實現 npm在國內的網絡使用較慢&#xff0c;所以推薦下載安裝淘寶的鏡像 1&#xff1a; 2&#xff1a;安裝c…

html文件轉換html格式,pdf文件怎么轉換成html格式

PDF文件怎么轉換成html格式呢&#xff1f;html格式其實就是網頁格式&#xff0c;PDF文件和網頁文件一般情況下是兩種完全不搭邊的格式&#xff0c;但是不可否定的是辦公室的多樣化總有人會有這樣的需求&#xff0c;只要有需求就會有其相應的解決方案。我們可以利用PDF轉Word一樣…