1. 程式人生 > >使用Ant在mac os下實現多渠道打包

使用Ant在mac os下實現多渠道打包

背景

於還在使用Eclipse做為開發工具的同學而言:
由於各種原因,還有部分公司使用Eclipse作為Android開發工具,版本要上線的時候,要上傳渠道包到國內主流應用平臺,如:應用寶,安智市場,百度的三個市場,360,華為等等,但是Eclipse不提供多渠道打包的工具。如果重複使用Eclipse手動打包,更改AndroidManifest中的UmengChannel,再簽名匯出,不僅降低了線率,還容易出錯,比如你漏改了清單檔案中的引數,或者是打包完成之後你的APK檔名沒改。於是就有人提出使用ant來實現自動化。
於我自己而言:
接觸渠道包的概念很久了,從十一月份開始準備相關工作。雖然已經有大神在網上貼出了各自實現多渠道打包的方法,但是由於每個專案都有特殊性,所以不能直接照搬,開發一套適合自己專案的多渠道打包工具才是王道。由於各種原因(自己太懶),學習相關知識斷斷續續。越是半途而廢,越是想要搞清楚,自動打包的實現原理以及相關的技術。最後實現出來,不僅是為了公司專案,對自己也是一個交代。一直到昨天,終於被我整出來了,當然很多是建立在前輩的基礎之上。今天,我就拿來炫一下,有什麼不妥的,請留言。

多渠道打包的學習步驟

下面是我學習自動打包的幾個步驟,因為自動打包相對平時編碼來說,需要的知識面更加寬廣。內在聯絡也不是很緊密。所以,如果想要徹底搞清楚自動打包的同學,還請仔細看,然後找到資料學習之。

Android和Java常用命令的使用

  • aapt命令 全稱:Android Asset Packaging Tool。用於打包資原始檔和清單檔案。值得注意的是:在打包資原始檔得時候,不僅要打包本專案的資原始檔,還要打包依賴專案的資原始檔。這是打包成功的必要保證。
  • javac命令 APK中不僅包含有資原始檔,還有我們用java寫的邏輯,這些邏輯的實現,需要依靠dalvik虛擬機器執行dex檔案,而dex檔案又是通過class檔案轉化,所以我們需要將原始檔即.java檔案編譯成class檔案,這個時候需要使用到javac命令。值得注意的是:我們編譯的時候要把本專案的原始碼以及第三方包的原始碼進行編譯。
  • dx命令 :由javac命令,我們知道,dalvik虛擬機器最終執行的是dex檔案,所以,我們就要通過dx命令將class檔案轉換為dex檔案。這個時候用到dx命令。著重強調:在編譯原始碼的時候,我們一般喜歡使用高版本的jdk去編譯,但是Java不支援java8。如果在打包的時候,出現報錯類似:caffeebabe……magic….等文字的時候,基本上可以推論是你的jdk版本不適合當前得安卓版本,不要問我為什麼知道的,正好在實現自動打包的前一天,我看了java在編譯成class檔案時的細節:在class檔案內部,有一個可以識別符號,用於判斷這個class檔案是否是可用,為了維護安全性,在每個class檔案的頭部,都有一個成為魔數(magic)的識別符號,這個識別符號用十六進位制編碼翻譯過來就是caffeebabe(咖啡寶貝)。正好和上文的報錯相吻合。
  • apkbuilder命令 這個命令在Android3.0之後已經被剔除,通過網上資料顯示,這個命令是對com.android.sdklib.build.ApkBuilderMain類的封裝,我們就可以使用ant來利用這個類實現同樣的功能。這個命令的主要功能是把資原始檔和dex,以及專案使用的so包打包成未簽名的apk。注意,如果你的專案中包含了so,一定要打進去,否則即使打包成功,但是專案執行到相關位置會閃退。
  • jarsigner命令 這個是java命令,這裡用於對未簽名的apk進行簽名。

APK打包的流程

下面對於Android整個打包的流程進行描述。

  1. 生成用於主應用的R.java,這裡用到aapt命令。
  2. 生成用於庫應用的R.java,也是用到aapt命令
  3. 編譯所有java檔案為class檔案,用到javac命令
  4. 打包class檔案和jar包為classes.dex,用到dx命令
  5. 打包assets和res資源為資源壓縮包(如res.zip,名字可以自己定義),用到aapt命令。
  6. 組合classes.dex和res.zip,以及so檔案生成未簽名的APK。用到apkBuilder命令。
  7. 生成有簽名的APK,用到 jarsigner命令。

    再次,借用網路上一張圖來描述:
    這裡寫圖片描述

