Android Studio 多渠道打包遇到的问题总结

使用gradle构建android的默认project结构:

src/main
       ----java/
       ----res/
       ----assets/
       ----aidl/
       ----rs/
       ----jni/
       ----AndroidManifest.xml
src/androidTest/
       ----java/

问题一、因为sourceSets配置而导致的:specified for property ‘manifest‘ does not exist.

官方的配置:

android {
    sourceSets {
        main {
            manifest.srcFile ‘AndroidManifest.xml‘
            java.srcDirs = [‘src‘]
            resources.srcDirs = [‘src‘]
            aidl.srcDirs = [‘src‘]
            renderscript.srcDirs = [‘src‘]
            res.srcDirs = [‘res‘]
            assets.srcDirs = [‘assets‘]
        }
    }
}

我的配置:

 sourceSets {
        main {
            manifest.srcFile ‘src/main/AndroidManifest.xml‘
            java.srcDirs = [‘src/main/java‘]
           /* resources.srcDirs = [‘src/main/res‘]
            aidl.srcDirs = [‘src‘]
            renderscript.srcDirs = [‘src‘]*/
            res.srcDirs = [‘src/main/res‘]
            assets.srcDirs = [‘src/main/assets‘]
        }
 }

问题二、当你main版本和GooglePlay版本的Manifest配置一样时,出现:

declared at AndroidManifest.xml:157:5
Error:(3, 5) Attribute [email protected] value=(12) from AndroidManifest.xml:3:5
Error:(4, 5) Attribute [email protected] value=(2.1) from AndroidManifest.xml:4:5
	is also present at AndroidManifest.xml:4:5 value=(2.0-debug)
	Suggestion: add ‘tools:replace="android:versionName"‘ to <manifest> element at AndroidManifest.xml:1:1 to override
:app:processGooglePlayDebugManifest FAILED
Error:Execution failed for task ‘:app:processGooglePlayDebugManifest‘.
> Manifest merger failed with multiple errors, see logs

解决:

1.Suggestion: add ‘tools:replace="android:versionName"‘ to <manifest> element at AndroidManife 这句话就是叫你在AndroidManifest.xml里面加这个东西,

2.网上还有种方法在build.gradle根标签上加上useOldManifestMerger true, 我试了下不行。所以只能老老实有第一种。

<manifest  xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"
    tools:replace="android:versionName,android:versionCode"

最后上一个我自己的最终版的配置信息:

apply plugin: ‘com.android.application‘

android {

    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.deetech"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 2
        versionName "2.0"
        // AndroidManifest.xml 里面UMENG_CHANNEL的value为 ${UMENG_CHANNEL_VALUE}
       // manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]
    }

    packagingOptions{
        exclude ‘META-INF/NOTICE‘
        exclude ‘META-INF/LICENSE‘
        exclude ‘META-INF/DEPENDENCIES‘
    }

  /*  buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.txt‘
        }
    }*/

    //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
    lintOptions {
        abortOnError false
    }

    //签名
    signingConfigs {
        debug {
            storeFile file("C:/Users/Administrator/.android/debug.keystore")
        }
        relealse {
            storeFile file("F:/gradle.jks")                 //Android Studio --> Build --> Generate Signed APK --> Create New 可以生成
            storePassword "gradle"                          //在生成.jks文件时需要填入的参数一一对应即可
            keyAlias "gradle"
            keyPassword "gradle"
        }
    }

    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
        }
    }

    sourceSets {
        main {
            manifest.srcFile ‘src/main/AndroidManifest.xml‘
            java.srcDirs = [‘src/main/java‘]
           /* resources.srcDirs = [‘src/main/res‘]
            aidl.srcDirs = [‘src‘]
            renderscript.srcDirs = [‘src‘]*/
            res.srcDirs = [‘src/main/res‘]
            assets.srcDirs = [‘src/main/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‘)
        GooglePlay{                 //设置GooglePlay 渠道的配置文件位置
            manifest.srcFile ‘src/main/googlePlay/AndroidManifest.xml‘
        }
       /* xiaomi {
            manifest.srcFile ‘AndroidManifest.xml‘
        }
        umeng {
            manifest.srcFile ‘AndroidManifest.xml‘
        }*/

    }

    //渠道Flavors,我这里写了一些常用的
    productFlavors {
        GooglePlay {
            //packageName="com.deetech"   //这里可以配置不同的包名
        }
        xiaomi {
            //packageName="com.deetech"
        }
        umeng {
          //  packageName="com.deetech"
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

   /* productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }*/
    //在生成的apk文件,修改下命名而已
    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)
            }
        }
    }

}

