React Native安卓应用Play Store上架后点击图标提示未安装求助
问题描述
我们用React Native开发的客户端应用,iOS版本构建与部署均正常。安卓平台通过./gradlew bundleRelease命令构建的发布版.aab文件上传Google Play商店后,收到部分用户反馈:安装应用后点击图标会弹出「App not installed」的提示toast,但长按图标并点击上下文菜单中的「Open」选项,应用却能正常启动。
已确认的设备报错情况
- 运行Android 10系统的Galaxy Note 9
构建详情
项目根目录build.gradle内容
buildscript { ext { googlePlayServicesVersion = "+" // default: "+" firebaseMessagingVersion = "21.1.0" // default: "21.1.0" buildToolsVersion = "30.0.2" minSdkVersion = 21 compileSdkVersion = 31 targetSdkVersion = 31 ndkVersion = "21.4.7075529" } repositories { google() jcenter() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:4.2.2") classpath 'com.google.gms:google-services:4.3.10' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { def REACT_NATIVE_VERSION = new File(['node', '--print',"JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim()) configurations.all { resolutionStrategy { // Remove this override in 0.65+, as a proper fix is included in react-native itself. force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION } } repositories { mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url("$rootDir/../node_modules/react-native/android") } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } mavenCentral() google() maven { url 'https://www.jitpack.io' } jcenter() } } subprojects { afterEvaluate { project -> if (project.hasProperty("android")) { android { compileSdkVersion 31 // version of compile sdk used for project //buildToolsVersion '29.0.3' // version of build tool used for project } } } }
AndroidManifest.xml内容
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.lincolnapp"> <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.CAMERA" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/app_icon" android:roundIcon="@mipmap/app_icon" android:allowBackup="false" android:screenOrientation="portrait" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="false"> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myappscheme" /> </intent-filter> </activity> <!-- Change the value to true to enable pop-up for in foreground on receiving remote notifications (for prevent duplicating while showing local notifications set this to false) --> <meta-data android:name="com.dieam.reactnativepushnotification.notification_foreground" android:value="true"/> <!-- Change the resource name to your App's accent color - or any other color you want --> <meta-data android:name="com.dieam.reactnativepushnotification.notification_color" android:resource="@color/white"/> <!-- or @android:color/{name} to use a standard color --> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationActions" /> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" /> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> </intent-filter> </receiver> <service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application> </manifest>
解决方案
问题核心在于AndroidManifest.xml中MainActivity的配置:
- 包含
LAUNCHER类型intent-filter的MainActivity被设置为android:exported="false",而Android 10系统中桌面Launcher属于外部进程,跨进程启动exported="false"的Activity会被系统拦截,触发「App not installed」提示。 - 长按图标打开的方式属于系统内部快捷调用逻辑,绕过了常规的跨进程启动限制,因此能正常启动应用。
修复步骤:
将MainActivity的android:exported属性修改为true,具体代码如下:
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="true"> <!-- 修改此处属性值 --> <!-- 其余配置保持不变 --> </activity>
修改后重新构建.aab文件并上传Google Play即可解决该问题。
内容的提问来源于stack exchange,提问作者Eric Uldall
相关产品推荐
相关产品推荐