Ant基本知識

ant 是一個將軟體編譯、測試、部署等步驟聯絡在一起加以自動化的一個工具,大多用於Java環境中的軟體開發。在實際軟體開發中,有很多地方可以用到ant。這裡,我們使用ant實現自動編譯,打渠道包。關於ant的使用可以參考這裡以及這裡。Ant執行時需要一個XML檔案(構建檔案)。 Ant通過呼叫target樹,就可以執行各種task。每個task實現了特定介面物件。 這裡,我們就要學會如何寫這個xml檔案。ant讀取的xml檔案通常預設命名為 build.xml檔案。下面對其結構做一些簡要介紹,具體的可以參考上述兩個連線。

  • project 元素 project元素是 Ant 構件檔案的根元素, Ant 構建檔案至少應該包含一個 project 元素,否則會發生錯誤。
  • target元素 target元素是一組操作得集合,包含了若干個Ant的原子操作。其中比較重要的引數是:depends,用於指定該target的依賴target。
  • task元素 該元素是ant執行的最小單位,用來說明一個操作。

以上就是build.xml的結構,清楚結構之後,我們需要通過一些常用的task去組合我們要實現的邏輯。
在學習ant的時候,我感覺ant有點類似C語言。它可以通過property來指定屬性,類似C語言的全域性變數。而taget類似C語言中的函式,task類似C語言的一行程式碼。有了這個認識,我們對ant有一個不錯的認識。

sed命令

sed是stream editor的簡稱,也就是流編輯器。通過這個命令,我們可以方便的對檔案進行操作,比如刪除文字,修改文字,增加文字等。
在 sed中,我們使用最多的是 s命令,它可以通過正則表示式對文字進行靈活的修改。想要深入學習的點選這裡

自動打包的實現

我們通過APK的打包過程的描述,將常用命令進行封裝。達到我們的業務需要。現在拆分如下:

1)新建需要使用的檔案系統。注意:新建的檔案和目錄不要與自生IDE的檔案和目錄重複,這樣就會出現衝突。導致IDE報錯。xml程式碼如下:

   <target name="init">
        <echo>start initing ... </echo>

        <mkdir dir="ant/out" />

        <echo> create out dir success</echo>

        <delete>
            <fileset dir="ant/out"></fileset>
        </delete>

        <mkdir dir="ant/gen" />
        <echo> create gen dir success</echo>
        <delete>
            <fileset dir="ant/gen"></fileset>
        </delete>
        <mkdir dir="ant/bin/classes" />
        <echo> create classes dir success</echo> 
        <delete>
            <fileset dir="ant/bin/classes"></fileset>
        </delete> 
        <mkdir dir="ant/build/${apk-version}" />
        <echo> create latest dir success</echo> 
        <echo>finish initing. </echo>
    </target>

2)打包本專案的R檔案,以及依賴專案的R檔案

  <target name="main" depends="init">
        <echo>generating R.java for project to dir gen (using aapt) ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../pull_library/res" />
            <arg value="-S" />
            <arg value="../wheel/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
            <arg value="--auto-add-overlay" />
        </exec>

        <echo>generating R.java for library from pull_library to dir gen (using aapt) ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="--non-constant-id" />
            <arg value="--auto-add-overlay" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="../pull_library/AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../pull_library/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>

        <echo>generating R.java for library from wheel to dir gen (using aapt) ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="--non-constant-id" />
            <arg value="--auto-add-overlay" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="../wheel/AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../wheel/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>

3)編譯原始碼

  <path id="project.libs">
            <fileset dir="libs">
                <include name="*.jar" />
            </fileset>
        </path>
        <echo>compiling java files to class files (include R.java, library and the third-party jars) ... </echo>
        <javac destdir="ant/bin/classes" target="1.6" bootclasspath="${android-jar}">
            <src path="../pull_library/src" />
            <src path="../wheel/src" />
            <src path="src" />
            <src path="gen" />
            <classpath refid="project.libs" />
        </javac>

4)class 轉dex

        <echo>packaging class files (include the third-party jars) to calsses.dex ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/dx">
            <arg value="--dex" />
            <arg value="--output=ant/out/classes.dex" />
            <arg value="ant/bin/classes" />
            <arg value="libs" />
        </exec>

5)打包資原始檔

  <echo>packaging resource (include res, assets, AndroidManifest.xml, etc.) to res.zip ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-f" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../pull_library/res" />
            <arg value="-S" />
            <arg value="../wheel/res" />
            <arg value="-A" />
            <arg value="assets" />
            <arg value="-I" />
            <arg value="${android-jar}" />
            <arg value="-F" />
            <arg value="ant/out/res.zip" />
            <arg value="--auto-add-overlay" />
        </exec>

