代碼混淆:
android apk文件實際也是一種特殊形式的壓縮包,很容易就被人解包反編譯。爲了防止這種情況的發生,就有了代碼混淆技術
在eclipse裏代碼混淆文件是proguard.cfg文件。在android studio中是proguard-rules.pro
以下所有都是在as中講解,eclipse大同小異
代碼混淆通用部分:
#指定代碼的壓縮級別
-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
#保持 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();
}
#避免混淆泛型 如果混淆報錯建議關掉
–keepattributes Signature(此處一般建議配置,在引用第三方庫的時候,不這樣配置會很容易報錯)
如果引用第三方jar包:
#避免gson庫混淆
-keep class com.google.gson.examples.android.model.** { *; }
#避免okhttp混淆
-keep class com.squareup.okhttp.**{*;}
混淆配置文件配置完成後就需要加載配置文件:
android studio:在build.gradle文件
buildTypes {
release {
minifyEnabled true(此處要設置爲true)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
eclipse:在project.properties文件裏:
proguard.config=${sdk.dir}/tools/proguard/proguard-
android.txt:proguard-project.txt
混淆後會生成一個混淆後代碼與源代碼的映射關係文件,保存在mapping.txt:
#混淆前後的映射
-printmapping mapping.txt(可以通過此文件查看對應關係)
版本名稱和版本代號及簽名文件:
版本名稱和版本代號都在 manifest.xml文件中
版本名稱是體現給用戶的,版本代號是面向開發人員的
如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wen_en.aweather"
android:versionCode="10010"
android:versionName=“1.10">
版本代號和版本名稱的更新都是以遞增的形式體現,具體遞增規則隨意
簽名文件是在打包程序的時候使用的:
一般的簽名(非系統簽名):
選擇項目 export 選擇export android application
下一步
輸入項目名稱(默認即可)
下一步
選擇已有的簽名文件(keystore)或者新建keystore
下一步
按照提示即可完成
系統簽名:
將帶簽名文apk與系統簽名文件放在同一文件夾內(系統簽名文件需要在android源碼環境下編譯)
如:
前三個就是系統簽名文件,後一個就是待簽名apk
然後在dos界面定位到當前文件夾 輸入:
java -jar signapk.jar platform.x509.pem platform.pk8 DemoKindgarder.apk Signapk.apk
Signup.apk爲簽名後的文件(名字自定義)
另外 如果需要籤系統名 需要在manifest.xml 中添加
package="com.example.clientapptest"
android:sharedUserId="android.uid.system"
android:versionCode="37"
android:versionName="3.7" >
android:sharedUserId=“android.uid.system"這一句代表此app爲系統應用
apk文件的反編譯及回編譯:
我在實際項目中用的比較少,只在以前做漢化的時候用過 推薦參考
http://android.tgbus.com/Android/tutorial/201103/346338.shtml
另外 如果你需要查看你簽名文件的sha1碼:
在控制檯輸入命令。
cd .android
開發模式使用 debug.keystore,命令爲:keytool -list -v -keystore debug.keystore
發佈模式使用 apk 對應的 keystore,命令爲:keytool -list -v -keystore apk的keystore
得到: