【发布时间】:2015-11-17 13:40:28
【问题描述】:
我正在尝试设置风格,所以我可以在同一个项目中构建不同的应用程序,共享相同的代码......但我不确定我是否完全正确......
我在文件夹 W:\android-studio-projects\sharedid\ 中创建了一个名为 com.sharedid.app 的项目
为此我有
1) 在 W:\android-studio-projects\sharedid\app\src\main 中创建了 AndroidManifest.xml,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sharedid.app"
android:versionCode="1"
android:versionName="1.0"
>
<activity android:name="com.shared.app.SharedMain" android:label="@string/MicMainName" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</manifest>
2) 在 W:\android-studio-projects\sharedid\app\src\main\java ...我有所有 .java 文件
3) 在 W:\android-studio-projects\sharedid\app\src\main\res 我拥有所有共享和/或虚拟资源
为了我的口味我有:
1) 我在 W:\android-studio-projects\sharedid\app\src\myflavour 中创建了 AndroidManifest.xml(这个文件定义了一切——每种风格都不同)
2) 在 W:\android-studio-projects\sharedid\app\src\myflavour\res 我有一个文件夹 drawable-hdpi 包含各种图形
3) 在 W:\android-studio-projects\sharedid\app\src\myflavour\assets 我有 那个 特定应用程序的各种数据、配置和图形文件。 (由代码在运行时读取)
4) 在 *W:\android-studio-projects\sharedid\app\src\myfavlour* 我有以下 AndroidManifest.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myflavour.app"
android:versionCode="2"
android:versionName="2.0"
>
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="17"
/>
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/app_logo__forlarge"
android:label="@string/MicAppName"
android:theme="@style/MicTheme_myflavour"
android:name="com.shared.app.MicApp"
>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myflavour.app.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_filepaths" />
</provider>
<activity android:name="com.shared.app.SharedMain" android:label="@string/MicMainName" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity>...more...</activity>
</application>
</manifest>
“Gradle Scripts”-“Build Gradle”(模块:app)如下所示:
apply plugin: 'com.android.application'
android {
signingConfigs {
}
compileSdkVersion 21
buildToolsVersion '21.1.2'
defaultConfig {
applicationId "com.sharedid.app"
minSdkVersion 9
targetSdkVersion 17
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
}
repositories {
maven { url "https://jitpack.io" }
}
productFlavors {
myflavour {
applicationId "com.myflavour.app"
}
}
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
myflavour {
manifest.srcFile 'src/myflavour/AndroidManifest.xml'
}
}
}
dependencies {
compile 'com.android.support:support-v4:18.0.0'
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:appcompat-v7:21.1.2'
compile 'com.github.PhilJay:MPAndroidChart:v2.0.8'
}
我的问题是这样的
当我在“构建变体”中选择“module=app”和“build-variant=com.myflavor.appDebug”并单击“运行 > 调试...”时,我会看到一个对话框,其中指出:“错误: 未找到默认活动”
根据我对风味的研究,我不需要定义源集路径,因为我使用默认的 convention 文件作为风味......如果我是对的 - 那么为什么它看不到所选风格的 Androidmanifest 文件?
我的理解基于以下参考链接:
- https://developer.android.com/tools/building/manifest-merge.html
- Gradle flavors for android with custom source sets - what should the gradle files look like?
其他问题排查
在我试图找到这个问题的根源时,我开始怀疑清单合并不起作用。这种怀疑的原因是,如果我忽略了关于没有活动的错误并试图将编译的应用程序推送到移动设备上,我会收到一个关于版本号小于移动设备上安装的版本号的警告 - 明确指示错误清单文件正在被使用。
所以我也尝试删除 src/main/AndroidManifest.xml 导致错误:
发现任务配置有问题 ':app:checkmyflavorDebugManifest'。文件 W:\android-studio-projects\sharedid\src\main\AndroidManifest.xml' 为属性“清单”指定的不存在
这让我相信 Android Studio 完全忽略了我实际上是在指定它使用另一个清单文件......同时虽然看起来我正在构建正确的变体版本。
我会感谢任何对此的评论/分析 - 即使只是为了确认我对原因的想法
我当前设置的屏幕截图
(在此屏幕截图中,我已经尝试删除主/共享的 androidmanifest 文件,但否则它会完成)
最新更新
我得出结论,风味不起作用/我的 gradle 设置一定是错误的。如果我例如选择构建变体 myflavorDebug Android studio 不使用 gradle 中定义的清单文件。仅此一项就足以断定问题出在哪里。
也许我的 gradle 文件在某种程度上是错误的,我不知道,但我非常小心地让我正确。如果有人在赏金活动期间发布答案,我会尽快分配。
【问题讨论】:
-
我认为 AndroidManifest 需要声明任何包含活动的类。
-
每种风格都有自己的 AndroidManifest 也有。这是 Google 自己的关于清单文件应该如何合并的文档的链接:developer.android.com/tools/building/manifest-merge.html - 也许我误解了它
-
您的清单文件应该有活动类,但我没有在清单文件中看到它。你的活动班级名称是什么?您应该将其添加到应用程序标签中的清单文件中。
-
我现在已经包含了我的风格的清单文件...是你想看的那个吗?还是您的意思是共享清单应该包含一个虚拟活动类?
-
我也尝试在共享的 androidmanifest 文件中插入活动代码 - 没有区别。我还尝试了我的构建 gradle 中清单文件的“硬编码”路径。
标签: java android android-studio