編輯:關於android開發
安卓開發完成,對於一個開放應用而言,我們需要發布到不同的應用市場,同時我們也需要統計不同市場的用戶下載量。(通過啟動應用後獲取不同市場apk中的不同值來區分)
下面用一個具體的實例來說明:
1、在AndroidManifest.xml的application內添加meta-data標簽
2、修改build.gradle文件,在android {} 中添加
android {
// 打包渠道List
productFlavors {
wandoujia {
manifestPlaceholders = [APP_CHANNEL_VALUE: "豌豆莢"]
}
cn360 {
manifestPlaceholders = [APP_CHANNEL_VALUE: "360"]
}
baidu {
manifestPlaceholders = [APP_CHANNEL_VALUE: "百度"]
}
tencent {
manifestPlaceholders = [APP_CHANNEL_VALUE: "應用寶"]
}
sougou {
manifestPlaceholders = [APP_CHANNEL_VALUE: "搜狗市場"]
}
}
}
或者使用下面方法,直接使用flavor的name做為${APP_CHANNEL_VALUE}
android {
// 打包渠道List
productFlavors {
wandoujia {}
cn360 {}
baidu {}
tencent {}
sougou {}
}
// 批量處理,直接使用flavor的name作為APP_CHANNEL_VALUE的值
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [APP_CHANNEL_VALUE: name]
}
}
這樣就完成了,執行 gradle assembleRelease 喝口茶坐等便可。
完成後,到build/outputs/apk中就可以看到各種渠道包。
有關assemble可用的命令還有:
gradle assembleDebug //所有Debug版本
gradle assembleRelease //所有Release版本
gradle assembleBaidu //指定渠道的Debug和Release版本
gradle assembleBaiduDebug //指定渠道的Debug版本
gradle assembleBaiduRelease //指定渠道的Release版本
gradle build //所有渠道的Debug和Release版本
最後附上我的 MainActivity 和 build.gradle
package com.example.myandroid;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.widget.Toast;
/**
* 應用入口
*
* @author SHANHY([email protected])
* @date 2015年12月30日
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String channel = getAppMetaData("APP_CHANNEL");
if(channel != null)
Toast.makeText(this, channel, Toast.LENGTH_SHORT).show();
}
/**
* 獲取Application下面的metaData
*
* @param name
* @return
* @author SHANHY
* @date 2015年12月30日
*/
public String getAppMetaData(String meta_name){
try {
ApplicationInfo appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
return appInfo.metaData.getString(meta_name);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
完整的 build.gradle 腳本
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-alpha3'
}
}
apply plugin: 'com.android.application'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 14
buildToolsVersion "23.0.2"
defaultConfig {
// 可以手動修改如下一些配置,無需改動任何代碼便可以生成對應配置的apk
applicationId "com.example.myandroid.aaa"
minSdkVersion 8
targetSdkVersion 21
versionCode 200
versionName "2.0.0"
// dex突破65535限制
multiDexEnabled true
// 默認打包渠道(官方)
manifestPlaceholders = [APP_CHANNEL_VALUE: "官方"]
}
// 打包渠道List
productFlavors {
myself {
manifestPlaceholders = [APP_CHANNEL_VALUE: "官方"]
}
wandoujia {
manifestPlaceholders = [APP_CHANNEL_VALUE: "豌豆莢"]
}
cn360 {
manifestPlaceholders = [APP_CHANNEL_VALUE: "360"]
}
baidu {
manifestPlaceholders = [APP_CHANNEL_VALUE: "百度"]
}
tencent {
manifestPlaceholders = [APP_CHANNEL_VALUE: "應用寶"]
}
sougou {
manifestPlaceholders = [APP_CHANNEL_VALUE: "搜狗市場"]
}
}
// 打包渠道List
//productFlavors {
// myself {}
// wandoujia {}
// cn360 {}
// baidu {}
// tencent {}
// sougou {}
//}
// 批量處理,直接使用flavor的name作為APP_CHANNEL_VALUE的值(也可以不使用該方法,在productFlavors中逐一配置)
//productFlavors.all { flavor ->
// flavor.manifestPlaceholders = [APP_CHANNEL_VALUE: name]
//}
lintOptions {
abortOnError false
}
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/
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src//... 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')
}
//簽名信息
signingConfigs {
debug{
// No Debug Config
}
release {
storeFile file("xxxxx.key")
storePassword "xxxxx"
keyAlias "xxxxx"
keyPassword "xxxxx"
}
}
buildTypes {
//Debug模式
debug {
// 顯示LOG
buildConfigField "boolean", "LOG_DEBUG", "true"
versionNameSuffix "-debug"
// 不開啟混淆
minifyEnabled false
// 不需要ZIP優化
zipAlignEnabled false
// 不需要資源壓縮
shrinkResources false
// signingConfig
signingConfig signingConfigs.debug
}
//Release模式
release {
// 不顯示LOG
buildConfigField "boolean", "LOG_DEBUG", "true"
minifyEnabled true
zipAlignEnabled true
// 資源壓縮,移除無用的資源文件
shrinkResources true
// 混淆文件配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 簽名信息配置(如果上面配置了defaultConfig則可以不用指定signingConfig)
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 輸出apk名稱為myandroid_v1.0.0_2015-12-30_baidu.apk
def fileName = "myandroid_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
}
// 聲明一個方法,獲取打包時間
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
Linux2.6內核協議棧系列--TCP協議1.發送,linux2.6--tcp在介紹tcp發送函數之前得先介紹很關鍵的一個結構sk_buff,在linux中,sk_bu
android okvolley框架搭建,androidokvolley最近新出了很多好東西都沒時間去好好看看,現在得好好復習下了,記下筆記 記得以前用的框架是andro
仿Android印象筆記底部導航欄 最近用上了印象筆記,覺得android 版的底部導航欄挺不錯的,好多應用裡面都有用到,想著自己動手實現一下,不多說,先上圖:
andoird軟件開發之一個記錄賬號密碼的APP--bmob後台,andoirdapp--bmob1.app功能:通過注冊登錄賬戶,擁有一個賬戶本,能夠將平時自己容易的忘