6) 生成未簽名的apk

  <java classpath="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/tools/lib/sdklib.jar" classname="com.android.sdklib.build.ApkBuilderMain">
            <arg value="ant/out/unsigned.apk" />
            <arg value="-u" />
            <arg value="-z" />
            <arg value="ant/out/res.zip" />
            <arg value="-f" />
            <arg value="ant/out/classes.dex" />
            <arg value="-nf" />
            <arg value="libs" />
        </java>

7) 簽名apk

  <echo>signing the unsigned apk to final product apk ... </echo>
        <exec executable="jarsigner">
            <arg value="-keystore" />
            <arg value="/Users/yuanyang/Desktop/signature/xxxx" />
            <arg value="-storepass" />
            <arg value="xxxxxx" />
            <arg value="-keypass" />
            <arg value="xxxxxx" />
            <arg value="-signedjar" />
            <arg value="ant/build/${apk-version}/${apk-name}_${apk-version}_${apk-market}.apk" />
            <arg value="ant/out/unsigned.apk" />
            <arg value="xxxxxx" />
        </exec>

整個檔案為:

<?xml version="1.0" encoding="UTF-8"?>
<project default="main" basedir=".">

    <property name="apk-name" value="product" />
    <property name="apk-version" value="latest" />
    <property name="apk-market" value="dev" />
    <property name="ant" value="ant" />

    <property name="android-jar" value="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/platforms/android-21/android.jar" />

    <target name="init">
        <echo>start initing ... </echo>

        <mkdir dir="ant/out" />

        <echo> create out dir success</echo>

        <delete>
            <fileset dir="ant/out"></fileset>
        </delete>

        <mkdir dir="ant/gen" />
        <echo> create gen dir success</echo>

        <delete>
            <fileset dir="ant/gen"></fileset>
        </delete>

        <mkdir dir="ant/bin/classes" />
        <echo> create classes dir success</echo>

        <delete>
            <fileset dir="ant/bin/classes"></fileset>
        </delete>

        <mkdir dir="ant/build/${apk-version}" />
        <echo> create latest dir success</echo>


        <echo>finish initing. </echo>
    </target>

    <target name="main" depends="init">
        <echo>generating R.java for project to dir gen (using aapt) ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../pull_library/res" />
            <arg value="-S" />
            <arg value="../wheel/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
            <arg value="--auto-add-overlay" />
        </exec>

        <echo>generating R.java for library from pull_library to dir gen (using aapt) ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="--non-constant-id" />
            <arg value="--auto-add-overlay" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="../pull_library/AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../pull_library/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>

        <echo>generating R.java for library from wheel to dir gen (using aapt) ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="--non-constant-id" />
            <arg value="--auto-add-overlay" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="../wheel/AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../wheel/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>

        <path id="project.libs">
            <fileset dir="libs">
                <include name="*.jar" />
            </fileset>
        </path>
        <echo>compiling java files to class files (include R.java, library and the third-party jars) ... </echo>
        <javac destdir="ant/bin/classes" target="1.6" bootclasspath="${android-jar}">
            <src path="../pull_library/src" />
            <src path="../wheel/src" />
            <src path="src" />
            <src path="gen" />
            <classpath refid="project.libs" />
        </javac>

        <echo>packaging class files (include the third-party jars) to calsses.dex ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/dx">
            <arg value="--dex" />
            <arg value="--output=ant/out/classes.dex" />
            <arg value="ant/bin/classes" />
            <arg value="libs" />
        </exec>

        <echo>packaging resource (include res, assets, AndroidManifest.xml, etc.) to res.zip ... </echo>
        <exec executable="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/build-tools/android-5.1/aapt">
            <arg value="package" />
            <arg value="-f" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="../pull_library/res" />
            <arg value="-S" />
            <arg value="../wheel/res" />
            <arg value="-A" />
            <arg value="assets" />
            <arg value="-I" />
            <arg value="${android-jar}" />
            <arg value="-F" />
            <arg value="ant/out/res.zip" />
            <arg value="--auto-add-overlay" />
        </exec>

        <java classpath="/Users/yuanyang/Downloads/adt-bundle-mac-x86_64-20131030/sdk/tools/lib/sdklib.jar" classname="com.android.sdklib.build.ApkBuilderMain">
            <arg value="ant/out/unsigned.apk" />
            <arg value="-u" />
            <arg value="-z" />
            <arg value="ant/out/res.zip" />
            <arg value="-f" />
            <arg value="ant/out/classes.dex" />
            <arg value="-nf" />
            <arg value="libs" />
        </java>

        <echo>signing the unsigned apk to final product apk ... </echo>
        <exec executable="jarsigner">
            <arg value="-keystore" />
            <arg value="/Users/yuanyang/Desktop/signature/隨時領路" />
            <arg value="-storepass" />
            <arg value="111111" />
            <arg value="-keypass" />
            <arg value="111111" />
            <arg value="-signedjar" />
            <arg value="ant/build/${apk-version}/${apk-name}_${apk-version}_${apk-market}.apk" />
            <arg value="ant/out/unsigned.apk" />
            <arg value="yuanyang" />
        </exec>

        <echo>done.</echo>
    </target>
