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

问题描述 投票:0回答:4

我有一个 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>

当我通过 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" />

我之前认为 Android 12 的问题在于

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

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

android azure-devops xamarin.android apk
4个回答
10
投票

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

android:exported="true"

您的活动、服务和接收者。请参阅此处

就你而言

<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" />

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

从 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 签名流程,用户只需重新上传其密钥库文件并保存其分支配置。


1
投票

应用程序未安装,因为包似乎无效[已修复]

compileSdkVersion 、 targetSdkVersion 更改为 31 后, 如果有人在 Android 12 / 13 预览版 上遇到上述错误。将所有依赖项更新为最新依赖项并请添加 -

android:exported="true"

适用于在应用程序内部

AndroidManifest.xml
文件中声明了
<activity>, <activity-alias>,<service>, or <receiver>
的任何 <intent-filter>s 组件。之后,执行
gradlew clean
并测试更改,在您的 android 模拟器中创建一个具有 android 12/13 配置的新设备,并从 发布版本 安装此应用程序,您必须运行此命令
npx react-native run-android --variant=release


0
投票

可能是它不喜欢安装位置“自动”,导致:

android:installLocation="0"

应为以下之一:

android:installLocation=["auto" | "internalOnly" | "preferExternal"]

0
投票

确保在您的应用程序中注释掉

compileSdkPreview = "UpsideDownCake"
build.gradle

像这样:

//compileSdkPreview = "UpsideDownCake"

© www.soinside.com 2019 - 2024. All rights reserved.