摘自:http://www.cnblogs.com/androidsuperman/p/4396889.htmljavascript
首先,須要準備的工做:html
1 用戶協議(能夠是本地html資源,也能夠是經過webview調用遠程url連接地址)。java
2 簽名文件(打包簽名文件,能夠是公司之前這個項目的簽名文件)。android
3 程序logo圖標。web
4 其餘東西(版本代號,應用截圖,宣傳文案,宣傳視頻,合做首發相關信息)。安全
須要配置的項目:服務器
1 清理日誌調用(log日誌若是發版時不清處,影響應用性能),版本代號,,版本名稱。app
2 編譯程序,簽名程序(簽名文件必定要保留,記住是必定)。ide
3 發佈前完全檢查通常程序。性能
4 檢查資源是不是最新的。
5 確保遠程服務器已經準備就緒。
6 其餘檢查項(好比地圖key,用戶協議,公司以及logo)。
差別化功能的檢查:
1 不一樣渠道應用功能的檢查。
2 不一樣android版本的業務功能檢查。
3 不一樣機型的業務功能檢查。
代碼混淆:
優勢:
1 字節碼優化。
2 保護代碼,防止篡改和安全保護。
3 壓縮APK體積,清除無用代碼。
4 減小jar包體積。
5 將代碼變爲功能等價可是難以閱讀的代碼。
缺點:
調試變得困難(混淆後,反饋的異常信息中是混淆後的邏輯代碼,固然有辦法解決的啦,後面講)。
如何混淆代碼: 混淆器經過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。
修改project.properties
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
|
# This file is automatically generated by Android Tools.
# Do not modify
this
file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
#
"ant.properties"
, and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment
this
(available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-
19
將proguard.config前面的註釋去掉
修改proguard-project.txt
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By
default
, the flags in
this
file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http:
//developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified
class
name to the JavaScript
interface
#
class
:
#-keepclassmembers
class
fqcn.of.javascript.
interface
.
for
.webview {
#
public
*;
#}
若是在程序中使用了第三方的jar包,在混淆後致使出錯,這時咱們須要在proguard-project.txt中去進行相應的配置, 來讓其在混淆時不要混淆相應的jar包。對改配置文件中的相關配置解釋以下:
-keep
public
class
*
extends
android.app.Activity 【不進行混淆類名的類,保持其原類名和包名】
-keep
public
abstract
interface
com.asqw.android.Listener{
public
protected
<methods>; 【全部
public
protected
的方法名不進行混淆】
}
-keep
public
class
com.asqw.android{
public
void
Start(java.lang.String); 【對該方法不進行混淆】
}
-keepclasseswithmembernames
class
* { 【對全部類的
native
方法名不進行混淆】
native
<methods>;
}
-keepclasseswithmembers
class
* { 【對全部類的指定方法的方法名不進行混淆】
public
<init>(android.content.Context, android.util.AttributeSet);
}
-keepclassmembers
class
*
extends
android.app.Activity {【對全部類的指定方法的方法名不進行混淆】
public
void
*(android.view.View);
}
-keepclassmembers
enum
* {【對枚舉類型
enum
的全部類的如下指定方法的方法名不進行混淆】
public
static
**[] values();
public
static
** valueOf(java.lang.String);
}
-keep
class
*
implements
android.os.Parcelable {【對實現了Parcelable接口的全部類的類名不進行混淆,對其成員變量爲Parcelable$Creator類型的成員變量的變量名不進行混淆】
public
static
final
android.os.Parcelable$Creator *;
}
-keepclasseswithmembers
class
org.jboss.netty.util.internal.LinkedTransferQueue {【對指定類的指定變量的變量名不進行混淆】
volatile
transient
org.jboss.netty.util.internal.LinkedTransferQueue$Node head;
volatile
transient
org.jboss.netty.util.internal.LinkedTransferQueue$Node tail;
volatile
transient
int
sweepVotes;
}
-keep
public
class
com.unionpay.** {*; }【對com.unionpay包下全部的類都不進行混淆,即不混淆類名,也不混淆方法名和變量名】
通過上面這兩部以後反編譯後就能混淆了,可是四大組件還在,爲何四大組件還在呢,由於四大組件是在清單文件中進行配置的, 若是混淆後就不能根據清單文件的配置去尋找了。
若是對於一些本身的代碼中要想提供出來讓別人經過反射調用的方法時,咱們不想讓部分代碼被混淆,或者是咱們使用別人提供的第三方jar包, 由於第三方的jar包通常都是已經混淆過的,咱們要是再混淆就會報錯了,因此咱們要保證這些內容不用混淆,這裏咱們只需修改這個文件,而後加上後面的一句話, 他就不會混淆咱們給出的內容
-keepattributes *Annotation*
-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.BackupAgent
-keep
public
class
*
extends
android.preference.Preference
-keep
public
class
*
extends
android.support.v4.app.Fragment
-keep
public
class
*
extends
android.app.Fragment
-keep
public
class
com.android.vending.licensing.ILicensingService
-keep
class
net.youmi.android.** {
*;
}
來源: <AndroidNote/代碼混淆.md at master · CharonChui/AndroidNote>
|
混淆中如何清除日誌信息:
1
2
3
4
5
6
7
8
|
-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(...);
}
|
使用這個配置時,必定要注意-dontoptimize,配置。
don‘t optimize 不要優化;將會會關閉優化,致使日誌語句不會被優化掉。