我编译的任何 Android 应用程序都需要一些权限,即使是 Hello World 应用程序

Any Android app I compile asks for some permissions, even for a Hello World app

在创建仅将 Hello World 放入 TextView 元素的 Hello World 应用程序时,该应用程序会请求权限 "Read phone status and identity" 和 "Modify and delete SD card contents"。我在任何地方都找不到(甚至在整个项目文件夹中递归搜索)对这两个权限的任何引用。

人们抱怨他们的应用程序请求随机权限的各种线程,结果是库依赖项使用它。我不使用任何库。我的导入是 android.app.Activityandroid.widget.TextViewandroid.os.Bundle。我的 AndroidManifest.xml 包含这个:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="helloworld.test"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name">
        <activity android:name="helloactivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

注意没有 <uses-permission ...libs文件夹是空的; res 文件夹正好包含两个文件夹,每个文件夹都有一个 xml 文件:一个是布局(包含一个 LinearLayoutTextView 元素);另一个是带有应用程序名称的 values/strings.xml

最后我还检查了 .apk 文件并解码了二进制 AndroidManifest.xml 文件(它被编译成某种自定义二进制格式),它与原始文件相同。它在编译期间也不添加任何内容。

在我可以测试的所有设备上都请求了权限:两个 Android 4.4 设备和一个 5.1 设备。

编辑:环顾四周,听起来像这样:Why is my app asking for phone id permission?

我的目标是 API 19 级。~~那会是什么吗?~~ 编辑 2:没关系,针对 23 级编译没有区别/编辑 2。我真的很讨厌应用程序询问他们的权限不应该有(著名的手电筒应用程序示例),但我当然希望它也能在旧手机上 运行。

回复评论,项目没有使用gradle而是ant。这是 build.xml 文件,删除了任何注释:

<?xml version="1.0" encoding="UTF-8"?>
    <project name="helloworld" default="help">
    <property file="local.properties" />
    <property file="ant.properties" />
    <property environment="env" />
    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
        <isset property="env.ANDROID_HOME" />
    </condition>
    <loadproperties srcFile="project.properties" />
    <fail message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" />
    <import file="custom_rules.xml" optional="true" />
    <import file="${sdk.dir}/tools/ant/build.xml" />
</project>

最后 java 代码:

package helloworld.test;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class skeletonactivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView out = (TextView) findViewById(R.id.output);
        out.setText("Hello World.");
    }
}

事实证明,最低 sdk 版本很重要,它甚至不是 android create project 生成的 属性。它生成了一个 project.properties 文件,其中仅包含 target=android-19 (或我在创建项目命令中指定的目标)。

AndroidManifest.xml中你必须有这样一行:

    <uses-sdk android:minSdkVersion="19"/>

没有 minSdkVersion,它将默认为版本 1。此行位于 <manifest ...> 下方,因此 <application> 之外 标签。

对于这些特定权限,需要 API 级别 4 才能摆脱它们。使用 minSdkVersion 3 时,它仍然要求权限。