</project>

在命名行將目錄切換到build.xml目錄,執行ant,執行截圖:
這裡寫圖片描述

下面,我們到apk-version下面去檢視剛剛生成apk。生成的apk截圖

下面,我們使用ClassyShark來驗證我們生成的包的內部結構:
這裡寫圖片描述

多渠道打包的實現

上一步實現了自動打包,但是對於打渠道包還能沒有實現。這裡藉助於osx平臺下的sed指令碼進行迴圈打包。我們在專案裡面新建 build.sh檔案,加上自己的渠道名,實現渠道打包,指令碼程式碼:

#定義市場列表,以空格分割
markets="Tecent Anzhi Baidu Huawei Xiaomi Lenovel"
#迴圈市場列表,分別傳值給各個指令碼
for market in $markets
do
    echo packaging leroda_app_android_$market.apk ...
    #替換AndroidManifest.xml中Channel值(針對友盟,其他同理)
    sed -i '' "s/\(android:value=\)\"\(.*\)\"\( android:name=\"UMENG_CHANNEL\"\)/\1\"$market\"\3/g" AndroidManifest.xml
    #編譯對應的版本
    ant -Dapk-name=floworld -Dapk-version=1.0 -Dapk-market=$market
done

。在mac命令列下執行 /.build.sh 執行該檔案,實現自動打包。

總結:

  • 在學習Android的時候,要把眼界放寬,學習一下相關知識,有利於加深我們的理解。
  • 雖說平時不經常使用Android的命令,但是這是基礎,有助於提高對Android的理解。
  • 在寫部落格的最後發現,這裡沒有做混淆。下一步將混淆功能加進去。

相關連結:

感謝

最後感謝工作中給予我幫助的同事。

相關推薦

使用Ant在mac os實現多渠道打包

背景 於還在使用Eclipse做為開發工具的同學而言: 由於各種原因,還有部分公司使用Eclipse作為Android開發工具,版本要上線的時候,要上傳渠道包到國內主流應用平臺,如:應用寶,安智市場,百度的三個市場,360,華為等等,但是Eclipse不提供

一行命令實現多渠道打包並自動進行資源混淆(Walle,AndResGuard)

多渠道打包和資源混淆的作用這裡我就不再闡述了。網上有很多。 本篇部落格我們來介紹一下如何實現多渠道打包之前先進行資源混淆,這樣一來我們打出來的包都是已經進行過資源混淆的了。 如果你還有其他的需求,也可以按照這個方法實現。 多渠道打包(Walle) 這裡多渠道打包

Gradle實現多渠道打包(不同資原始檔打不同的包)

在日常開發中,我們或多或少都會碰到多渠道打包的一些問題,有些是同一個版本要上傳到不同的平臺,有些是要提供給不同的代理商,中間可能需要改動裡面的圖片或其他的一些資原始檔,對於版本比較少的我們可以簡單的替換,但是遇到很多版本時,相信再通過手動替換會令人吐血~ 廢話

Android 使用Python實現多渠道打包

使用前提 需要結合Umeng的多渠道統計,Umeng的整合可以自己去官網瞭解,參考地址。 環境配置 Python2.x 可以再Python官網下載 Android Studio 具體使用 1 . 首先在整合Umeng統計時 不要使用標籤在M

Android 使用VasDolly 實現多渠道打包

前言:    因為公司專案需要釋出到更多的平臺上,以供使用者下載。打包就成了一個很大的問題。利用原本的打包方式,又慢油耗。主要是電腦慢的話,打一個包都已經要一倆分鐘了,如果需要釋出的渠道多的話,那麼真的就GG了。當然第一想到的還是使用第三方框架來實現。原始的做法如何配置渠道打

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

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

Mac OS X實現矩形部分圓角

