Android 如果 debuggable 为 false,APK 将拒绝进行 API 调用
Android APK refuses to make API calls if debuggable is false
我们的应用程序在进行 API 调用时开始挂起,尽管几个月没有在生产中更新。我们可以使用应用程序的 Play 商店版本或通过在 AndroidManfiest.xml 中设置 android:debuggable="false"
来重现该问题。但是,如果我们随后设置 android:usesCleartextTraffic="true"
,问题就会消失。如果我们执行一个操作来发出 API 调用然后离开应用程序几分钟,我们会看到一条消息“应用程序没有响应”。
我们最近还更新了 API 呼叫将到达的服务器的证书。
是否有任何方法可以解决此问题或查看导致应用程序无响应的原因?我试过查看 network/debugging 选项卡,但如果 debuggable 为 false,那似乎不可能。
AndroidManifest.xml:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="12345" android:versionName="3.32" package="foo.bar.foo.com.bar.preview" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" android:name="de.appplant.cordova.plugin.notification.util.AssetProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/localnotification_provider_paths" />
</provider>
<receiver android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.TriggerReceiver" />
<receiver android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.ClearReceiver" />
<activity android:exported="false" android:launchMode="singleInstance" android:name="de.appplant.cordova.plugin.localnotification.ClickReceiver" android:theme="@android:style/Theme.Translucent" />
</application>
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
</manifest>
在 app/src/main/res/xml/
中创建一个 xml 文件
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
并将其添加到 AndroidManifest.xml
<application
....
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
>
我们找到了解决办法。从不同的源服务器颁发证书就可以了。据我所见,证书、根证书和中间证书都是有效的。 Android 应用程序出于某种原因不接受证书有效。据我所知,这可能是由于中间证书过期或 Cordova 使用旧版本的 BoringSSL 造成的。
如果有人 运行 在 production/release 构建中遇到此问题,请进入 Android 清单文件并将 Debuggable 设置为 true。这个问题应该消失了。然后,使用 debuggable false 重新运行 production/release 构建,问题应该会再次出现。保持 production/release build on debuggable false 并将 android:usesCleartextTraffic 设置为 true。这个问题应该再次消失。如果您有相同的结果,您可能 运行 遇到类似的问题,即应用程序不接受证书(或者您使用的是 HTTP 而不是 HTTPS),新证书可能会解决问题。
<application android:debuggable="true"android:usesCleartextTraffic="true">
我们的应用程序在进行 API 调用时开始挂起,尽管几个月没有在生产中更新。我们可以使用应用程序的 Play 商店版本或通过在 AndroidManfiest.xml 中设置 android:debuggable="false"
来重现该问题。但是,如果我们随后设置 android:usesCleartextTraffic="true"
,问题就会消失。如果我们执行一个操作来发出 API 调用然后离开应用程序几分钟,我们会看到一条消息“应用程序没有响应”。
我们最近还更新了 API 呼叫将到达的服务器的证书。
是否有任何方法可以解决此问题或查看导致应用程序无响应的原因?我试过查看 network/debugging 选项卡,但如果 debuggable 为 false,那似乎不可能。
AndroidManifest.xml:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="12345" android:versionName="3.32" package="foo.bar.foo.com.bar.preview" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" android:name="de.appplant.cordova.plugin.notification.util.AssetProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/localnotification_provider_paths" />
</provider>
<receiver android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.TriggerReceiver" />
<receiver android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.ClearReceiver" />
<activity android:exported="false" android:launchMode="singleInstance" android:name="de.appplant.cordova.plugin.localnotification.ClickReceiver" android:theme="@android:style/Theme.Translucent" />
</application>
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
</manifest>
在 app/src/main/res/xml/
中创建一个 xml 文件network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
并将其添加到 AndroidManifest.xml
<application
....
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
>
我们找到了解决办法。从不同的源服务器颁发证书就可以了。据我所见,证书、根证书和中间证书都是有效的。 Android 应用程序出于某种原因不接受证书有效。据我所知,这可能是由于中间证书过期或 Cordova 使用旧版本的 BoringSSL 造成的。
如果有人 运行 在 production/release 构建中遇到此问题,请进入 Android 清单文件并将 Debuggable 设置为 true。这个问题应该消失了。然后,使用 debuggable false 重新运行 production/release 构建,问题应该会再次出现。保持 production/release build on debuggable false 并将 android:usesCleartextTraffic 设置为 true。这个问题应该再次消失。如果您有相同的结果,您可能 运行 遇到类似的问题,即应用程序不接受证书(或者您使用的是 HTTP 而不是 HTTPS),新证书可能会解决问题。
<application android:debuggable="true"android:usesCleartextTraffic="true">