2016-06-07 110 views
0

我开发具有两种口味如下应用:摇篮建立失败不同productFlavors

productFlavors { 
    free { 
     applicationId "com.udacity.gradle.builditbigger.free" 
     versionName "1.0-free" 
    } 
    paid { 
     applicationId "com.udacity.gradle.builditbigger.paid" 
     versionName "1.0-paid" 
    } 
} 

现在我有一个免费版本的AdMob的依赖,并希望使付费版本完全无广告,因此决定在编译仅用于免费版本的依赖。我试着这样做如下:

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
compile project(":showmessage") 
testCompile 'junit:junit:4.12' 
compile project(path: ':backend', configuration: 'android-endpoints') 
compile 'com.android.support:appcompat-v7:23.1.0' 
freeCompile 'com.google.android.gms:play-services-ads:8.4.0'} 

,当我尝试打电话给gradle这个任务installPaidDebug它给了我下面的错误:

/home/hemal/Desktop/Udacity-android-nd/Build It Bigger/app/build/intermediates/manifests/full/paid/debug/AndroidManifest.xml Error:(33, 28) No resource found that matches the given name (at 'value' with value '@integer/google_play_services_version'). Error:Execution failed for task ':app:processPaidDebugResources'. com.android.ide.common.process.ProcessException: Failed to execute aapt

但是当我简单的添加下面一行: compile 'com.google.android.gms:play-services-ads:8.4.0' 该项目是无缝构建的。

我该如何克服这一点?

+0

在您的清单中,您包含对来自“play-services-ads”包的价值的参考。所以你必须包含它或编辑你的Android清单。 –

+0

@ShadyAtef你能否详细说明一下?也许是一个例子? –

+0

@Khanal好的。将留意那里的回应。 –

回答

1

正如在注释中提到的,您需要将元数据标记从src/main目录中的清单移动到src/free目录中的清单。

<!-- This meta-data tag is required to use Google Play Services. --> 
     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 

您免费清单看起来是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.udacity.gradle.builditbigger" > 


    <!-- Include required permissions for Google Mobile Ads to run --> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 


     <!-- This meta-data tag is required to use Google Play Services. --> 
     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 


     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 


       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <!-- Include the AdActivity configChanges and theme. --> 
     <activity 
      android:name="com.google.android.gms.ads.AdActivity" 
      android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
      android:theme="@android:style/Theme.Translucent" /> 
    </application> 


</manifest> 
+0

是否需要将其他标记(如标记或服务标记)添加到免费应用程序清单文件? –

+0

是的,它与src/main中的清单非常相似,在我的回答中增加了一个例子。 – Joopkins

0

我认为你必须使用分割清单文件,但请注意,同时建立清单文件进行合并。 你可以检查merging rules了解更多

0

以前有同样的问题。解决方案是清单合并。从常见的AndroidManifest中移除元标记,并在您的免费模块中创建另一个清单,并在此AndroidManifest中添加元标记。

问题是在构建付费版本时,在清单中定义了元标记(因为它是常见清单),并且没有依赖关系(因为您只在免费版本中添加了依赖项)。因此,付费版本无法识别此元标记对应的内容。