我有一个 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。)
如果您已将编译版本提高到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 签名流程,用户只需重新上传其密钥库文件并保存其分支配置。
应用程序未安装,因为包似乎无效[已修复]
将 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
可能是它不喜欢安装位置“自动”,导致:
android:installLocation="0"
应为以下之一:
android:installLocation=["auto" | "internalOnly" | "preferExternal"]
确保在您的应用程序中注释掉
compileSdkPreview = "UpsideDownCake"
build.gradle
。
像这样:
//compileSdkPreview = "UpsideDownCake"