android代码高级混淆

转载请注明出处:https://blog.csdn.net/u011038298/article/details/90033216

混淆介绍

混淆包括四个步骤,shrinker(压缩), optimizer(优化),obfuscator(混淆),preverifier(预校验)。

压缩(Shrinker):检测并移除未被使用的类和成员。

优化(Optimizer):在字节码级别执行优化,让应用运行的更快。

混淆(Obfuscator):增大反编译难度,类和类成员会被随机命名,可以使用keep声明避免不需要混淆的类。

预校验(Preverifier):预校验代码是否符合Java1.6或者更高的规范(唯一一个与入口类不相关的步骤)

混淆配置

在app/build.gradle文件中配置:

android {
    buildTypes {
        debug {
            // 关闭混淆
            minifyEnabled false
            // 加载混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
        release {
            // 开启混淆
            minifyEnabled true
            // 加载混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
}

在proguard-rules.pro文件中配置:

#-------------------- 基本指令 --------------------#
# 设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的成员
-dontskipnonpubliclibraryclassmembers
# 混淆时不做预校验
-dontpreverify
# 混淆时不记录日志
-verbose
# 忽略警告
-ignorewarning
# 代码优化
-dontshrink
# 不优化输入的类文件
-dontoptimize
# 保留注解不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 保留代码行号,方便异常信息的追踪
-keepattributes SourceFile,LineNumberTable
# 混淆采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# dump.txt文件列出apk包内所有class的内部结构
-dump class_files.txt
# seeds.txt文件列出未混淆的类和成员
-printseeds seeds.txt
# usage.txt文件列出从apk中删除的代码
-printusage unused.txt
# mapping.txt文件列出混淆前后的映射
-printmapping mapping.txt

#---------------------- 不需混淆的Android类 ----------------------#
-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.preference.Preference
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.annotation.**
-keep public class * extends android.support.v7.**
-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.** {*;}

#------------------------- support-v4包 -------------------------#
-dontwarn android.support.v4.**
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v4.** { *; }

#------------------------- support-v7包 -------------------------#
-dontwarn android.support.v7.**
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }

#------------------------ support design ------------------------#
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

#----------- 避免混淆自定义视图类的get/set方法和构造函数 -----------#
-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);
}

#------------------------ 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);
}

#----------------------- 避免Parcelable混淆 -----------------------#
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#----- 避免Serializable接口的子类中指定的某些成员变量和方法混淆 -----#
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

#----- 避免layout中onclick方法(android:onclick="onClick")混淆 -----#
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}

# 避免资源混淆
-keep class **.R$* {*;}
# Natvie 方法不混淆
-keepclasseswithmembernames class * {
    native <methods>;
}
# 避免混淆枚举类
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
# 使用指定文件中的关键字作为方法和字段混淆后的名称
-obfuscationdictionary ./proguard-keys.txt
# 指定一个混淆类名的字典,字典的格式与-obfuscationdictionary相同
-classobfuscationdictionary ./proguard-keys.txt
# 指定一个混淆包名的字典,字典格式与-obfuscationdictionary相同
-packageobfuscationdictionary ./proguard-keys.txt

#----------- 其他第三方混淆配置(详情请参见第三方sdk官网) -----------#

在proguard-keys.txt文件中写入中文生僻字,进行中文混淆

