1. 程式人生 > >Android Ant 多渠道打包

Android Ant 多渠道打包

[mw_shl_code=java,true]<project
    name="TestMutilChannelApk"
    default="release" >

    <!-- ANT環境變數 -->

    <property environment="env" />
    <!-- 使用第三方的ant包,使ant支援for迴圈 -->

    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >

        <classpath>

            <pathelement location="D:/Android/Ant/lib/ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>
    <!-- 應用名稱 -->

    <property
        name="appName"
        value="${ant.project.name}" />
    <!-- SDK目錄(獲取作業系統環境變數ANDROID_SDK_HOME的值) -->

    <property
        name="sdk-folder"
        value="D:/Android/adt-bundle-windows-x86_64-20131030/sdk" />
    <!-- SDK指定平臺目錄 -->

    <property
        name="sdk-platform-folder"
        value="${sdk-folder}/platforms/android-8" />
    <!-- SDK中tools目錄 -->

    <property
        name="sdk-tools"
        value="${sdk-folder}/tools" />
    <!-- SDK指定平臺中tools目錄 -->

    <property
        name="sdk-platform-tools"
        value="${sdk-folder}/platform-tools" />

    <!-- 使用到的命令(當前系統為windows,如果系統為linux,可將.bat檔案替換成相對應的命令) -->

    <property
        name="aapt"
        value="${sdk-platform-tools}/aapt" />

    <property
        name="aidl"
        value="${sdk-platform-tools}/aidl" />

    <property
        name="dx"
        value="${sdk-platform-tools}/dx.bat" />

    <property
        name="apkbuilder"
        value="${sdk-tools}/apkbuilder.bat" />

    <property
        name="jarsigner"
        value="${env.JAVA_HOME}/bin/jarsigner" />

    <property
        name="zipalign"
        value="${sdk-tools}/zipalign.exe" />

    <!-- 編譯需要的jar; 如果專案使用到地圖服務則需要maps.jar -->

    <property
        name="android-jar"
        value="${sdk-platform-folder}/android.jar" />

    <property
        name="android-maps-jar"
        value="${sdk-folder}/add-ons/addon_google_apis_google_inc_8/libs/maps.jar" />

    <!--  -->

    <property
        name="channelname"
        value="" />

    <property
        name="channelkey"
        value="" />
    <!-- 渠道名:渠道號 -->

    <property
        name="key"
        value="UM:umumum,BAI:baidu" />

    <!-- 編譯aidl檔案所需的預處理框架檔案framework.aidl -->

    <property
        name="framework-aidl"
        value="${sdk-platform-folder}/framework.aidl" />
    <!-- 清單檔案 -->

    <property
        name="manifest-xml"
        value="AndroidManifest.xml" />
    <!-- 原始檔目錄 -->

    <property
        name="resource-dir"
        value="res" />

    <property
        name="asset-dir"
        value="assets" />
    <!-- java原始檔目錄 -->

    <property
        name="srcdir"
        value="src" />

    <property
        name="srcdir-ospath"
        value="${basedir}/${srcdir}" />
    <!-- 外部類庫所在目錄 -->

    <property
        name="external-lib"
        value="libs" />

    <property
        name="external-lib-ospath"
        value="${basedir}/${external-lib}" />

    <!-- 版本 -->

    <property
        name="version"
        value="3.0" />

    <!-- 迴圈打包 -->

    <target name="deploy" >

        <foreach
            delimiter=","
            list="${key}"
            param="nameandchannel"
            target="modify_manifest" >
        </foreach>
    </target>

    <target name="modify_manifest" >

        <!-- 獲取渠道名字 -->

        <propertyregex
            input="${nameandchannel}"
            override="true"
            property="channelname"
            regexp="(.*):"
            select="\1" />
        <!-- 獲取渠道號碼 -->

        <propertyregex
            input="${nameandchannel}"
            override="true"
            property="channelkey"
            regexp=":(.*)"
            select="\1" />
        <!-- 正則匹配替換渠道號 -->

        <replaceregexp
            byline="false"
            encoding="UTF-8"
            flags="g" >

            <regexp pattern="meta-data android:value="(.*)" android:name="app_key"" />

            <substitution expression="meta-data android:value="${channelkey}" android:name="app_key"" />

            <fileset
                dir=""
                includes="AndroidManifest.xml" />
        </replaceregexp>

        <antcall target="zipalign" />
    </target>

    <!-- 初始化工作 -->

    <target name="init" >

        <echo>
