文档章节

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

不正经啊不正经
 不正经啊不正经
发布于 2015/04/21 15:55
字数 761
阅读 20150
收藏 15

使用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 manifest@versionCode value=(12) from AndroidManifest.xml:3:5
Error:(4, 5) Attribute manifest@versionName 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'
}


© 著作权归作者所有

不正经啊不正经
粉丝 54
博文 175
码字总数 133499
作品 0
宁波
私信 提问
加载中

评论(8)

一生中的最美好
一生中的最美好
请问一下,您是怎样接入各渠道sdk的呢
不正经啊不正经
不正经啊不正经 博主

引用来自“yonguo”的评论

您的文章里,“
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"
tools:replace="android:versionName,android:versionCode"


没有指定package属性,我这边会报错:“Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared”,请问你有这个问题吗?

引用来自“不正经啊不正经”的评论

不会,要在gradle中指定

引用来自“yonguo”的评论

我在 app\build.gradle 里指定了 defaultConfig { applicationId "XXXXXXXXXXXXXX" } 对吗?
是的
y
yonguo

引用来自“yonguo”的评论

您的文章里,“
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"
tools:replace="android:versionName,android:versionCode"


没有指定package属性,我这边会报错:“Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared”,请问你有这个问题吗?

引用来自“不正经啊不正经”的评论

不会,要在gradle中指定
我在 app\build.gradle 里指定了 defaultConfig { applicationId "XXXXXXXXXXXXXX" } 对吗?
不正经啊不正经
不正经啊不正经 博主

引用来自“yonguo”的评论

您的文章里,“
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"
tools:replace="android:versionName,android:versionCode"


没有指定package属性,我这边会报错:“Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared”,请问你有这个问题吗?
不会,要在gradle中指定
y
yonguo
您的文章里,“
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"
tools:replace="android:versionName,android:versionCode"


没有指定package属性,我这边会报错:“Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared”,请问你有这个问题吗?
拉偶有所依
拉偶有所依
多渠道打包的话还是可以的,但是有一点想知道http://t.cn/zQ6JvmN
不正经啊不正经
不正经啊不正经 博主

引用来自“wuzhao”的评论

然后是用android studio上的build---Generate Signed APK来打包吗?

是的
wuzhao
wuzhao
然后是用android studio上的build---Generate Signed APK来打包吗?
Android studio 使用心得(十)---android studio 多渠道打包(三)

关于使用android studio 如何打包 大家可以看这两篇文章 Android studio 使用心得(四)---android studio 多渠道打包 Android studio 使用心得(四)---android studio 多渠道打包(二) 真正的项...

veidy
2015/07/28
1K
0
Android studio 使用心得(五)---代码混淆和破解apk

版权声明:本文出自veidy的博客,转载必须注明出处 转载请注明出处:http://my.oschina.net/aibenben/blog/371889 这篇文章等是跟大家分享一在Android studio 进行代码混淆配置。之前大家在e...

veidy
2015/01/26
22.7K
4
Android Gradle 常用使用场景实现方式的总结

Gradle 作为一款灵活多变的构建插件,与 Android Studio 的结合,能够解决过去使用 Eclipse 开发 App 时所遇到的诸多问题。同时,基于 Groove 这样一款 DSL 语言的脚本特性,记住各种语法显然...

亦枫
2018/10/29
0
0
Android的多渠道打包|SquirrelNote

系列文章: Android的反编译和代码混淆 Android的打包签名 [Android的多渠道打包 前言 本篇包括以下内容: 多渠道打包概述 友盟的多渠道打包 美团的多渠道打包 360的多渠道打包 多渠道打包概...

跳动的松鼠
2017/11/21
0
0
android studio gradle 配置修改

经过2年时间的研发,Google终于在近日正式发布了面向Android开发者的集成开发环境Android Studio 1.0(稳定版)。 未来计划 从Google的路线图可以看出,Android Studio未来会有3项改进: 1)...

习惯_搬砖
2014/12/10
19.6K
1

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
58分钟前
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部