狩狪狫狭狮狯溵溶溷溸溹溻溽溾溿滀滁滂滃沧滆滇滈滉滊涤滍荥滏滐滒滓滖滗滘滙滛滜滝滞滟滠滢滣滦滧滪滫沪滭滮滰滱
渗滳滵滶滹滺浐滼滽漀漃漄漅漈漉溇漋漌漍漎漐漑澙熹漗漘漙沤漛漜漝漞漟漡漤樝樟樠樢样樤樥樦樧樨権横樫樬樭樮樯樰
樱樲樳樴樵樶樷朴树桦樻樼樽樾樿橀橁橂橃橄橅橆橇桡橉橊桥橌橍橎橏橐橑橒橓橔橕橖橗橘橙橚橛橜橝橞橠橡椭橣橤橥橧
橨橩橪橬橭橮橯橰橱橲橳橴橵橶橷橸橹橺橻橼柜橿檀檩檂檃檄檅檆檇檈柽檊檋檌檍檎檏檐檑檒檓档檕檖檗檘檙檚檛桧檝檞
槚檠檡检樯檤檥檦檧昸昹昺昻昼昽昿晀晁时晃晄晅晆晇晈晋晊晌晍晎晏晐晑掂扫抡掅掆掇授掉掊掋掍掎掐掑排掓掔掕挜掖
掘挣掚挂掜掝掞掟掠采探掣掤掦措掫掬掭掮掯掰掱掲掳掴掵掶掸掹掺掻掼掽掾掿拣揁揂揃揅揄揆揇揈揉揊揋揌揍揎揑揓悆
悇悗悘悙悚悛悜悝悞悟悡悢悤崕崖姈姉姊姌姗姎姏姒姕姖姘姙姛姝姞姟姠姡姢姣姤姥奸姧姨姩垝垞垟垠垡垤垥垧垨垩垪垫
垬垭垮垯垰垱垲垲垳垴埯垶垷垸垹垺垺垻垼垽垾垽垿埀埁埂埃埄埅埆埇埈埉埊埋埖埗埘埙埚埛野埝埞域埠垭埢埣埤埥埦埧
埨咈咉咊咋咍咎咐咑咓咔咕咖咗咘咙咚咛咜咝咞咟咠咡咢咣咤咥咦咧咨咩咪咫咬咭咮咯咰咲咳咴咵咶啕咹咺咻呙咽咾咿哂
哃哅哆哇哈哊哋哌哎哏哐哑哒哓哔哕哖哗哘哙哚哛哜哝哞哟哠咔哣哤哦哧哩哪哫哬哯哰唝哵哶哷哸哹哻哼哽哾哿唀唁唂唃
呗唅唆唈唉唊唋唌唍唎唏唑唒唓唔唣唖唗唘唙吣唛唜唝唞唟唠唡唢唣唤唥唦唧唨唩唪唫唬唭唯唰唲唳唴唵唶唷念唹唺唻唼
啇吣唛唜唝唞唟唠唡唢啈啉啋啌唽唾唿啀啁啃啄啅埻崎埽埾埿堀堁堃堄坚堆堇堈堉垩堋堌堍堎堏堐堑堒堓堔堕垴堗堘堙堚
堛堜埚堞堟堠堢堣堥堦堧堨堩堫堬堭堮尧堰报堲堳场姫姬姭姮姯姰姱姲姳姴姵姶姷姸姹姺姻姼姽姾娀威娂娅娆娈娉娊娋娌
娍娎娏娐娑娒娓娔娕娖娗娙娚娱娜娝娞娟娠娡娢娣娤娥娦娧娨娩娪娫娬娭娮娯娰娱娲娳娴娵娷娸娹娺崘崚崛崜崝崞崟岽崡
峥崣崤崥崦崧崨崩崪崫崬崭崮崯崰崱崲嵛崴崵崶崷崸崹崺崻崼崽崾崿嵀嵁嵂悈悊悋悌悍悎悏悐悑悒悓悕悖埌埍城埏埐埑埒
埓埔埕嵃嵄嵅嵆嵇嵈嵉嵊嵋悥悧悩悪悫悭悮悰悱悳悴悷悹悺悻悼悾悿惀惁惂惃惄惆惈惉惊惋惌惍惎惏惐惑惒惓惔惕惖惗惘
惙惚啍啎问啐啑啒启啔啕啖啖啘啙啚啛啜啝哑启啠啡唡埩埪埫埬埭埮埯埰埱埲埳埴埵埶执埸湄湅湆湇湈湉湋湌湍湎湏湐湑
湒湓湔湕湗湙湚湜湝浈湟湠湡湢湤湥湦湨湩湪湫湬湭湮湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溆溇沩溉溊溋溌溍溎溏溑
溒溓溔溕溗溘溙溚溛溞溟溠溡溣溤溥溦溧溨溩惛惜惝惞惠恶惢惣惤惥猰猱猲猳猵犹猷猸猹猺烰烱烲烳烃烵烶烷烸烹烺烻烼
烾烿焀焁焂焃焄焇焈焉焋焌焍焎焏焐焑焒焓焔焕焖焗焘焙焛焜焝焞焟焠焢焣焤焥焧焨焩焪焫焬焭焮焯焱焲焳焴焵焷焸焹焺
焻焼焽焾焿煀煁煂煃煄煅煇煈炼煊煋煌煍煎煏煐渶渷渹渻渼渽渿湀湁湂溬惦惧惨惩惪惫惬惮恼恽惴惵惶惸惺惼惽惾惿愀揔
揕揖揗揘揙揜揝揞揟揠揢揤揥揦煞煟煠煡茕煣狰狱狲狳狴狵狶狷狭狺狻狾狿猀猁猂猃猄猅猆猇猈猉猊猋猌猍猑猒猓猔猕猗
猘狰猚猝猞猟猠猡猢猣猤猥猦猧猨猬猭溭溯溰溱溲涢揧揨揫捂揰揱揲揳援揵揶揷揸揻揼揾揿搀搁搂搃搄搅搇搈搉搊搋搌搎
搏搐搑搒搓搔搕搘搙搚搛搝擀搠搡搢搣搤捶搦搧搨搩搪搫搬搮搰搱搲晒晓晔晕晖晗晘晙晛晜晞晟晠晡晰晣晤晥晦晧晪晫晬
晭晰晱晲晳晴晵晷晸晹晻晼晽晾晿暀暁暂暃暄暅暆暇晕晖暊暋暌暍暎暏暐暑暒暓暔暕暖暗旸暙暚暛暜暝暞暟暠暡暣暤暥檨
檩檪檫檬檭梼檰檱檲槟檴檵檶栎柠檹檺槛檼檽桐檿櫀櫁棹柜櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏累櫑櫒櫔櫕櫖櫗櫘櫙榈栉櫜椟橼櫠
櫡櫢櫣櫤橱櫦槠栌櫩枥橥榇櫭漥漦漧漨漪渍漭漮漯漰漱漳漴溆漶漷漹漺漻漼漽漾浆潀颍潂潃潄潅潆潇潈潉潊潋潌潍潎潏潐
潒潓洁潕潖潗潘沩潚潜潝潞潟潠潡潢潣润潥潦潧煑炜煓煔暖煗煘煚煛煜煝焕煦煨煪煫炀煭煯煰煱煲煳煴煵煶煷煸煹煺煻煼
煿熀熁熂熃熄熅熆熇熈熉熋熌熍熎熏熐熑荧熓熔熕熖炝熘熚熛狲猼猽猾獀犸獂獆獇獈獉獊獋獌獍獏獐獑獒獓獔獕獖獗獘獙

混淆阅读

通过Android逆向助手反编译后截图

猜你喜欢

转载自blog.csdn.net/u011038298/article/details/90033216