Android 簽名機制,項目簽名,ANT打包,優化,發佈總結

Android 簽名機制,項目簽名,ANT打包,優化,發佈總結


Android APK 簽名打包的實現原理:

 
實際開發中,一次完整的Android項目打包要進行以下的幾步:編譯、代碼混淆、打包apk、簽名apk、apk優化。
 
首先,需要有一個 keystore,他是apk的數字簽名,在簽名apk時候需要。
獲取keystore的方法. CMD 進入到jdk的bin目錄   keytool -genkey -alias androidapk.keystore -keyalg RSA -validity 20000 -keystore androidapk.keystore 
其中參數-validity爲證書有效天數,按照提示完成。

Android apk 的 手動打包簽名優化
 

簽名:

jarsigner -verbose  -keystore  androidapk.keystore  -signedjar  app_signed.apk  app.apk  androidapk.keystore
-keystore: keystore的名稱
-signedjar  app_signed.apk: 指定簽名後生成的APK名稱
 app.apk: 目標
APK
然後按回車:會要求輸入剛纔設置的密碼,輸入後按回車就開始簽名了。

查看簽名jarsigner -verify app_signed.apk                                  

查看是否簽名,如果已經簽名會打印 "jar verified".

jarsigner -verify -verbose -certs app_signed.apk      

查看簽名詳細信息。


apk優化

通過zipalign工具進行優化apk(android自帶的工具,./build/tools/zipalign)

zipalign -v 4  app_signed.apk androidres.apk   對apk優化

zipalign -c -v 4  androidres.apk                 查看apk是否經過優化


ant 自動化打包工具 
 
在 ant release 的時候,會自動進行 編譯,混淆,打包,簽名,和優化操作。其實現過程如下:

在${sdk.dir}/tools/ant/build.xml 查找 release target 源碼如下:


  <target name="release"
                depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"
                description="Builds the application in release mode.">
  </target>

代碼混淆規則:
如果在project.properties中配置了proguard.config=proguard.cfg,release的時候會自動進行代碼混淆。在${sdk.dir}/tools/ant/build.xml可以找到相應的target。

<target name="-release-obfuscation-check">
        <echo level="info">proguard.config is ${proguard.config}</echo>
        <condition property="proguard.enabled" value="true" else="false">
            <and>
                <isset property="build.is.mode.release" />
                <isset property="proguard.config" />
            </and>
        </condition>
        <if condition="${proguard.enabled}">
            <then>
                <echo level="info">Proguard.config is enabled</echo>
                <!-- Secondary dx input (jar files) is empty since all the
                     jar files will be in the obfuscated jar -->
                <path id="out.dex.jar.input.ref" />
            </then>
        </if>
    </target>
 
proguard.enabled的依據就是在release模式下,並且設置proguard.config這個屬性

簽名規則:簽名過程中需要檢查keystore和密碼

 
<target name="-release-sign" if="has.keystore" >
        <!-- only create apk if *not* a library project -->
        <do-only-if-not-library elseText="Library project: do not create apk..." >
            <sequential>
                <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk" />
                <!-- Signs the APK -->
                <echo level="info">Signing final apk...</echo>
                <signapk
                        input="${out.packaged.file}"
                        output="${out.unaligned.file}"
                        keystore="${key.store}"
                        storepass="${key.store.password}"
                        alias="${key.alias}"
                        keypass="${key.alias.password}"/>
                <!-- Zip aligns the APK -->
                <zipalign-helper
                        in.package="${out.unaligned.file}"
                        out.package="${out.final.file}" />
                <echo level="info">Release Package: ${out.final.file}</echo>
            </sequential>
        </do-only-if-not-library>
        <record-build-info />
    </target>

自定義打包規則:
 
在 build.xml 中導入自定義的打包規則的文件, <import file="custom_rules.xml" optional="true" />
 
然後 可根據 release中的規則和順序(depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"),自定義自己的規則。
 
custom_rules.xml中 重新實現這些字段對應的規則方法。一般都在最後一項“-post-bulid”中完成。
 
如xxxxx項目中,在編譯之前先檢查libs庫中的.so文件是否一致 簽名採用自己的簽名服務器去做等。實現代碼如下:
 
<taskdef
        name="SoChecker"
        classname="com.netease.apkchecker.AllSoChecker"
        classpath="apkchecker.jar" />
<target name="-post-build" depends="custom_sign,protect" >
<SoChecker apkPath="${out.final.file}" />
</target>



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