1. 程式人生 > >關於androidStudio使用多渠道打包

關於androidStudio使用多渠道打包

第一就是配置:在專案的build.gradle裡面配置  先上圖,再上程式碼。





第二步,就是打包。(網上有介紹用命令打包,可是我這人太懶,發現了個小竅門,直接在android studio 裡面進行。)上圖(另外,後面我還是補上了gradle命令打包的介紹。大家可以看看http://my.oschina.net/aibenben/blog/370985

如果沒有keystore,先建立一個,預設為.jks檔案,一樣的。



大家這裡建立完後,可以再回頭看看前面配置的build.gradle裡面signingConfigs的內容。是不是就懂了(其實我這裡有一個疑問,感覺如果用我這種方式去打包,簽名檔案都沒有去讀取配置檔案裡面的了)



大家可以注意這裡的Flavors,先回頭看看前面配置的buld.gradle檔案裡面的productFlavors,嘿嘿,渠道都在這了,按住ctrl,選擇你要打包的渠

道,然後Finish.靜靜等待。需要要時間


打包成功!點選直接會進入到專案


打包好的apk,就在這了。


----當然,打包的過程中,好多盆友可能會遇到一個錯誤.導致打包失敗。

Execution failed for task ':proguardGooglePlayRelease'.java.io.IOException: Can't write [D:\androidstudiocode\Demo4\build\intermediates\classes-proguard\GooglePlay\release\classes.jar] (Can't read [D:\androidstudiocode\Demo4\build\intermediates\exploded-aar\Demo4\appcompat_v7_8\unspecified\libs\android-support-v4.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [android/support/v4/b/d.class == android-support-v4.jar:android/support/v4/os/ParcelableCompatCreatorHoneycombMR2.class]))

 是因為混淆打包的時候,有重複的v4包,所以你只需要刪掉一個,在Demo4這個專案裡面,我是直接註釋掉


最後直接貼上配置程式碼

apply plugin: 'com.android.application'
  
dependencies {
//    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':appcompat_v7_8')
}
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
  
    }
}
android {
    compileSdkVersion 19
    buildToolsVersion "21.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']
        }
  
        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')
  
        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
  
    defaultConfig {
        applicationId "com.example.demo4"
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
  
        // dex突破65535的限制
        multiDexEnabled true
     // AndroidManifest.xml 裡面UMENG_CHANNEL的value為 ${UMENG_CHANNEL_VALUE}        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]
    }
    //執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,我們可以將其關掉。
    lintOptions {
        abortOnError false
    }
  
    //簽名
    signingConfigs {
        debug {
            storeFile file("C:/Users/xxx/.android/debug.keystore")
        }
        relealse {
            storeFile file("demo.jks")
            storePassword "demo123456"
            keyAlias "demo_4"
            keyPassword "demo123456"
        }
    }
    buildTypes {
        debug {
            // 顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
  
            versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
        }
  
        release {
            // 不顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
  
            //混淆
            minifyEnabled true
  
            //Zipalign優化
            zipAlignEnabled true
  
            // 移除無用的resource檔案
            shrinkResources true
            //載入預設混淆配置檔案 progudard-android.txt在sdk目錄裡面,不用管,proguard.cfg是我們自己配<span></span>的混淆檔案
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
            //簽名
            signingConfig signingConfigs.relealse
        }
    }
    //渠道Flavors,我這裡寫了一些常用的
    productFlavors {
        GooglePlay {}
        xiaomi {}
        umeng {}
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
  
  
  
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }
}