dependencies {
   // compile ‘com.android.support:support-v4:20.0.0‘
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
    compile ‘com.google.code.gson:gson:2.2.4‘
}
时间: 2024-11-05 09:35:27

Android Studio 多渠道打包遇到的问题总结的相关文章

Android studio 使用心得(十)---android studio 多渠道打包(三)

关于使用android studio 如何打包  大家可以看这两篇文章 Android studio 使用心得(四)---android studio 多渠道打包 Android studio 使用心得(四)---android studio 多渠道打包(二) 真正的项目开发,当然是建议 Android studio 使用心得(四)---android studio 多渠道打包(二) 其实,android studio 对上面这种打包方式还有更简单的方法,就是使用as 里面自带的Terminal

Android studio 使用心得(四)—android studio 多渠道打包(二)

Android studio 使用心得(四)—android studio 多渠道打包 这篇文章讲了一种打包方式.是直接在android studio 里面可视化操作,结合配置文件.我个人觉得严格上来讲是不完全正确的操作,因为配置文件里面的签名文件根本没有用到.但是,打出来的包绝对没问题的.这篇主要是介绍直接在dos命令里面使用gradle命令打包.两行命令,简单gradle clean ,gradle build. 1,配置文件还是和之前的一样,我才贴一次代码 ? 1 2 3 4 5 6 7

[Android Studio] Android studio 多渠道打包(超简洁版)

转载:http://xuyazhou.com/archives/461 http://relex.me/using-manifestplaceholders/ 最近一直用android studio 进行开发,在开发和发版的时候,遇到一个多渠道打包的问题,由于公司里是有七个渠道的包进行分发,由于每次去AndroidManifest.xml修改渠道的值,甚是麻烦... 最后去google了一番,发现有些方法,是在gradle文件里切换各种不同的AndroidManifest.xml文件,感觉这样也

android studio 多渠道打包

第一就是配置:在项目的build.gradle里面配置  先上图,再上代码. 第二步,就是打包.(网上有介绍用命令打包,可是我这人太懒,发现了个小窍门,直接在android studio 里面进行.)上图(另外,后面我还是补上了gradle命令打包的介绍.大家可以看看http://my.oschina.net/aibenben/blog/370985) 如果没有keystore,先创建一个,默认为.jks文件,一样的. 大家这里创建完后,可以再回头看看前面配置的build.gradle里面sig

Android 使用Gradle加Android Studio 多渠道打包

转载请注明出处: http://blog.csdn.net/jjwwmlp456/article/details/45057067  ----------------- 匆忙拥挤repeat Gradle,这个东西好复杂,不过在Android中,我们知道它大概怎么用,它的依据何来,就够了. Gradle的DSL,领域特定语言(domain-specific languages,简称DSL),地址:http://gradle.org/docs/2.3/dsl/ Gradle的用户指南,地址:htt

Android Studio多渠道打包

本文所讲述的多渠道打包是基于友盟统计实施的. 多渠道打包的步骤: 1.在AndroidManifest.xml里设置动态渠道变量 <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> 2.在build.gradle设置productFlavors 这里采用批量修改: android { productFlavors { default_chann

android studio 多渠道打包,调试正式包,build.gradle解析

1,讲解build.gradle文件. 1.1根目录Android 1.1.1 defaultConfig是Android的根目录,可以配置包名等信息,若AndroidMainfest.xml也配置了,以defaultConfig的为准. 1.1.2 signingConfigs是Android的根目录,可以配置签名,如下图: 调试时若想直接用正式的签名包可以在buildType里配置. buildTypes { debug { signingConfig signingConfigs.rele

Android Studio多渠道批量打包及代码混淆

一.批量打包 1.集成了友盟统计,并在AndroidManifest.xml中添加了如下代码 <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}"/> 2.在app的build.gradle的android标签下添加如下代码: productFlavors { myapp {} _360 {} appchina {} hiapk {} } productFlavo

android的多渠道打包

本文出处:http://www.cnblogs.com/0616--ataozhijia/p/4203997.html 这里以友盟为例子. 项目快上线了,要做一个多渠道打包.不然每次都要在AndroidManifest.xml文件里修改: <meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" /> 每次都要修改value的值,简直蛋疼. 首先你必须在AndroidManifes