久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

在 Gradle 中使用構建類型在一臺設備上運行使用

Using build types in Gradle to run same app that uses ContentProvider on one device(在 Gradle 中使用構建類型在一臺設備上運行使用 ContentProvider 的相同應用程序)
本文介紹了在 Gradle 中使用構建類型在一臺設備上運行使用 ContentProvider 的相同應用程序的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我已設置 Gradle 以將包名稱后綴添加到我的調試應用程序中,這樣我就可以在一部手機上擁有我正在使用的發布版本和調試版本.我引用了這個:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Types

I have set up Gradle to add package name suffix to my debug app so I could have release version that I'm using and debug version on one phone. I was referencing this: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Types

我的 build.gradle 文件如下所示:

My build.gradle file looks like this:

...
android
{
    ...
    buildTypes
    {
        debug
        {
            packageNameSuffix ".debug"
            versionNameSuffix " debug"
        }
    }
}

在我開始在我的應用程序中使用 ContentProvider 之前,一切正常.我明白了:

Everything works fine until I start using a ContentProvider in my app. I get:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]

我了解這是因為兩個應用(發布和調試)正在注冊相同的 ContentProvider 權限.

I understand that this happens because two apps (release and debug) are registering same ContentProvider authority.

我看到了解決這個問題的一種可能性.如果我理解正確,您應該能夠在構建時指定要使用的不同文件.然后我應該能夠將不同的權限放在不同的資源文件中(并且從清單設置權限作為字符串資源)并告訴 Gradle 使用不同的資源進行調試構建.那可能嗎?如果是,那么任何關于如何實現這一目標的提示都會很棒!

I see one possibility to solve this. If I understand correctly, you should be able to specify different files to use when building. Then I should be able to put different authorities in different resource files (and from Manifest set authority as string resource) and tell Gradle to use different resource for debug build. Is that possible? If yes then any hints on how to achieve that would be awesome!

或者也許可以使用 Gradle 直接修改 Manifest?任何其他關于如何在一臺設備上運行與 ContentProvider 相同的應用程序的解決方案都是受歡迎的.

Or maybe it's possible to directly modify Manifest using Gradle? Any other solution on how to run same app with ContentProvider on one device is always welcome.

推薦答案

沒有一個現有的答案讓我滿意,但是 Liberty 很接近.所以這就是我的做法.首先,目前我正在使用:

None of existing answers satisfied me, however Liberty was close. So this is how am I doing it. First of all at the moment I am working with:

  • Android Studio 測試版 0.8.2
  • Gradle 插件 0.12.+
  • Gradle 1.12

我的目標是使用相同的 ContentProvider 在同一設備上運行 Debug 版本和 Release 版本.

My goal is to run Debug version along with Release version on the same device using the same ContentProvider.

在您的應用集后綴的 build.gradle 中用于調試構建:

In build.gradle of your app set suffix for Debug build:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}


AndroidManifest.xml 文件中設置 ContentProviderandroid:authorities 屬性:


In AndroidManifest.xml file set android:authorities property of your ContentProvider:

<provider
    android:name="com.example.app.YourProvider"
    android:authorities="${applicationId}.provider"
    android:enabled="true"
    android:exported="false" >
</provider>


在您的 code 中設置 AUTHORITY 屬性,該屬性可在您的實施中需要時使用:


In your code set AUTHORITY property that can be used wherever needed in your implementation:

public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider";

提示:之前是BuildConfig.PACKAGE_NAME

我將再次從我當前的設置開始:

Once again I will start with my current setup:

  • Android Studio 測試版 0.9.2
  • Gradle 插件 0.14.1
  • Gradle 2.1

基本上,如果您需要為不同的構建自定義一些值,您可以從 build.gradle 文件中完成:

Basically, if you need to customise some values for different builds you can do it from the build.gradle file:

  • 使用 buildConfigFieldBuildConfig.java 類中訪問它
  • 使用 resValue 從資源中訪問它,例如@string/your_value
  • use buildConfigField to access it from the BuildConfig.java class
  • use resValue to access it from resources e.g. @string/your_value

作為資源的替代方案,您可以創建單獨的 buildType 或風味目錄并覆蓋其中的 XML 或值.但是,我不會在下面的示例中使用它.