目錄初始化....


        </echo>
        <!-- 生成R檔案的相對目錄 -->

        <var
            name="outdir-gen"
            value="gen" />
        <!-- 編譯後的檔案放置目錄 -->

        <var
            name="outdir-bin"
            value="bin-${channelname}" />
        <!-- 生成class目錄 -->

        <var
            name="outdir-classes"
            value="${outdir-bin}" />

        <var
            name="outdir-classes-ospath"
            value="${basedir}/${outdir-classes}" />

        <!-- classes.dex相關變數 -->

        <var
            name="dex-file"
            value="classes.dex" />

        <var
            name="dex-path"
            value="${outdir-bin}/${dex-file}" />

        <var
            name="dex-ospath"
            value="${basedir}/${dex-path}" />

        <!-- 經過aapt生成的資源包檔案 -->

        <var
            name="resources-package"
            value="${outdir-bin}/resources.ap_" />

        <var
            name="resources-package-ospath"
            value="${basedir}/${resources-package}" />

        <!-- 未認證apk包 -->

        <var
            name="out-unsigned-package"
            value="${outdir-bin}/${appName}-unsigned.apk" />

        <var
            name="out-unsigned-package-ospath"
            value="${basedir}/${out-unsigned-package}" />

        <!-- 證書檔案 -->

        <var
            name="keystore-file"
            value="${basedir}/gaoxin.key" />

        <!-- 已認證apk包 -->

        <var
            name="out-signed-package"
            value="${outdir-bin}/${appName}-${channelname}-${version}.apk" />

        <var
            name="out-signed-package-ospath"
            value="${basedir}/${out-signed-package}" />

        <delete dir="${outdir-bin}" />

        <mkdir dir="${outdir-bin}" />

        <mkdir dir="${outdir-classes}" />
    </target>

    <!-- 根據工程中的資原始檔生成R.java檔案 -->

    <target
        name="gen-R"
        depends="init" >

        <echo>
生成R.java檔案....


        </echo>

        <exec
            executable="${aapt}"
            failonerror="true" >

            <arg value="package" />

            <arg value="-f" />

            <arg value="-m" />

            <arg value="-J" />

            <arg value="${outdir-gen}" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-M" />

            <arg value="${manifest-xml}" />

            <arg value="-I" />

            <arg value="${android-jar}" />
        </exec>
    </target>

    <!-- 編譯aidl檔案 -->

    <target
        name="aidl"
        depends="gen-R" >

        <echo>
編譯aidl檔案....


        </echo>

        <apply
            executable="${aidl}"
            failonerror="true" >

            <!-- 指定預處理檔案 -->

            <arg value="-p${framework-aidl}" />
            <!-- aidl宣告的目錄 -->

            <arg value="-I${srcdir}" />
            <!-- 目標檔案目錄 -->

            <arg value="-o${outdir-gen}" />
            <!-- 指定哪些檔案需要編譯 -->

            <fileset dir="${srcdir}" >

                <include name="**/*.aidl" />
            </fileset>
        </apply>
    </target>

    <!-- 將工程中的java原始檔編譯成class檔案 -->

    <target
        name="compile"
        depends="aidl" >

        <echo>
java原始檔編譯成class檔案....


        </echo>

        <javac
            bootclasspath="${android-jar}"
            destdir="${outdir-classes}"
            encoding="utf-8"
            srcdir="."
            target="1.5"
            verbose="false" >

            <compilerarg line="-encoding GBK " />

            <classpath>

                <fileset
                    dir="${external-lib}"
                    includes="*.jar" />
            </classpath>
        </javac>
    </target>

    <!-- 將.class檔案轉化成.dex檔案 -->

    <target
        name="dex"
        depends="compile" >

        <echo>
將.class檔案轉化成.dex檔案....


        </echo>

        <exec
            executable="${dx}"
            failonerror="true" >

            <arg value="--dex" />
            <!-- 輸出檔案 -->

            <arg value="--output=${dex-ospath}" />
            <!-- 要生成.dex檔案的源classes和libraries -->

            <arg value="${outdir-classes-ospath}" />

            <arg value="${external-lib-ospath}" />
        </exec>
    </target>

    <!-- 將資原始檔放進輸出目錄 -->

    <target name="package-res-and-assets" >

        <echo>
