Android 12 APK 在安装时抛出无效包

Mat*_*t W 8 android apk xamarin.android azure-devops

我有一个 Azure 构建管道,它正在生成一个 APK,该 APK 可以在 Android 10 上正常安装(通过 AppCenter),但会弹出错误:

应用程序未安装,因为软件包似乎无效

在 Android 12 上。

解决方案中的内容AndroidManifest.xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.app.myapplocal" android:installLocation="auto" android:versionCode="1" android:versionName="1.1">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <application android:label="L MyApp" android:icon="@drawable/icon" android:largeHeap="true"></application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

当我通过 Android Studio 的选项检查清单时APK Analyze,我看到以下内容:

<uses-sdk
    android:minSdkVersion="21"
    android:targetSdkVersion="31" />

<uses-permission
    android:name="android.permission.FLASHLIGHT" />

<uses-permission
    android:name="android.permission.INTERNET" />

<uses-permission
    android:name="android.permission.CAMERA" />

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    android:label="D MyApp"
    android:icon="@ref/0x7f07015e"
    android:name="crc646948444ac10504e5.MainApplication"
    android:debuggable="true"
    android:allowBackup="true"
    android:largeHeap="true"
    android:extractNativeLibs="true">

    <meta-data
        android:name="com.google.android.gms.vision.DEPENDENCIES"
        android:value="barcode" />

    <activity
        android:theme="@ref/0x7f0d0001"
        android:label="MyApp"
        android:icon="@ref/0x7f07015e"
        android:name="crc646948444ac10504e5.MainActivity"
        android:screenOrientation="1"
        android:configChanges="0x680" />

    <activity
        android:theme="@ref/0x7f0d0000"
        android:name="crc646948444ac10504e5.SplashActivity"
        android:exported="true"
        android:screenOrientation="1"
        android:noHistory="true">

        <intent-filter>

            <action
                android:name="android.intent.action.MAIN" />

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

    <activity
        android:label="Web Authenticator"
        android:name="crc641e66d166111bdf3e.FormAuthenticatorActivity" />

    <activity
        android:label="Web Authenticator"
        android:name="crc641e66d166111bdf3e.WebAuthenticatorActivity" />

    <activity
        android:label="Web Authenticator Native Browser"
        android:name="crc641e66d166111bdf3e.WebAuthenticatorNativeBrowserActivity"
        android:launchMode="1" />

    <activity
        android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" />

    <service
        android:name="crc64a98abb514ffad9f1.KeepAliveService" />

    <receiver
        android:label="Essentials Connectivity Broadcast Receiver"
        android:name="crc64a0e0a82d0db9a07d.ConnectivityBroadcastReceiver"
        android:enabled="true"
        android:exported="false" />

    <receiver
        android:name="crc643f46942d9dd1fff9.PowerSaveModeBroadcastReceiver"
        android:enabled="true"
        android:exported="false" />

    <provider
        android:name="mono.android.MultiDexLoader"
        android:exported="false"
        android:authorities="com.app.myapp.mono.android.MultiDexLoader.__mono_init__"
        android:initOrder="1999999999" />

    <provider
        android:name="mono.MonoRuntimeProvider"
        android:exported="false"
        android:authorities="com.app.myapp.mono.MonoRuntimeProvider.__mono_init__"
        android:initOrder="1999999998" />

    <activity
        android:theme="@ref/0x01030010"
        android:name="com.google.android.gms.common.api.GoogleApiActivity"
        android:exported="false" />

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@ref/0x7f090008" />
</application>

<uses-permission
    android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

我之前认为 Android 12 的问题在于android:targetSdkVersion设置为,29但在解决方案清单中更改此设置并将项目文件的TargetFrameworkVersion从更改v11.0v12.0也没有帮助。(这是在 Visual Studio 中使用项目属性的Application > Compile using Android version值进行更新的。)

为了允许在最新的 Android 设备上安装,我可能会缺少什么?(恐怕我不熟悉 Xamarin 或 Android。)

Let*_*aus 10

如果您已将编译版本提高到 31,那么您需要添加

android:exported="true"
Run Code Online (Sandbox Code Playgroud)

您的活动、服务和接收者。看这里

