ant 一键自定义打包 打包转Gradle 一键自定义打包

时间:2021-06-21 03:01:47

由于项目需求,老项目是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
这两个参数,然后修改后面的值(加大)。

参考图:
ant 一键自定义打包 打包转Gradle 一键自定义打包

ant 一键自定义打包 打包转Gradle 一键自定义打包