將資原始檔放進輸出目錄....


        </echo>

        <exec
            executable="${aapt}"
            failonerror="true" >

            <arg value="package" />

            <arg value="-f" />

            <arg value="-M" />

            <arg value="${manifest-xml}" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-A" />

            <arg value="${asset-dir}" />

            <arg value="-I" />

            <arg value="${android-jar}" />

            <arg value="-F" />

            <arg value="${resources-package}" />
        </exec>
    </target>

    <!-- 打包成未簽證的apk -->

    <target
        name="package"
        depends="dex, package-res-and-assets" >

        <echo>
打包成未簽證的apk....


        </echo>

        <exec
            executable="${apkbuilder}"
            failonerror="true" >

            <arg value="${out-unsigned-package-ospath}" />

            <arg value="-u" />

            <arg value="-z" />

            <arg value="${resources-package-ospath}" />

            <arg value="-f" />

            <arg value="${dex-ospath}" />

            <arg value="-rf" />

            <arg value="${srcdir-ospath}" />
        </exec>
    </target>

    <!-- 對apk進行簽證 ,因為JDK7會修改簽名的預設演算法,所以需要指定SHA1 -->

    <target
        name="jarsigner"
        depends="package" >

        <echo>
Packaging signed apk for release...


        </echo>

        <exec
            executable="${jarsigner}"
            failonerror="true" >

            <arg value="-verbose" />

            <arg value="-digestalg" />

            <arg value="SHA1" />

            <arg value="-sigalg" />

            <arg value="MD5withRSA" />

            <arg value="-keystore" />

            <arg value="${keystore-file}" />

            <arg value="-storepass" />

            <arg value="123456" />

            <arg value="-keypass" />

            <arg value="123456" />

            <arg value="-signedjar" />

            <arg value="${out-signed-package-ospath}" />

            <arg value="${out-unsigned-package-ospath}" />
            <!-- 不要忘了證書的別名 -->

            <arg value="gaoxin" />
        </exec>
    </target>

    <!-- 釋出 -->

    <target
        name="release"
        depends="jarsigner" >

        <!-- 刪除未簽證apk -->

        <delete file="${out-unsigned-package-ospath}" />

        <echo>
APK is released. path:${out-signed-package-ospath}


        </echo>
    </target>
    <!-- 打包的應用程式進行優化 -->

    <target
        name="zipalign"
        depends="release" >

        <exec
            executable="${zipalign}"
            failonerror="true" >

            <arg value="-v" />

            <arg value="4" />

            <arg value="${out-signed-package-ospath}" />

            <arg value="${out-signed-package-ospath}-zipaligned.apk" />
        </exec>
    </target>

</project>[/mw_shl_code]

相關推薦

Android ANT 多渠道打包解決方案

<span style="font-size:18px;"><!--Android 分渠道打包步驟--> <!--打包之前請確定--> ANDROID_HOME 環境變數 即ANDROID_SDK的安裝路徑 如:

Android Ant 多渠道打包

[mw_shl_code=java,true]<project     name="TestMutilChannelApk"     default="release" >     <!-- ANT環境變數 -->     <property environment="env"

Android自動化構建之Ant多渠道打包實踐(下)

前言 上一篇(Android自動化構建之Ant多渠道打包實踐(上))已經介紹了Android的apk是如何構建的,本篇部落格繼續Ant打包的實踐過程。 整合友盟統計SDK 這裡以友盟統計為例,對各個渠道進行統計,我們需要先整合它的SDK 配置許可權

Android自動化構建之Ant多渠道打包實踐(上)

前言 Ant是歷史比較悠久的一個自動化構建工具,Android開發者可以通過它來實現自動化構建,也可以實現多渠道打包,關於apk打包的方式一般有Ant、Python、Gradle三種,這三種打包方式都各自有優點和缺點,本篇博文先給大家介紹如何使用Ant來實現自

Android studio多渠道打包以及使用不同資源(包括icon或者其他圖片等)

自己專案需要分渠道打包,且使用不同資源,所以,在百度之後,總結了一下: 利用友盟分渠道打包,首先在manifest裡面加一句: <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNE

Android Studio多渠道打包和程式碼混淆教程

http://coolshell.info/blog/2015/03/android-studio-prefrence.html 什麼是Gradle Gradle是一種依賴管理工具,基於Groovy語言,面向Java應用為主,它拋棄了基於XML的各種繁瑣配置,取而

Android Studio 多渠道打包, 自定義APK名稱

