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