ant 一鍵自定義打包 打包轉Gradle 一鍵自定義打包

由於項目需求,老項目是Eclipse的,爲了方便 編譯,混淆,打包,簽名所以用了ant一鍵打包。
簡單說下原理:

1、通過Java工程讀取本地Json文件,獲取 JDK安裝路徑、ant路徑、開發工具的SDK路徑、NDK路徑、項目路徑、包名、輸出路徑、keystore路徑、keystorealias、keystorepassword、輸出的appname、圖片資源路徑(圖標)等。

2、通過File類,IO流,將原項目拷貝到輸出路徑,然後就開始:
刪除過時的資源文件…
重命名包路徑…
正在拷貝文件…
修改包引用…
修改AndroidManifest.xml,包名,修改權限
修改HQCHApplication.java
修改string.xml
修改程序icon
修改程序資源文件…

3、然後構建一個.bat文件,執行ant打包

set JAVA_HOME=D:/Java/jdk
set ant_home=D:/ant/apache-ant-1.9.7
set path=D:/ant/apache-ant-1.9.7/bin;D:/Java/jdk/bin
ant -buildfile g:/test/buildwindows.xml

4、說下buildwindows.xml,組成部分(點擊跳轉):

<!-- 定義自己的輸出目錄 -->
<!-- 定義 R.java 所有目錄 -->
<!-- 讀取目錄 -->
<!-- 定義jar文件路徑(默認爲工程的libs目錄下)-->
<!-- 輸出目錄 -->
<!-- 臨時類資源文件 -->
<!-- 最終生成文件 -->
<!-- 要使用的工具 -->
<!-- 最終生成各種包文件 -->
<!-- 簽名工具-->
<!-- 初始化 -->
<!-- 如果項目包含了jni代碼, 對jni代碼重新編譯 -->  
<!-- 步驟 1: aapt生成R.java -->
<!-- Generate java classes from .aidl files. -->
<!-- 步驟 2. 編譯所有class文件. -->
<!-- 步驟 3. 轉換class文件爲dex文件. 並開啓混淆(proguard)-->
<!-- 混淆內容 --> 
<!-- 步驟 4. 將資源和清單打包. -->
<!-- 步驟 5. 將打好的包編譯爲APK文件. -->
<!-- 步驟 6. 簽名APK文件  -->
<!-- zipalign優化android程序-->

然後因爲項目方法快超65535了,所以轉studio,可以自動分包,說下gradle一鍵打包流程:
因爲需求還是打多種包,不同包名不同key,相當於是不同的應用,所以:
1、2步照舊,第三步移除ant 添加 gradlew assembleRelease,通過gradle打包。
主要注意項目移植過來,部分方法過期,改成新的方法,然後就是build.gradle文件的配置:

apply plugin: 'com.android.application'

buildscript {
    repositories {
        mavenCentral()
        jcenter()
        google()
    }
    dependencies {
        classpath'com.android.tools.build:gradle:3.0.1'
    }
}

dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
}

android {
    compileSdkVersion 23
    buildToolsVersion '26.0.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']
            jniLibs.srcDirs=['libs']
        }

        instrumentTest.setRoot('tests')

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    packagingOptions {
        pickFirst'lib/armeabi/libyygycheck.so' 
    }

    lintOptions {
        //屏蔽錯誤(不因爲有錯誤,停止編譯)
        abortOnError false
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

    //簽名配置
    signingConfigs {

        debug{
            storeFile file('D:/initfiles/android_key')  //絕對路徑
            storePassword "123456"
            keyAlias "android"
            keyPassword "123456"
        }
        release {
            storeFile file('D:/initfiles/android_key')  //絕對路徑
            storePassword "123456"
            keyAlias "android"
            keyPassword "123456"
        }
    }

    buildTypes{
        debug {
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
            // 顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
        }
        release {
            minifyEnabled true //混淆
            zipAlignEnabled true
            shrinkResources false //刪除無用資源
            signingConfig signingConfigs.release
            // 顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    externalNativeBuild {
        ndkBuild {
            path 'jni/Android.mk'
        }
    }
    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir/ndk-build.cmd",
                '-C', file('jni').absolutePath, // Change src/main/jni the relative path to your jni source
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }

    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir/ndk-build.cmd",
                '-C', file('jni').absolutePath, // Change src/main/jni the relative path to your jni source
                'clean'
    }

    clean.dependsOn 'cleanNative'

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }

    defaultConfig{
      // dex突破65535的限制
        multiDexEnabled true
        ndk {
            abiFilters "armeabi","x86"
        }
    }
}

allprojects {
    repositories {
        jcenter()
        flatDir {
            dirs 'libs'
        }
        google()
    }
}

下面說下過程中遇到的問題:

ant打包

java項目打包異常:java.lang.OutOfMemoryError: GC overhead limit exceeded

找到你這個項目的SDK,然後找到這個項目的Build Tools Version版本(eg.26.0.2),然後找到dx.bat 文件,然後右鍵打開,找到
set defaultXmx=-Xmx2048M
set defaultXss=-Xss10m
這兩個參數,然後修改後面的值(加大)。

參考圖:
這裏寫圖片描述

這裏寫圖片描述

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