使用Android Studio 有一段時間了, 讓我總結下使用感受,那就是 “爽”!!! 由於公司專案android版渠道比較多, 所以打包的時候一般都會使用多渠道打包。而AS 為我們提供了很方便很牛逼的指令碼工具Gradle,廢話不多說了 首先在專案底下的 build

android多渠道打包的三種方式

國內的Android開發者還是很苦逼的,由於眾所周知的原因,google play無法在國內開啟(翻牆的就不在考慮之內了),所以Android系的應用市場,群雄爭霸。後果就是國記憶體在著有眾多的應用市場,產品在不同的渠道可能有這不同的統計需求,為此Android開發人員

android:獲取渠道名+Android Studio多渠道打包+python 美團打包

需要使用友盟多渠道統計 /** * 獲取application中指定的meta-data。本例中,呼叫方法時key就是UMENG_CHANNEL * @return 如果沒有獲取成

Android studio 多渠道打包,但只生成一個debug包(不需要多渠道debug包)

多渠道打包方式,網上有很多的介紹了,這裡就不再多說了。 配置好打多渠道包,每次手機連線電腦,想執行一下測試。發現在buildout/apk目錄下生成了每個渠道的debug包。而且每執行一次,就成生一個debug包。 這樣是不是很煩。如果只想生成一個debug的包。怎麼做

Android Studio多渠道打包如何使用不同的資源,依賴和java程式碼

第一步:在build.gradle檔案中,設定productFlavors實現多渠道 //例項 productFlavors { baidu { appli

Android 快速多渠道打包上線實踐

前言 今天向大家介紹的便是目前我們智課批改專案組使用的App多渠道打包方案,目前這個方案已經經過幾個迭代的檢驗,效率和穩定性都有保障,希望能對大家的多渠道上線打包有所幫助。 傳統打包方案 //build.gradle productFlavors

Android Studio 多渠道打包自命名

//—————————————————————————————- (a) apply plugin: 'com.android.application' apply plugin: 'com.droidtitan.lintcleaner' def rel

android gradle多渠道打包打包選定的so資料夾

productFlavors { LDAND001 { ndk {//這裡控制apk要生成的so檔案 abiFilters "armeabi-v7a" abiFilters "armeabi" abiFilters "x86" abiFilters "x86_

gradle打包android (實現外部導入簽名文件、多渠道打包、導入ant腳本)

gradle打包 tree clu download csdn ssp pes 基礎 net 近期一直在做android自己主動打包,之前已經完畢了用純命令行的形式打包、原生態ant腳本打包。和基於android的SDK的打包。而且實現了多渠道打包,後來同

android Ant 批量多渠道打包 總結!

最近研究android裡用ant打多個渠道的apk包,終於搞出頭緒!!走了很多錯路,希望大家不要這樣子!!下面就是個人的幾點總結,希望對大家有幫助:      首先說的是我用的ant不是eclipse和android SDk裡面自帶的ant,而是從這裡下載的 -- Ant

android Ant 批量多渠道打包

一直以來都是手動打包android程式,真可謂苦不堪言啊,以前試過用ant打包,但是失敗了,最近剛到新公司,又開始研究ant這玩意了,查閱了網上一些文章,結合自己的情況,硬是要弄出來才行,這裡就作下記錄吧。 1,準備 ant打包自然需要ant,可以去http://an

Android學習探索之App多渠道打包及動態添加修改資源屬性

Android App 前言: 關於Android渠道打包是一個比較老的話題,今天主要記錄總結一下多渠道打包以及如果動態配置修改一些資源屬性。今天以公司實際需求為例進行演示,由於項目復用很多公共的業務組件,而且業務組件之間的跳轉采用Scheme協議,每個業務組

ANDROID STUDIO系列教程六--GRADLE多渠道打包

tor 等待 time() utf 腳本 manifest file resource 一個 由於國內Android市場眾多渠道,為了統計每個渠道的下載及其它數據統計,就需要我們針對每個渠道單獨打包,如果讓你打幾十個市場的包豈不煩死了,不過有了Gradle,這再也不是事了。

(轉載)Android多渠道打包沒你想的那麽復雜

mon val comm deb sign time() fff 騰訊 結構 Android多渠道打包沒你想的那麽復雜 Aimerd 關註 2016.06.22 15:55* 字數 1084 閱讀 7649評論 26喜歡 112 今天運營同事給我發了15個應用平