Android studio 使用心得(五)—代碼混淆和破解apk



這篇文章等是跟大家分享一在Android studio 進行代碼混淆配置。之前大家在eclipse上也弄過代碼混淆配置,其實一樣,大家可以把之前在eclipse上的配置文件直接拿過來用。不管是.cfg文件還是.txt文件都一樣。

先給大家貼一個混淆模板吧。注釋很清楚。是我目前一個項目用的proguard.cfg配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#指定代碼的壓縮級別
-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  class_files.txt
#未混淆的類和成員
-printseeds seeds.txt
#列出從 apk 中刪除的代碼
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt
 
#####################記錄生成的日志數據,gradle build時 在本項目根目錄輸出-end################
 
 
################<span></span>混淆保護自己項目的部分代碼以及引用的第三方jar包library#########################
#-libraryjars libs/umeng-analytics-v5. 2.4 .jar
#-libraryjars libs/alipaysd<span></span>k.jar
#<span></span>-libraryjars libs/alipaysecsdk.jar
#-libraryjars libs/alipayutdid.jar
#-libraryjars libs/wup- 1.0 . 0 -SNAPSHOT.jar
#-libraryjars libs/weibosdkcore.jar
 
 
#三星應用市場需要添加:sdk-v1. 0.0 .jar,look-v1. 0.1 .jar
#-libraryjars libs/sdk-v1. 0.0 .jar
#-libraryjars libs/look-v1. 0.1 .jar
 
#我是以libaray的形式引用了一個圖片加載框架,如果不想混淆 keep 掉
-keep  class  com.nostra13.universalimageloader.** { *; }
 
#友盟
-keep  class  com.umeng.**{*;}
 
#支付寶
-keep  class  com.alipay.android.app.IAliPay{*;}
-keep  class  com.alipay.android.app.IAlixPay{*;}
-keep  class  com.alipay.android.app.IRemoteServiceCallback{*;}
-keep  class  com.alipay.android.app.lib.ResourceMap{*;}
 
 
#信鴿推送
-keep  class  com.tencent.android.tpush.**  {* ;}
-keep  class  com.tencent.mid.**  {* ;}
 
 
#自己項目特殊處理代碼
 
#忽略警告
-dontwarn com.veidy.mobile.common.**
#保留一個完整的包
-keep  class  com.veidy.mobile.common.** {
     *;
  }
 
-keep  class   com.veidy.activity.login.WebLoginActivity{*;}
-keep  class   com.veidy.activity.UserInfoFragment{*;}
-keep  class   com.veidy.activity.HomeFragmentActivity{*;}
-keep  class   com.veidy.activity.CityActivity{*;}
-keep  class   com.veidy.activity.ClinikActivity{*;}
 
#如果引用了v4或者v7包
-dontwarn android.support.**
 
############<span></span>混淆保護自己項目的部分代碼以及引用的第三方jar包library-end##################
 
-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*(...);
}
 
#保持 native 方法不被混淆
-keepclasseswithmembernames  class  * {
     native <methods>;
}
 
#保持自定義控件類不被混淆
-keepclasseswithmembers  class  * {
     public  <init>(android.content.Context, android.util.AttributeSet);
}
 
#保持自定義控件類不被混淆
-keepclasseswithmembers  class  * {
     public  <init>(android.content.Context, android.util.AttributeSet,  int );
}
#保持自定義控件類不被混淆
-keepclassmembers  class  extends  android.app.Activity {
    public  void  *(android.view.View);
}
 
#保持 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><span></span>;
     ! private  <methods>;
     private  void  writeObject(java.io.ObjectOutputStream);
     private  void  readObject(java.io.ObjectInputStream);
     java.lang.Object writeReplace();
     java.lang.Object readResolve();
}
 
#保持枚舉 enum 類不被混淆 如果混淆報錯,建議直接使用上面的 -keepclassmembers  class  * implements  java.io.Serializable即可
#-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
 
#移除log 測試了下沒有用還是建議自己定義一個開關控制是否輸出日志
#-assumenosideeffects  class  android.util.Log {
#     public  static  boolean  isLoggable(java.lang.String,  int );
#     public  static  int  v(...);
#     public  static  int  i(...);
#     public  static  int  w(...);
#     public  static  int  d(...);
#     public  static  int  e(...);
#}

大家可以先看看這篇文章

Android studio 使用心得(四)—android studio 多渠道打包(二)

了解一下打包過程。

然后大家看看打包的配置文件build.gradle里面的一段配置代碼

  //混淆,新版本是ninifyEnabled不再是runproguard
    minifyEnabled true
 //加載默認混淆配置文件及自定義混淆 配置
   proguardFiles getDefaultProguardFile(‘proguard-android.txt’),’proguard.cfg’
 
我們設置minifyEnabled true,就會在打包的時候進行代碼混淆處理. 其中proguard-android.txt不用管,在sdk目錄里面,我們主要是配置了proguard.cfg文件。可能大家直接在android studio創建項目不會有這個文件,而是 proguard-rules.pro文件,其實一樣的,我這里是因為項目是從eclipse遷移過來的,之前在eclipse上混淆是 proguard.cfg文件.

 

一切就緒后,就是打包了。這里我就不再多說了,大家可以去看

 

Android studio 使用心得(四)—android studio 多渠道打包

Android studio 使用心得(四)—android studio 多渠道打包(二)

 

我這里用第二種,gradle 命令打包.我建議大家在gradle clean后,不要直接gradle build,而是用gradle assembleRelease .用gradle build第一是因為慢,第二,我自己項目打包時這樣遇到一個錯誤,現在也沒解決

Lint found errors in the project; aborting build.

Fix the issues identified by lint, or add the following to your build script to proceed with errors:

android {
lintOptions {
abortOnError false
}
}

可以我明明已經設置

//執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,我們可以將其關掉。
lintOptions {
abortOnError false
}
搞不清楚。希望大家誰知道的也告訴下我。

 

當我們執行命令 gradle build或者gradle assembleRelease后,會自動進行混淆操作。。。直到成功。

各位 注意下,如果你的混淆配置有問題,可能會報錯。Execution failed for task ‘:proguardUmengRelease’.大家可以根據報錯去排除問題,

比如說我遇到的一個問題,

 

 

 
 
出現這個問題是因為配置文件里面我有一行 keepattributes Signature #避免混淆泛型 , 如果混淆報錯建議關掉,因為下面這個就會避免混淆泛型
-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();
}
 
 
大家可以看到這個錯誤提示,有一個line 168 ,這個是行號,但是各位注意了這個行號定位不是特別精准,只能一個大概的定位。
 
 
 
混淆真正的成功與否,需要我們自己來親自驗證,那就是我們來破解自己的apk.我上傳了 一個我使用的破解工具
鏈接: http://pan.baidu.com/s/1o60tLj0 密碼: 3bqp
 
1,解壓apk.用好壓就能直接解壓,獲取到classes.dex文件
2.用dex2jar這個工具來生成classes_dex2jar文件.
 a,把剛剛解壓出來的classes.dex文件放到dex2jar根目錄,然后用dos命令定位到該目錄,執行命令dex2jar.bat classes.dex直到done.

 
2.細心的朋友就會發現多了一個jar文件。
.
 c.然后用jd-gui打開這個jar文件,就能看到項目的結構了。。
 
 
如果有a.b.c這些,就說明混淆成功啦
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM