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裏面的一段配置代碼
一切就緒後,就是打包了。這裏我就不再多說了,大家可以去看
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();
}