引用从不同构建风格之间共享的Android代码生成的R类

use*_*994 2 android gradle

我的问题类似于这个没有答案的问题:

/sf/ask/1440062501/

我正在尝试将一堆所有共享相同代码库的Android项目(当然还有不同的软件包名称)转换为一个多味道的Android Studio/gradle项目.之前的每个应用程序都将成为新项目的构建风格.我从Eclipse导出并导入到Android Studio,并将其构建.

我的问题是,当我将com.company.appname的源代码重构为com.company.common时,带有"appname"风格,现在R文件仍然是com.company.appname.R.我无法从公共代码中引用它,因为下一个风格将包含com.company.otherappname.R.

这是我的build.gradle,如果这有用的话.

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 9

        testPackageName "com.company.common.common"
        testInstrumentationRunner "android.common.InstrumentationTestRunner"
    }

    buildTypes {
        debug {
            packageNameSuffix ".debug"
        }
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    productFlavors {
        AppName {
            packageName "com.company.appname"
        }
    }
}

dependencies {
    some libraries and stuff
}
Run Code Online (Sandbox Code Playgroud)

我可以粘贴清单,如果这会有所帮助.我可以使用反射来破解解决方案,但这很讨厌并且在引用资源时放弃了所有编译时的安全性,我想避免这种情况.唯一的其他解决方案是不从任何公共代码引用R类?

Xav*_*het 5

由于所有风格共享代码,因此所有风格的R类都在同一个包中生成.这是宣布的包裹src/main/AndroidManifest.xml

构建系统将通过使所有flavor具有自己的包名称来处理此问题,但R类在任何地方都是相同的.(通常在清单中声明的​​包中生成R类的事实只是一个可以覆盖的默认值)

在设备或Play商店中识别应用时,不会使用或引用R类使用的包.在这种情况下,它是在使用的flavor中声明的packageName.