這篇文章等是跟大家分享一在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里面的一段配置代碼
一切就緒后,就是打包了。這里我就不再多說了,大家可以去看
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’.大家可以根據報錯去排除問題,
比如說我遇到的一個問題,
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();
}