rap 區別 解決方案 顏色 origin 技術 int setfill str 問題 在進行今天的內容之前,首先我想問一個問題:下圖中,藍色選擇框與紅色選擇框除顏色、大小外有何不同?(我會在後文揭曉答案) 目標 本文今天要討論的是:在Mac OS X下,如何實現矩形的部

bat結合maven 實現windowsmaven自動打包指令碼

不知道你是否在開發中一直遇到這樣的問題,在maven打包的時候有2中方式,一種就是在ide工具裡面打包,然後在ide的輸出資訊裡面找到對應的war或者jar包所在位置,然後拷貝出來。另一種就是先找到專案所在的位置然後通過maven clean install 命令執行完畢之後

Python實現Android Apk 加固及多渠道打包

前言 道高一尺,魔高一丈。現如今只做混淆的apk,在smali逆向中,可以說是裸奔。鑑於此,各大佬也都針對自己的應用進行了加固處理(加固原理自找度娘),與此同時,市面上各主流平臺也都開源推出了自己的應用加固工具,比如360加固助手。 我們海豚睡眠就是採用36

Android Studio使用Gradle實現自動打包,簽名,自定義apk檔名,多渠道打包,整合系統簽名證書【附效果圖附原始碼】

        接觸Android Stuidio有一陣子了,之前用的時候有很多小問題,不過現在的版本感覺已經很好用了,所以準備徹底從Eclipse轉戰Android Stuidio,這段時間把以前經常使用的公用庫都從Eclipse移植過來了,今天研究了一下在Andro

Android利用騰訊Bugly實現一鍵多渠道打包+一包熱更新全渠道

騰訊Bugly,為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現並解決異常,同時掌握產品運營動態,及時跟進使用者反饋。Bugly主要功能有異常上報、運營統計和應用升級(包含熱更新和全包更新),這些功能在官網上都有對應的開發文件可供參考,並且在熱更新模組還錄有專門的視訊教程以供參考。我在按照官方文件

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

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

使用Ant實現多渠道,多環境打包apk

#keystore檔案存放目錄 key.store=./epeiwang_keystore #keystore別名 key.alias=epeiwang_keystore #keystore密碼 key.store.password=xxxxxxx #組織密碼 key.alias.passw

android多渠道打包(動態改變地址打包,只需改版本號)

多渠道打包本來不想寫的,因為比較麻煩,所以沒打算寫。只是前段時間因為電腦藍屏重灌了系統,導致不能打包了,所以又百度了半天,今天就寫下來做個筆記。廢話不多說,進入主題。配置多渠道打包就要使用友盟統計build.gradle中新增友盟的依賴包://友盟統計 compile 'co

AndroidStudio使用友盟多渠道打包

前期準備工作: 1.先註冊友盟賬號,然後登入後點擊盟友統計操作: 2.點選盟友統計操作,會出現統計的一些資料資訊,但是我們不需要統計,我們需要的是一個AppKey, 所以點選–>立即使用: 3.如果有新增過應該的話,就重新新增一個,如果沒有

Android Studio 友盟api實現apk多渠道打包

本篇主要給大家介紹利用友盟api實現Android多渠道打包,進入友盟的官網,註冊賬號,新增對應的應用。 1.新增友盟庫的依賴 2.在manifest.xml中宣告appkey,以及渠道佔位符 3.builder.gradle相關指令碼配置,新增預

android開發之Jenkins+Gradle實現android開發持續整合、多渠道打包

需求: 我今天在專案上加了一個功能,那麼一個好的專案開發流程必然得跑單元測試,意思是:“改一次程式碼,需要手動跑一次單元測試,來檢驗程式碼在當前情況下是否能執行成功!”,但每次都需要手動跑的話就太累了,因為一個新增專案功能,我一天下來可能會改十幾次程

VS2013實現移動端的跨平臺開發

event 關系 擴展 真機測試 trap 框架 intel als pac http://www.th7.cn/Program/Android/201412/336394.shtml 前一天準備下載VS2015預覽版,到VisualStudio官網一看,發現微軟發布了

mac實現代碼遠程同步

只需要 需要 style done root spa pwd all 代碼 近期將辦公電腦從windows換成了mac,以前一直用windows,在windows下面將代碼同步到遠程的開發機,zend studio有一些內置的工具,但mac下的zend stduio沒有了這

如何在不使用系統函數的情況實現PHP中數組系統函數的功能

如何 利用 數組 關聯 uniq 出現的次數 回調 數組賦值 fun PHP中為我們提供了各種各樣的系統函數來實現我們需要的各種功能,那麽,在不使用系統函數的情況下我們要怎樣來實現這些功能呢?以下就是幾種系統函數的實現方式。 首先,我們來定義一個數組: $arr= arr