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