As an alternative for resources, you can create separate buildType or flavour directories and override XMLs or values within them. However, I am not going to use it in example below.

build.gradle 文件中添加以下內容:

In build.gradle file add the following:

defaultConfig {
    resValue "string", "your_authorities", applicationId + '.provider'
    resValue "string", "account_type", "your.syncadapter.type"
    buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type"'
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        resValue "string", "your_authorities", defaultConfig.applicationId + '.debug.provider'
        resValue "string", "account_type", "your.syncadapter.type.debug"
        buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type.debug"'
    }
}

您將在 BuildConfig.java 類中看到結果

You will see results in BuildConfig.java class

public static final String ACCOUNT_TYPE = "your.syncadapter.type.debug";

并在 build/generated/res/generated/debug/values/generated.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Automatically generated file. DO NOT MODIFY -->
    <!-- Values from default config. -->
    <item name="account_type" type="string">your.syncadapter.type.debug</item>
    <item name="authorities" type="string">com.example.app.provider</item>

</resources>


在您的 authenticator.xml 中使用 build.gradle 文件中指定的資源


In your authenticator.xml use resource specified in build.gradle file

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
                       android:accountType="@string/account_type"
                       android:icon="@drawable/ic_launcher"
                       android:smallIcon="@drawable/ic_launcher"
                       android:label="@string/app_name"
/>


在您的 syncadapter.xml 中再次使用相同的資源,并且 @string/authorities


In your syncadapter.xml use the same resource again and @string/authorities too

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
              android:contentAuthority="@string/authorities"
              android:accountType="@string/account_type"
              android:userVisible="true"
              android:supportsUploading="false"
              android:allowParallelSyncs="false"
              android:isAlwaysSyncable="true"
        />

提示:自動補全(Ctrl+Space)不適用于這些生成的資源,因此您必須手動輸入它們

Tip: autocompletion(Ctrl+Space) does not work for these generated resource so you have to type them manually

這篇關于在 Gradle 中使用構建類型在一臺設備上運行使用 ContentProvider 的相同應用程序的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

IncompatibleClassChangeError after updating to Android Build Tools 25.1.6 GCM / FCM(更新到 Android Build Tools 25.1.6 GCM/FCM 后出現 IncompatibleClassChangeError)
How to get current flavor in gradle(如何在 gradle 中獲取當前風味)
How to fix quot;unexpected element lt;queriesgt; found in lt;manifestgt;quot; error?(如何修復“意外元素lt;查詢gt;在“清單中找到錯誤?)
Multi flavor app based on multi flavor library in Android Gradle(基于 Android Gradle 中多風味庫的多風味應用)
Android dependency has different version for the compile and runtime(Android 依賴在編譯和運行時有不同的版本)
Transitive dependencies for local aar library(本地 aar 庫的傳遞依賴)
主站蜘蛛池模板: 亚洲第一福利网 | 一区二区三区视频免费观看 | 欧美视频在线免费 | 一级午夜aaa免费看三区 | 国产黄色大片在线免费观看 | 久久精品一区二区三区四区 | 日本精品一区二区三区视频 | 精品美女久久久久久免费 | 怡红院免费的全部视频 | 精品欧美一区二区精品久久 | 黄网站涩免费蜜桃网站 | 中文字幕亚洲视频 | 欧美一区二区大片 | 日本一区二区不卡视频 | a视频在线 | 日韩成人av在线 | 国产成人免费视频 | 操操操操操 | 精品国产精品 | 国产精品亚洲片在线播放 | 久久99精品久久久久久噜噜 | 黑人粗黑大躁护士 | 自拍偷拍第一页 | 亚洲一区二区三区福利 | 久久久久国产精品午夜一区 | 天天摸天天干 | 国产午夜视频 | 中文字幕在线二区 | 亚洲综合二区 | 精品国产一级 | 免费a国产 | 久久久久久国产 | 欧美日韩在线精品 | 久一久| 欧美一区二区三区在线视频 | a级性视频 | ww亚洲ww亚在线观看 | 久久色视频 | 国产精品欧美一区二区三区不卡 | 国产综合网站 | 欧美一区二区在线 |