Gradle Android客戶端程式打包(基於gradle 2.10版本驗證通過)

来源:http://www.cnblogs.com/Freedoms/archive/2016/01/30/5171201.html
-Advertisement-
Play Games

一、前言 目前正在準備從eclipse開發環境向AndroidStudio遷移,提前過去探探路,不出所料,原來gradle腳本果然報錯,無法運行,想想索性把本地的gradle一起升級到最新版本,畢竟1.22有點太古老了。 仍然不廢話,先上乾貨。 二、準備工作 1、首先,如果使用eclipse作為開發


一、前言

  目前正在準備從eclipse開發環境向AndroidStudio遷移,提前過去探探路,不出所料,原來gradle腳本果然報錯,無法運行,想想索性把本地的gradle一起升級到最新版本,畢竟1.22有點太古老了。
  仍然不廢話,先上乾貨。

二、準備工作

1、首先,如果使用eclipse作為開發環境,需右鍵點擊項目,在菜單中選擇“Export…”
2、然後,在彈出的列表中依次選擇“Android->Generate Gradle build files”
3、選擇"Next>"
4、再選擇"Next>"
5、在列表中勾選需要創建gradle配置腳本的項目,繼續"Next>"
6、選擇"Finish"
至此,eclipse中已生成gradle配置腳本,可能這是需要右鍵刷新一下項目

三、簡單項目Gradle打包腳本配置

//build腳本配置,指定gradle版本
buildscript {
    repositories {  
        jcenter()  
    }  
    dependencies  
        classpath 'com.android.tools.build:gradle:2.0.+' 
    }  
}

//項目配置版本號,與apk輸出目錄
ext.appVersionCode = 2  
ext.appVersionName = "2.0"  
ext.appReleaseDir = "/Users/freedoms/Desktop/release"

//插件配置
apply plugin: 'com.android.application'

//獲取時間戳
def getDate() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMdd')
    return formattedDate
}

//程式包配置
android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']

            //項目中含有so包,需增加jni相關目錄配置,否則程式運行到調用so時將發生錯誤
            jniLibs.srcDir(['libs'])  
        }
        instrumentTest.setRoot('tests')
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
}

//打包開始時,lint運行將有可能發生錯誤,當有異常發生時,此設置將忽略警告,繼續運行腳本,若忽略,打包過程將被強行終止
lintOptions { 
    abortOnError false
}

//
packagingOptions {
    exclude 'META-INF/maven/com.belerweb/pinyin4j/pom.xml'
    exclude 'META-INF/maven/com.belerweb/pinyin4j/pom.properties'
}

//簽名配置
signingConfigs {
    myConfig {
        storeFile file("/Users/freedoms/Desktop/產品需求文檔/android.keystore")
        storePassword "123123"
        keyAlias "android.keystore"
        keyPassword "123123"
    }
}

//混淆配置
buildTypes{
    release {
        //不需混淆設置為false
        minifyEnabled false
        signingConfig  signingConfigs.myConfig
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
    }
}

//自定義配置
productFlavors {
    //百度
    baidu{
        //AndroidManifest.xml配置中定義的占位符補全配置,實例中在AndroidManifest.xml中配置"${UMENG_CHANNEL_VALUE}",腳本運行後,將baidu_android_channel自動替換到此位置,AndroidManifest.xml其他需要分渠道動態配置的參數可以參考此做法操作
            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"baidu_android_channel",BAIDU_CHANNEL_VALUE:"baidu_baidu_android_channel"]
    }
    //360
    "360"{//若配置渠道名為數字開頭,必須加引號
        manifestPlaceholders = [UMENG_CHANNEL_VALUE:"360_android_channel",BAIDU_CHANNEL_VALUE:"baidu_360_android_channel"]
    }
    //可參考以上兩項進行擴展……
}

    //打包重命名演算法,輸出XXX_Android_v2.0_20160127_baidu.apk到腳本前配置的輸出目錄當中
    android.applicationVariants.all { variant ->
        def file = variant.outputs[0].outputFile
        if(variant.buildType.name.equals('release')){
            variant.outputs[0].outputFile = new File(appReleaseDir + '/','XXX_Android_v' + appVersionName +getDate()+ '_' + variant.productFlavors[0].name + '.apk')
        }
    }
}

//編碼配置
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

四、帶有項目依賴關係的gradle打包腳本配置

(一)、依賴項目

1、如果使用eclipse作為開發環境,首先需要生成gradle配置腳本(詳見二、準備工作)

2、修改gradle腳本中apply plugin為以下配置
apply plugin: 'android-library'

3、其他配置同主項目,可參考簡單項目gradle腳本配置

(二)、主項目

