由於項目需求,老項目是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
這兩個參數,然後修改後面的值(加大)。
參考圖: