简体   繁体   English

Android,如何排除特定风味的特定权限?

[英]Android, how to exclude a specific permission for a specific flavor?

So I have 10 flavors in my android project: fl1, fl2, ..., fl10 with the permissions below.所以我的 android 项目中有 10 种口味:fl1、fl2、...、fl10,具有以下权限。 Now I want my fl5 not have the android.permission.REQUEST_INSTALL_PACKAGES .现在我希望我的 fl5 没有android.permission.REQUEST_INSTALL_PACKAGES How to do this?这该怎么做?

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

I know that I can have a different manifest file in fl5/AndroidManifest.xml .我知道我可以在fl5/AndroidManifest.xml有一个不同的清单文件。 And it can include any excessive element for this specific build.它可以包含此特定构建的任何过多元素。 But this can be a source of errors and mistakes as I should be careful of syncing every time I add an element to main manifest.但这可能是错误和错误的来源,因为我每次向主清单添加元素时都应该小心同步。

I have searched and found different solutions.我已经搜索并找到了不同的解决方案。 But I couldn't implement them in my project because they weren't exact.但是我无法在我的项目中实现它们,因为它们不准确。 Any help is appreciated.任何帮助表示赞赏。

Here is my fl5/AndroidManifest.xml这是我的 fl5/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mycompany.myapp">

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove"></uses-permission >

And here it is my flavors in build.gradle file:这是我在build.gradle文件中的build.gradle

  productFlavors {
    fl1 {flavorDimensions "in_1"}
    fl2 {flavorDimensions "in_2"}
    fl3 {flavorDimensions "in_3"}
    fl4 {flavorDimensions "in_4"}
    fl5 {flavorDimensions "in_5"}  
    fl6 {flavorDimensions "in_6"}
    fl7 {flavorDimensions "in_7"}
    fl8 {flavorDimensions "in_8"}
    fl9 {flavorDimensions "in_9"}
    fl10 {flavorDimensions "in_10"}       
}

Best and easiest way is to create a different AndroidManifest for each flavor.最好和最简单的方法是为每种风格创建一个不同的 AndroidManifest。 To reduce redundancy, you can create an AndroidManifest under the main folder containing all activities, services, etc... and separate AndroidManifest under each flavor's folder containing the permissions for that flavor.为了减少冗余,您可以在包含所有活动、服务等的主文件夹下创建一个 AndroidManifest,并在每个风格的文件夹下创建一个单独的 AndroidManifest,其中包含该风格的权限。

For Example, the fl1 Manifest (located at app/src/fl1/AndroidManifest.xml ) should look like:例如, fl1 清单(位于app/src/fl1/AndroidManifest.xml )应如下所示:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android">  
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>  

the fl2 Manifest (located at app/src/fl2/AndroidManifest.xml ) should look like: fl2 清单(位于app/src/fl2/AndroidManifest.xml )应如下所示:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android">  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>  

The main AndroidManifest file (located at app/src/main/AndroidManifest.xml ) should look like always but without permissions:主 AndroidManifest 文件(位于app/src/main/AndroidManifest.xml )应该看起来像总是但没有权限:

<manifest  
    xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- permissions are imported via brand-specific AndroidManifest.xml -->

    <!-- common manifest elements -->
    <application
        android:name=".ui.FSApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">

        <!-- activities -->
        <activity
            android:name=".ui.activities.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity
            android:name=".ui.activities.SecondActivity/>

        <!-- receiver ->
        <receiver android:name=".receiver.BlogPostReceiver"/>

    </application>
</manifest>  

Add tools:node="remove" in your element.在您的元素中添加tools:node="remove" In your case, add the following line in fl5/AndroidManifest.xml .在您的情况下,在fl5/AndroidManifest.xml添加以下行。

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove"/>

Take a look at Removing AndroidManifest element with gradle product flavors and How to remove specific permission when build Android app with gradle?查看使用 gradle 产品风味删除 AndroidManifest 元素以及如何在使用 gradle 构建 Android 应用程序时删除特定权限? questions.问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM