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

http://www.softwareace.cn/?p=1151
這篇文章等是跟大家分享一在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這些,就說明混淆成功啦
發佈了21 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章