版本相关-Android9

升级API相关问题

升级到 Android9.0遇到的问题

java.lang.VerifyError: Verifier rejected class d.w.b.f.a: java.lang.String

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java.lang.VerifyError: Verifier rejected class d.w.b.f.a: java.lang.String d.w.b.f.a.a(java.lang.String) failed to verify: java.lang.String d.w.b.f.a.a(java.lang.String): [0x36] 'this' argument 'Precise Reference: org.apache.commons.codec.binary.Base64' not instance of 'Reference: org.apache.commons.codec.binary.BaseNCodec' (declaration of 'd.w.b.f.a' appears in /data/app/xxx.xxx.yyldy-naDf47h1LBlsvDDqMvd1rw==/base.apk!classes3.dex)
at d.w.b.f.a.a(AESHelper.java:39)
at d.w.b.b.b.a(RemoteClient.java:119)
at b.a.b.a.b(RequestApi.java:2739)
at b.a.i.a.k.b(IsExistIMAccount.java:58)
at xxx.xxx.view.login.WelcomeActivity.onCreate(WelcomeActivity.java:95)
at android.app.Activity.performCreate(Activity.java:7458)
at android.app.Activity.performCreate(Activity.java:7448)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3409)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3614)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
at android.os.Handler.dispatchMessage(Handler.java:112)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static String AESEncrypt(String plainText) {
String encryptedValue = null;
try {
Key key = new SecretKeySpec(keyWord.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
byte[] byteContent = plainText.getBytes("utf-8");
try {
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(_key1));
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
byte[] encValue = cipher.doFinal(byteContent);
//把上面这句注释掉,改成底下那句
//encryptedValue = new String(new Base64().encode(encValue));
encryptedValue = new String(Base64.encodeBase64(encValue));
} catch (Exception e) {
e.printStackTrace();
}
return encryptedValue;
}

android 9.0 升级后遇到json 解析异常,需要改成Gson 方式

遇到的类ShoppingCartFragment类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 构建选中的id集合,用于获取购物车商品及提交结算时验证使用
*/
private String generateSelectIdList(NewShoppingCartBean bean) {
if (bean != null) {
ItemCartIds itemCartIds = new ItemCartIds();
List<ItemCartIds.ItemCartId> idList = new ArrayList<>();

for (NewShoppingCartBean.ShoppingCartBean shoppingCartBean : bean.getShoppingCartList()) {
for (NewShoppingCartBean.ShoppingCartBean.CartActivityItemBean cartActivityItemBean : shoppingCartBean.getCartActivityItemList()) {
for (NewShoppingCartBean.ShoppingCartBean.CartActivityItemBean.CartItemBean cartItemBean : cartActivityItemBean.getCartItemList()) {
ItemCartIds.ItemCartId itemCartId = new ItemCartIds().new ItemCartId();
if (cartItemBean.getIsSelected()) {
itemCartId.setItemCartId(cartItemBean.getItemCartId());
idList.add(itemCartId);
}
}
itemCartIds.setItemCartIds(idList);
}
}

Gson gson = new Gson();
String idsStr = gson.toJson(itemCartIds);//需要进行替换itemCartIds,改为首字母大写,否则报错
// String idsStr = JSON.toJSONString(itemCartIds);//需要进行替换itemCartIds,改为首字母大写,否则报错
Debug.e(idsStr);

return ListUtils.isEmpty(itemCartIds.getItemCartIds()) ? "" : idsStr.contains("itemCartIds") ? idsStr.replace("itemCartIds", "ItemCartIds") : idsStr;
} else {
return "";
}
}

Cleartext HTTP traffic to xxx not permitted

问题:升级到Android9 出现“Cleartext HTTP traffic to xxx not permitted”

针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接。解决方法有:

  • APP改用https请求

  • targetSdkVersion 降到27以下

  • 最终暴力解决

    1. 在app的res/xml下新建 network_security_config.xml
    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
1
2
3
4
5
6
7

2. 在AndroidManifest.xml中
```xml
<application
...
android:networkSecurityConfig="@xml/network_security_config">
</application>