Android 混淆打包 ant

爲何要寫,由於真的能用到,而且若是用的時候不會,還要查不少,第一次估計要搞幾天(2天,可能我比較笨吧)。寫出來分享一下,其實主要是記錄一下,方便之後查閱,固然更但願能幫助到一些須要的人。html

ant打包好處有什麼java

在eclipse中當咱們的android項目須要打包出來的時候,每每是手動打包,若是有簽名文件則須要輸密碼,選擇輸出目錄等等操做,很麻煩。打包一個apk還好,當須要打包多個apk的時候,好比發佈應用時須要打包各個平臺的渠道包,幾十上百個渠道號,一旦有改動或者版本升級時須要從新打包的時候,手動打包就不是很好的方式了。這時候能夠用ant自動打包。android

什麼是渠道號web

android開發後,將項目進行打包,生成apk,這個apk文件能夠放到不一樣的應用市場,如360,應用寶,豌豆莢等。那當發佈到這些應用市場上以後,怎麼統計哪一個市場的下載量比較多,哪一個市場的推廣效果比較好呢?這就須要在開發中植入不一樣的渠道號,對應不一樣的渠道號,打包生成不一樣的apk,而後將它們放到不一樣的市場上。這樣就能夠達到統計不一樣市場的效果了apache

下載ANTless

 百度「ant」,到Apache ant  官網,download。而後下載解壓到你的磁盤中。eclipse

而後在環境變量中配置ant的路徑(在cmd中可使用ant命令,這個就不說了)。ui

還有就是還要在環境變量中配置好Android SDK的路徑(可使用adb,andriod等命令就對了,這個也不須要說了,相信你們都已經配置好了)this

ant配置好以後在cmd裏面輸入antspa

Buildfile: build.xml does not exist!  
Build failed,說明配置完成。

 

ANT打包

進入本身的工程目錄,執行命令:「android update project -p   ./ 」參數p表示路徑, ./表示當前路徑

執行結果以下

Updated local.properties  
No project name specified, using Activity name 'MainActivity'.  
If you wish to change it, edit the first line of build.xml.  
Added file E:\E\eoeandroid\MyDialog\build.xml  
Updated file E:\E\eoeandroid\MyDialog\proguard-project.txt  
It seems that there are sub-projects. If you want to update them  
please use the --subprojects parameter.

在eclipse中刷新項目,能夠看到多瞭如下兩個文件

build.xml以下

 <?xml version="1.0" encoding="UTF-8"?>
<project name="MainActivity" default="help">
    <property file="local.properties" />
    <property file="ant.properties" />
    <property environment="env" />
    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
        <isset property="env.ANDROID_HOME" />
    </condition>
    <loadproperties srcFile="project.properties" />
    <!-- quick check on sdk.dir -->
    <fail
            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
            unless="sdk.dir"
    />
    
    <import file="custom_rules.xml" optional="true" /> <!-- 這個很重要 下面講 -->
    <!-- version-tag: 1 -->
    <import file="${sdk.dir}/tools/ant/build.xml" />
</project>

 custom_rules.xml以下

 <?xml version="1.0" encoding="UTF-8"?>
<project name="" >
    <!--
     change this !!!
     set ANDROID_HOME env PATH to SDK HOme
    -->
    <property
        name="keystore"
        value="android.keystore" />
    <property
        name="keystore.password"
        value="your password" />
    <property
        name="key.alias"
        value="android.keystore" /><!-- 這裏折磨了我好久 -->
    <property
        name="key.password"
        value="your password" />
    <!-- //////////////////////////////////////////////////////////////////////////////////////// -->
    <target
        name="mytest"
        depends="release" >
        <echo>
 signing the unsigned apk to final product apk ...
        </echo>
    </target>
    <!-- build channel macro -->
    <macrodef name="bc" >
        <!-- must set channel.name param -->
        <attribute name="channelName" />
        <sequential>
            <echo message="*** CHANNEL NAME: @{channelName}" />
            <!-- replace channel in AndroidManifest.xml -->
            <replaceregexp
                byline="true"
                file="AndroidManifest.xml"
                match="U0(\d)+"
                replace="@{channelName}" />
            <!-- build apk -->
            <antcall target="clean" />
            <antcall target="release" />
            <!-- sign apk -->
            <sign-release />
            <zipalign-release />
            <mkdir dir="channels/@{channelName}" />
            <move
                file="bin/${ant.project.name}-release-zipalign.apk"
                todir="channels/@{channelName}/" />
        </sequential>
    </macrodef>
    <macrodef name="sign-release" >
        <sequential>
            <echo message="signing the unsigned apk to final product apk bin/${ant.project.name}-release-unsigned.apk" />
            <echo message="jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${key.password} -signedjar bin/${ant.project.name}-release.apk bin/${ant.project.name}-release-unsigned.apk ${key.alias} " />
            <exec executable="jarsigner" >
                <arg value="-keystore" />
                <arg value="${keystore}" />
                <arg value="-storepass" />
                <arg value="${keystore.password}" />
                <!-- 驗證密鑰完整性的口令,建立時創建的 -->
                <arg value="-keypass" />
                <arg value="${key.password}" />
                <!-- 專用密鑰的口令,就是key密碼 -->
                <arg value="-signedjar" />
                <arg value="bin/${ant.project.name}-release.apk" />
                <!-- 輸出 -->
                <arg value="bin/${ant.project.name}-release-unsigned.apk" />
                <!-- 未簽名的apk -->
                <arg value="${key.alias}" />
                <!-- 別名,建立時創建的 -->
            </exec>
        </sequential>
    </macrodef>
    <macrodef name="zipalign-release" >
        <sequential>
            <echo message="zipalign the signed apk" />
            <exec executable="${sdk.dir}/tools/zipalign" >
                <arg value="-v" />
                <arg value="4" />
                <arg value="bin/${ant.project.name}-release.apk" />
                <!-- signed apk -->
                <arg value="bin/${ant.project.name}-release-zipalign.apk" />
                <!-- zipalign output -->
            </exec>
        </sequential>
    </macrodef>
    <target name="buildchannels" >
  <bc channelName="U068"/>
    </target>
</project>

 而後在cmd中輸入命令

ant buildchannels

 哦對了,再此以前,若是你要生成release版本的, 要準備好你的key(keystore),關於生成keystore的方法,詳情請見個人另外一篇博文:Android生成keystore方法

而後將生成的android.keystore拷貝到工程根目錄地下就好了。

以後,運行上面的命令吧(ant buildchannels)

關於遇到的問題請見我另外一篇博文: Android簽名問題,jarsigner的問題

OK,這樣問題應該就解決了。

關於build.xml custome_rules.xml的語法

這就不說,這個我也是現學現賣,學了一下,也是稀裏糊塗,只能說如今看懂了。

這個網上有不少資料。

 

參考資料:

Android打包混淆實戰總結http://www.eoeandroid.com/thread-538246-1-1.html

簡單的ant打包,修改渠道號http://www.cnblogs.com/stay/archive/2013/05/27/3102027.html

Android打包流程:http://www.cnblogs.com/0616--ataozhijia/p/3732370.html

Android打包官網:‍http://developer.android.com/tools/building/index.html

Android build.xml編寫:http://blog.csdn.net/jariwsz/article/details/6728337(這一篇寫的很好)

 (貌似混淆的東西還沒加,以後再說吧)
相關文章
相關標籤/搜索