*1、如果使用eclipse作為開發環境,首先需要生成gradle配置腳本(詳見二、準備工作)

*2、修改gradle腳本中apply plugin為以下配置
apply plugin: 'com.android.application'

3、在主項目根目錄下創建setting.gradle文本文件,用作引用依賴項目配置

//引入依賴項目名
include 'library'
include 'library_pullToRefresh'
//創建目錄引用,最後引號中是依賴項目存放的絕對路徑
project(':library').projectDir = new File('/Users/freedoms/git/library')
project(':library_pullToRefresh').projectDir = new File('/Users/freedoms/git/library_pullToRefresh')

4、在主項目的build.gradle中增加以下配置
//依賴配置
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':library_pullToRefresh')
compile project(':library')
}

五、運行build腳本

1、在命令行中cd 到主項目根目錄下
2、輸入gradle clean執行(清理gradle生成的檢查文件和打出的APK,可以不做,但是不保證中間是否會有什麼奇怪問題,養成好習慣)
3、輸入gradle check執行(檢查項目,根據渠道數量不同需要時間不同)
4、輸入gradle build執行(執行build腳本,開始打包,根據渠道數量不同需要
*5、檢查主項目build.gradle配置的輸出目錄中,打好的渠道包已經在裡面了

六、註意事項(待續)

Q1、在執行check或者build時,可能會報如下錯誤

FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':lint'.
> Lint found errors in the project; aborting build.
  Fix the issues identified by lint, or add the following to your build script to proceed with errors:
  ...
  android {
      lintOptions {
          abortOnError false
      }
  }
  ...
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED

*A1:在build.gradle腳本中增加

lintOptions {
abortOnError false
}

Q2:根據渠道數量的多少,可能在打包時會報java虛擬機記憶體不足

The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space
    at com.sun.tools.javac.util.Position$LineMapImpl.build(Position.java:139)
    at com.sun.tools.javac.util.Position.makeLineMap(Position.java:63)
    at com.sun.tools.javadoc.DocCommentScanner.getLineMap(DocCommentScanner.java:438)
    at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:512)
    at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:550)
    at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:804)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
    at com.sun.tools.javac.main.Main.compile(Main.java:353)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:115)

*A2:可減少一次打包的渠道數量,然後再打包另一部分渠道(曲線救國)

七、一點廢話

此次更新版本依然保留了前一個版本未曾改變的很多配置,之前每次最無奈的就是吸收別人的經驗的時候,對一個全面的配置有所保留,所以,為別人傳授經驗時還是把完整的腳本都提供出來以方便後人。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Handler想必在大家寫Android代碼過程中已經運用得爐火純青,特別是在做阻塞操作線程到UI線程的更新上.Handler用得恰當,能防止很多多線程異常. 而Looper大家也肯定有接觸過,只不過寫應用的代碼一般不會直接用到Looper.但實際Handler處理Message的關鍵之處全都在於L
  • self.locationTimer =[NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector:@selector(transformAction) userInfo: nil repeats: YES];-(void)
  • 我現在有一個UIControllerView 裡面addView了一個UIView,我在點擊UIView的時候轉到另一個UIControllerView,按上面的導航條上面的返回按鈕返回第一個UIControllerView,在那個UIView里怎麼用pushViewController 在UIVi
  • 第三組UI組件:ImageView及其子類 主要功能是顯示圖片,任何Drawable對象都可使用ImageView來顯示。 1.圖片瀏覽器 下麵的圖片瀏覽器可以改變所查看圖片的透明度,可通過調用ImageView的setImageAlpha()方法實現。還可以通過一個小區域查看圖片的原始大小。(兩個
  • 這一部分主要研究AFN的上傳和下載功能,中間涉及到各種NSURLSessionTask的一些創建的解析和HTTPSessionManager對RESTful風格的web應用的支持,同時會穿插一點NSURLSession代理方法被調用的時機和對上傳的數據的序列化的步驟。 本文主要講解的是上傳和下載的代
  • 在我剛學android 時候,然後立即就做項目。那時連eclipse 使用都不是很熟練。很多功能都不知道。新手如果這時去改app應用的包名,沒有改好會變成所有控制項在R文件裡面id都找不到。 先上兩張圖: 如果你要改的話,一般是先改R文件所在的包名,用eclipse 的快捷方式改,選中com.exam
  • 當我想從一個VC跳轉到另一個VC的時候,一般會用 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))com
  • 第二組UI組件:TextView及其子類 1. TextView(不允許用戶編輯文本內容)直接繼承了View,同時是EditText(允許用戶編輯文本內容)/Button兩個UI組件類的父類。TextView的作用就是在界面上顯示文本(類似JLabel) 下麵是TextView的幾個使用例子 1 <
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...