對於一款成熟的App,必定會開始涉及安全和性能的問題,這裏就先說一下安全性的問題,今天忽然收到咱們線上某app的安全性檢測報告,一看一千多個安全隱患感受這app徹底無安全性可言,仔細一看其實都是咱們開發過程的一個規範問題,雖然這款app不是我開發的,可是有不少安全隱患我也的確是沒有考慮過,這裏就不得不趕忙拓展補充能量了。html
在Android Studio當中混淆APK,藉助SDK中自帶的Proguard工具,只須要修改build.gradle中的一行配置便可。這個就很簡單了,基本都在用混淆。以前有些過基本混淆規。android
開發過程當中相信你們都會打印一下log查看信息的,特別是接口數據類的日誌,這些日誌一樣會泄露app中的信息,所以release版本的日誌屏蔽是很是重要的。使用原生的Log你們能夠自行封裝一個工具類,在打印日誌以前判斷是不是debug,debug模式下打印日誌。如今log框架也有不少,都有這樣的配置。debug模式判斷:安全
if(BuildConfig.DEBUG){
//is debug
}else{
//is release
}
複製代碼
Android中的四大組件 Activity,Service,Provider,Receiver 四大組件中都會一個共同的屬性:android:exported。而組件安全主要在於android:exported這個屬性,android:exported決定組件是否容許被其餘APP調用。app
自定義權限方法以下:框架
//定義權限
<permission android:name="com.yz.permission.INTENT_OTHER"
android:protectionLevel="normal" />
//申請權限
<uses-permission android:name="com.yz.permission.INTENT_OTHER"/>
<activity
android:name=".TestActivity"
android:exported="true"
android:permission="com.yz.permission.INTENT_OTHER" />
//指定權限
複製代碼
注:四大組件自定義權限方法相同,protectionLevel屬性是指權限的類型。官網給出的說明以下:ide
release版本應該禁止調試,application的android:debuggable屬性設置爲true時,攻擊者能夠經過動態調試來窺探客戶端的數據流和工做流,增長核心程序邏輯被破解的風險。工具
if (0!=(getApplicationInfo().flags&= ApplicationInfo.FLAG_DEBUGGABLE)) {
//程序被修改成可調試狀態!!!
android.os.Process.killProcess(android.os.Process.myPid());
}
複製代碼
簽名是Andriod軟件一種有效的身份標識,簽名時推薦V1和v2所有勾選,簽名說明參考《AS打包簽名》,防止二次打包,判斷簽名是否一致。 獲取apk的簽名hash值與apk的簽名文件的hash值進行判斷,不一致說明apk被二次打包。 獲取簽名hash值的代碼以下:性能
public int getSignature(String packageName) {
PackageManager pm = this.getPackageManager();
PackageInfo pi = null;
int sig = 0;
try {
pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
Signature[] s = pi.signatures;
sig = s[0].hashCode();
} catch (Exception e1) {
sig = 0;
e1.printStackTrace();
}
return sig;
}
複製代碼