尽管我们的应用程序在生产中已有数月未更新,但在进行API调用时已开始挂起。我们可以使用应用程序的Play Store版本或在AndroidManfiest.xml中设置android:debuggable="false"
来复制问题。但是,如果我们随后设置android:usesCleartextTraffic="true"
,问题就会消失。如果我们进行一个动作,进行API调用,然后离开应用程序几分钟;应用程序没有响应";消息
我们最近还更新了API调用要去的服务器的证书
有什么方法可以解决这个问题,或者查看是什么原因导致应用程序没有响应?我试过查看"网络/调试"选项卡,但如果"可调试"为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>
我们找到了一个解决方案。从另一个源服务器颁发证书成功了。据我所见,证书、根证书和中间证书都是有效的。无论出于何种原因,Android应用程序都不接受证书的有效性。据我所知,这可能是由于中介证书到期或Cordova使用旧版本的BoringSL造成的。
如果有人在生产/发布版本中遇到这个问题,请进入Android Manifest文件并将Debuggable设置为true。这个问题应该解决了。然后,使用可调试的false重新运行生产/发布版本,问题应该会再次出现。将生产/发布版本保持在可调试的false上,并将android:usesCleartextTraffic设置为true。这个问题应该再次消失。如果你有相同的结果,你可能会遇到类似的问题,应用程序不接受证书(或者你使用的是HTTP而不是HTTPS(,新的证书可能会解决这个问题。
<application android:debuggable="true"android:usesCleartextTraffic="true">
我也遇到了类似的问题。发布apk不工作调用API。默认情况下,发布设置为:
release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
检查proguard规则,有必要检查应用程序的依赖项是否需要规则才能正常工作。例如,改装
https://github.com/square/retrofit/blob/master/retrofit/src/main/resources/META-INF/proguard/retrofit2.pro
在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"
>
我通过禁用minifying
解决了这个问题,然后我不得不删除shrinking
。