Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Androidstudio 多渠道打包apk

Androidstudio 多渠道打包apk

編輯:關於Android編程

由於國內的android市場渠道很多,為了統計每個渠道的下載和它的數據統計,我們開發人員就需要針對每個渠道打包,如果一個個打包這顯然不是開發人員愚蠢的行為,Androidstudio上有了Gradle,這就很簡單了,當然用eclipse的也有它多渠道打包的方法,這些說的是AS的打包方法。

 

這裡以友盟統計作為實例:

1.在AndroidManifest.xml裡面添加一句:

\

2.在build.gradle設置productFlavors

 

android {  
    productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
    }  
}
或者一次性修改

 

 

android {  
    productFlavors {
        xiaomi {}
        baidu {}
        wandoujia {}
    }  

    productFlavors.all { 
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] 
    }
}
\
3.我們來寫一坨代碼驗證一下

 

 

public class MainActivity extends AppCompatActivity {

    private TextView mChannel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mChannel = (TextView) findViewById(tv_channel);
        mChannel.setText(getApplicationMetaValue("UMENG_CHANNEL"));
    }

    private String  getApplicationMetaValue(String name) {
        String value= "";
        try {
            ApplicationInfo appInfo =getPackageManager()
                    .getApplicationInfo(getPackageName(),
                            PackageManager.GET_META_DATA);
            value = appInfo.metaData.getString(name);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return value;
    }
}
添加完這坨代碼,我們來點擊右邊的Gradle看一下,就可以看到我們剛才添加的渠道了

 

\
4.我們雙擊一下installBaiduDebug,它就會運行安裝到手機上了

\

就可以獲取到相對應的渠道了,點擊其他的渠道包安裝也會獲取到相應的渠道包

5.我們要打包正式版本就要生成jks簽名文件,並且打包渠道包

\\

 

 

\

\

\

然後點擊Next,去到下面那個頁面,可就可以選取相應的渠道了,也可以一次性選擇全部的渠道

\

然後點擊finish,喝杯茶等待完成就可以了

\

安裝之後就可以驗證了

6.以上是手動打包操作的,下面來一點自動化的操作

在build.gradle,哪裡添加

 

signingConfigs {
        debug {
            // No debug config
        }

        release {
            storeFile file("../yourapp.keystore")
            storePassword "your password"
            keyAlias "your alias"
            keyPassword "your password"
        }
    }
可能這樣直接暴露出來密碼什麼的不安全,現在采用下面的方法改成:

 

 

relealse {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
然後在gradle.properties文件上加上

 

 

RELEASE_KEY_PASSWORD= "your password"
RELEASE_KEY_ALIAS= "your alias"
RELEASE_STORE_PASSWORD= "your password"
RELEASE_STORE_FILE= "../yourapp.keystore"
7.然後就可以用Androidstudio下的Terminal進行assemble命令來操作了

 

 

./gradlew assembleDebug    // debug的
./gradlew assembleRelease  // Release的

然後就可以喝咖啡等待打包成功了

 

在Terminal下面會出現BUILD SUCCESSFUL就是成功了,然後在這裡就可以看到打包成功的apk了

\

除此之外assemble還能和Product Flavor結合創建新的任務,其實assemble是和Build Variants一起結合使用的,而Build Variants=Build Type+Product Flavor, 舉個例子大家就明白了:

如果我們想打包wandoujia渠道的release版本,執行如下命令就好了:

./gradlew assembleWandoujiaRelease

如果我們只打wandoujia渠道版本,則:

./gradlew assembleWandoujia

此命令會生成wandoujia渠道的Release和Debug版本

同理我想打全部Release版本:

./gradlew assembleRelease

這條命令會把Product Flavor下的所有渠道的Release版本都打出來。

總之,assemble命令創建task有如下用法:

  • **assemble**: 允許直接構建一個Variant版本,例如assembleFlavor1Debug。

  • **assemble**: 允許構建指定Build Type的所有APK,例如assembleDebug將會構建Flavor1Debug和Flavor2Debug兩個Variant版本。

  • **assemble**: 允許構建指定flavor的所有APK,例如assembleFlavor1將會構建Flavor1Debug和Flavor1Release兩個Variant版本。
給整個gradle文件看看

 

apply plugin: 'com.android.application'
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.multi_channel_study.demo"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.apk')) {
                    // 輸出apk名稱為Multi-Channel_v1.0_2016-11-04_wandoujia.apk
                    def fileName = "Multi-Channel_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    }

    signingConfigs {
        debug {
            // No debug config
        }

        relealse {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
    }

    productFlavors {
        xiaomi {}
        baidu {}
        wandoujia {}
    }


    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}

然後就可以用這樣的方法來做多渠道打包了
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved