Android簽名打包及代碼混淆

代碼混淆:

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


得到: 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章