在你的情况下

<uses-sdk
    android:minSdkVersion="21"
    android:targetSdkVersion="31" />

<uses-permission
    android:name="android.permission.FLASHLIGHT" />

<uses-permission
    android:name="android.permission.INTERNET" />

<uses-permission
    android:name="android.permission.CAMERA" />

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    android:label="D MyApp"
    android:icon="@ref/0x7f07015e"
    android:name="crc646948444ac10504e5.MainApplication"
    android:debuggable="true"
    android:allowBackup="true"
    android:largeHeap="true"
    android:extractNativeLibs="true">

    <meta-data
        android:name="com.google.android.gms.vision.DEPENDENCIES"
        android:value="barcode" />

    <activity
        android:theme="@ref/0x7f0d0001"
        android:label="MyApp"
        android:icon="@ref/0x7f07015e"
        android:name="crc646948444ac10504e5.MainActivity"
        android:screenOrientation="1"
        android:configChanges="0x680"
        android:exported="true"/>

    <activity
        android:theme="@ref/0x7f0d0000"
        android:name="crc646948444ac10504e5.SplashActivity"
        android:exported="true"
        android:screenOrientation="1"
        android:noHistory="true">

        <intent-filter>

            <action
                android:name="android.intent.action.MAIN" />

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

    <activity
        android:label="Web Authenticator"
        android:name="crc641e66d166111bdf3e.FormAuthenticatorActivity" 
        android:exported="true"/>

    <activity
        android:label="Web Authenticator"
        android:name="crc641e66d166111bdf3e.WebAuthenticatorActivity" 
        android:exported="true"/>

    <activity
        android:label="Web Authenticator Native Browser"
        android:name="crc641e66d166111bdf3e.WebAuthenticatorNativeBrowserActivity"
        android:launchMode="1"
        android:exported="true"/>

    <activity
        android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity"
        android:exported="true"/>

    <service
        android:name="crc64a98abb514ffad9f1.KeepAliveService"
        android:exported="true"/>
    <receiver
        android:label="Essentials Connectivity Broadcast Receiver"
        android:name="crc64a0e0a82d0db9a07d.ConnectivityBroadcastReceiver"
        android:enabled="true"
        android:exported="false" />

    <receiver
        android:name="crc643f46942d9dd1fff9.PowerSaveModeBroadcastReceiver"
        android:enabled="true"
        android:exported="false" />

    <provider
        android:name="mono.android.MultiDexLoader"
        android:exported="false"
        android:authorities="com.app.myapp.mono.android.MultiDexLoader.__mono_init__"
        android:initOrder="1999999999" />

    <provider
        android:name="mono.MonoRuntimeProvider"
        android:exported="false"
        android:authorities="com.app.myapp.mono.MonoRuntimeProvider.__mono_init__"
        android:initOrder="1999999998" />

    <activity
        android:theme="@ref/0x01030010"
        android:name="com.google.android.gms.common.api.GoogleApiActivity"
        android:exported="false" />

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@ref/0x7f090008" />
</application>

<uses-permission
    android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

请注意哪些内容是真正需要导出或不需要导出的,并进行相应更改。

也可能是从 Android 11 开始,应用程序中心需要强制应用程序签名者,请参阅此处此处,以防万一,这里是代码片段

从 Android 11 开始,必须使用 APK 签名者(如果您使用 API 级别 30),因为它将设置一些额外的方案“现在需要 APK 签名方案 v2”。App Center 现在(自 2020 年 12 月 17 日起)在内部使用 APK 签名者对 Android 应用程序进行签名,而不是之前使用的 JAR 签名者。作为在 App Center 中启用 APK 签名者功能的一部分,实施了 Android 签名任务 V3,新签名任务的要求是更改密钥库文件的保存方式 - 将密钥库文件存储在 AzDO 安全文件中(Android 签名构建和发布任务 - Azure Pipelines | Microsoft Docs)。

警告 在 2020 年 12 月 17 日之前上传密钥库文件的任何构建配置仍使用 APK 签名方案 v2 签名方法 (jarsigner)。要使用 APK 签名方案 v3 签名流程,用户只需重新上传其密钥库文件并保存其分支配置。