1. 程式人生 > >android通過gradle切換域名,替換app的String資源(修改app名稱,圖示)

android通過gradle切換域名,替換app的String資源(修改app名稱,圖示)

需求

現在專案已經實現jenkins自動打包,現在需要在jenkns中的shell修改一個引數即可打包生成各種版本的app,例如 生成:

  • 測試環境有除錯資訊的app
  • 預上線環境有除錯資訊
  • 預上線環境無除錯資訊
  • 正式環境有除錯資訊,
  • 正式環境(發包版本無除錯資訊)

順便說下 目前生成的檔案是通過 gradle 命令打包生成的.然後通過shell命令從工作空間將apk拷貝出來.供測試人員下載.

解決思路

因為gradle 是groovy 語法 ,那麼我定義各種域名後在 buildTypes 裡面新增各種型別的版本.讀取各種版本的域名.

還有一些其他技巧 比如打包生成的apk 統一放在 output/main 目錄下 除了debug 版本

除錯資訊的含義

除錯資訊是可以在app裡面看到一些網路請求引數,返回值,app的crash.以懸浮窗實現

配置檔案

apply plugin: 'com.android.application'

android {
    //DOMAIN
    def API_RELEASE_DOMAIN = "\"正式環境\""
    //正式環境
    def API_RELEASE = "\"https://正式環境\""

    //DOMAIN
    def API_TEST_DOMAIN = "\"測試環境\""
    //測試環境
    def API_TEST = "\"http://測試環境\""
//DOMAIN //預發環境 def API_PRE_RELEASE = "\"https://預發環境\"" def API_PRE_RELEASE_DOMAIN = "\"預發環境\"" //開發環境DOMAIN def API_DEV_DOMAIN = "\"開發環境\"" //開發環境 def API_DEV_HOST = "\"http://開發環境\"" compileSdkVersion 25 buildToolsVersion '26.0.2' //23 編譯版本需要新增這句話,低於23 不需要 useLibrary 'org.apache.http.legacy'
aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false defaultConfig { multiDexEnabled true applicationId "com.a1chemic.promotion.android" minSdkVersion 12 targetSdkVersion 23 versionCode 201 versionName "2.0.1" buildConfigField("String", "API_HOST", "${API_DEV_HOST}") buildConfigField("String", "API_DOMAN", "${API_DEV_DOMAIN}") ndk { abiFilters "armeabi", "x86", "mips" } } dexOptions { javaMaxHeapSize "4g" } aaptOptions { cruncherEnabled = false useNewCruncher = false } lintOptions { checkReleaseBuilds false abortOnError false } signingConfigs { release { v1SigningEnabled true v2SigningEnabled true } } loadSigningConfigs() buildTypes { //開發 自己用的 debug { buildConfigField "String", "API_HOST", "${API_DEV_HOST}"//API Host buildConfigField "String", "API_DOMAN", "${API_DEV_DOMAIN}"//測試地址 buildConfigField "boolean", "SING_DEBUG", "true" buildConfigField "boolean", "DEBUGINFO", "true" resValue "string", "AppName", "應用開發板" } //測試 顯示除錯 debugTest { signingConfig signingConfigs.release buildConfigField "String", "API_HOST", "${API_TEST}"//API Host buildConfigField "String", "API_DOMAN", "${API_TEST_DOMAIN}"//測試地址 buildConfigField "boolean", "SING_DEBUG", "true" buildConfigField "boolean", "DEBUGINFO", "true" matchingFallbacks = ['debug'] resValue "string", "AppName", "應用測試版" } //預上線 顯示除錯 preRelease { signingConfig signingConfigs.release buildConfigField "String", "API_HOST", "${API_PRE_RELEASE}"//預上線 API Host buildConfigField "String", "API_DOMAN", "${API_PRE_RELEASE_DOMAIN}"//預上線 buildConfigField "boolean", "SING_DEBUG", "false" buildConfigField "boolean", "DEBUGINFO", "true" matchingFallbacks = ['debug'] resValue "string", "AppName", "應用預覽版" } //正式 有除錯資訊 releasePE { minifyEnabled false signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField "String", "API_HOST", "${API_RELEASE}"//API Host buildConfigField "String", "API_DOMAN", "${API_RELEASE_DOMAIN}"//正式地址 buildConfigField "boolean", "SING_DEBUG", "false" buildConfigField "boolean", "DEBUGINFO", "true" matchingFallbacks = ['release'] resValue "string", "AppName", "應用名稱" } //預上線Demo 無除錯資訊 preReleaseDemo { signingConfig signingConfigs.release buildConfigField "String", "API_HOST", "${API_PRE_RELEASE}"//預上線 API Host buildConfigField "String", "API_DOMAN", "${API_PRE_RELEASE_DOMAIN}"//預上線 buildConfigField "boolean", "SING_DEBUG", "false" buildConfigField "boolean", "DEBUGINFO", "false" matchingFallbacks = ['release'] resValue "string", "AppName", "應用預覽版" } //正式 無除錯資訊 release { debuggable false minifyEnabled false //啟用Proguard --正常應該是true shrinkResources false //是否清理無用資源,依賴於minifyEnabled zipAlignEnabled true //是否啟用zipAlign壓縮 minifyEnabled false signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField "String", "API_HOST", "${API_RELEASE}"// buildConfigField "String", "API_DOMAN", "${API_RELEASE_DOMAIN}"// buildConfigField "boolean", "SING_DEBUG", "false" buildConfigField "boolean", "DEBUGINFO", "false" resValue "string", "AppName", "正式名稱" } } sourceSets { main { jniLibs.srcDir 'libs' //說明so的路徑為該libs路徑,關聯所有地圖SDK的so檔案 manifest.srcFile 'src/main/AndroidManifest.xml' java.srcDirs = ['src/main/java'] resources.srcDirs = ['src/main/resources'] res.srcDirs = ['src/main/res'] assets.srcDirs = ['src/main/assets'] } vivo.res.srcDirs = ['src/main/res-vivo'] } flavorDimensions "default" productFlavors { main { dimension "default" } // vivo { dimension "default" } //vivo // baidu { dimension "default" } //百度 // tencent { dimension "default" } //應用寶 // xiaomi { dimension "default" } //小米 // qh360 { dimension "default" } //360 // huawei { dimension "default" } //華為 // wandoujia { dimension "default" } //豌豆莢 // vivo { dimension "default" } //vivo // oppo { dimension "default" } //oppo // meizu { dimension "default" } //魅族 } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } applicationVariants.all { variant -> if (variant.buildType.name != "debug") {//防止AS無法安裝debug包(apk) variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/app/build/outputs/apk/main") } variant.outputs.all { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 輸出apk名稱為com_biniusports_app_bnsports_v1.0.0_20171205_baidu.apk def fileName = "應用_${variant.buildType.name}_V${defaultConfig.versionName}_${getNowTime()}_${variant.productFlavors[0].name}.apk" outputFileName = fileName } } } } //獲取時間戳 def getNowTime() { def date = new Date() def now = date.format('yyyyMMdd') return now } /** * 載入簽名配置檔案 */ def loadSigningConfigs() { Properties props = new Properties() def propFile = file('../signing.properties') if (propFile.canRead()) { props.load(new FileInputStream(propFile)) //釋出版本的簽名配置 android.signingConfigs.release.storeFile = file(props['KEYSTORE_FILE']) android.signingConfigs.release.storePassword = props['KEYSTORE_PWD'] android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] android.signingConfigs.release.keyPassword = props['KEY_PWD'] /* //除錯版本的簽名配置 android.signingConfigs.debug.storeFile = file(props['DEBUG_KEYSTORE']) android.signingConfigs.debug.storePassword = props['DEBUG_KEYSTORE_PWD'] android.signingConfigs.debug.keyAlias = props['DEBUG_ALIAS'] android.signingConfigs.debug.keyPassword = props['DEBUG_KEY_PWD']*/ } } dependencies { compile 'com.android.support:multidex:1.0.1' compile files('libs/android-support-v7-recyclerview.jar') }

jenkins shell命令

#測試版-測試環境 - 分支 dev:Test
#預覽版-預生產環境-分支 dev:Pre
#生產版-生產環境 - 分支 dev:PE
#演示版-預生產環境-分支 master:Demo
#商店版-生產環境 - 分支 master:AppStore
DEFINE=AppStore

if [ "${DEFINE}" == "Test" ]; then
        AssembleBuild="assembledebugTest"
    elif [ "${DEFINE}" == "Pre" ]; then
        AssembleBuild="assemblepreRelease"
    elif [ "${DEFINE}" == "PE" ]; then
        AssembleBuild="assemblereleasePE"
    elif [ "${DEFINE}" == "Demo" ]; then
        AssembleBuild="assemblepreReleaseDemo"
    elif [ "${DEFINE}" == "AppStore" ]; then
        AssembleBuild="assemblerelease"
    fi

gradle clean ${AssembleBuild}

如何使用域名

BuildConfig.API_HOST 就行了

圖示的修改

 //預上線Demo 無除錯資訊
        preReleaseDemo {
            signingConfig signingConfigs.release
            buildConfigField "String", "API_HOST", "${API_PRE_RELEASE}"//預上線 API Host
            buildConfigField "String", "API_DOMAN", "${API_PRE_RELEASE_DOMAIN}"//預上線
            buildConfigField "boolean", "SING_DEBUG", "false"
            buildConfigField "boolean", "DEBUGINFO", "false"
            matchingFallbacks = ['release']
            resValue "string", "AppName", "應用預覽版"
            manifestPlaceholders =[app_icon:"@drawable/app_icon_test"]
        }
 manifestPlaceholders =[app_icon:"@drawable/app_icon_test"]
 //app_icon_test 這個就是需要的圖示

在AndroidManifest.xml中替換\
android:icon=”${app_icon}”
就做這兩步就OK了

TODU

後面有時間還要做的是使用命令列進行360加固,這樣打包出來之後就可以直接釋出市場了.