背景:项目使用的Unity版本为5.4.4f1,Android targetSdkVersion为22,接到通知要求targetSdkVersion要升级到28(至少为26)
实践:直接将targetSdkVersion从22改为28,通过Unity Build生成android apk包,在不同手机上安装运行
问题:在小米cc9e手机上,点击app图标后立即闪退,表现上没有任何提示
定位:使用命令行 adb logcat > log.txt,将android日志导出到log.txt文件中,当然,如果机器上的android开发环境完善,可以直接在eclipse或者Android Studio中直接查看日志
通过排查,看到一行信息
E/Unity: Unable to query for permission: Fragment null must be a public static class to be properly recreated from instance state
在Google上查到这是Unity的一个bug,Unity程序启动后申请不到权限就自己杀掉进程了,Unity在2018版本之后对此进行了修复,但是对于已经上线了的项目,升级Unity版本的代价太大,风险也很高,升级Unity版本显然不现实
解决方案:想起Unity对应的版本基本都有对应的补丁包,于是下载了Unity5.4.4p1进行尝试,最终Build出来的apk包安装后,点击app图标后不会立即闪退了,unity补丁包下载网址
问题:虽然不会闪退了,但是应用程序启动后一直黑屏,没有任何提示
定位:使用命令行adb logcat > log1.txt,将android日志导出到log1.txt文件中,通过排查,看到一行信息,通过Google查询,这是Google最新的权限政策,Android api level23之后,Google对权限进行了分类,大类分为危险权限和正常权限,正常权限在xml配置即可,而危险权限需要通过代码进行动态申请,在应用程序启动时会弹出授权窗口让用户选择允许授权还是禁止授权,Google请求应用权限网址,申请权限的代码在此网址里有
解决方案:在主Activity中加入动态申请权限代码
问题:应用程序启动后允许授权后,应用程序还是一直黑屏,没有任何提示
定位:使用命令行 adb logcat > log3.txt,将android日志导出到log3.txt文件中,通过排查,看到一行信息,跟上面一样的问题,我不是已经动态申请权限,也允许授权了么?为什么还会?
解决方案:在关键函数中加了log,最终从日志中定位出在授权前就已经报了上面那个错了,也就是说在授权前就已经要用到对应的权限了(有些手机授权后可以直接进入游戏,有些手机则黑屏,可能是不同手机实现不同,也可能跟Android api level有关系),新建一个Activity,将申请权限的代码在此Activity里执行,处理完后再跳转到主Activity
其他问题:java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;
Apache HTTP 客户端弃用(摘自Android 9.0官方变更说明)
在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml 添加以下内容:
弹出提示框,显示Detected problems with API compatibility(visit g.co/dev/appcompat for more info) Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,使用反射直接调用源码就会出现这样的提示弹窗,使用代码去掉弹框
private void closeAndroidPDialog(){
try {
Class aClass = Class.forName("android.content.pm.PackageParser$Package");
Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
try {
Class cls = Class.forName("android.app.ActivityThread");
Method declaredMethod = cls.getDeclaredMethod("currentActivityThread");
declaredMethod.setAccessible(true);
Object activityThread = declaredMethod.invoke(null);
Field mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown");
mHiddenApiWarningShown.setAccessible(true);
mHiddenApiWarningShown.setBoolean(activityThread, true);
} catch (Exception e) {
e.printStackTrace();
}
}
在Android 8.0手机上闪退,报错Only fullscreen opaque activities can request orientation 在AndroidManifast文件中找到相关的Activity类的注册,将android:screenOrientation='portrait'删掉 在style文件中找
报错java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy 为保证用户数据和设备的安全,Google针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,通过配置来更改网络安全配置,在res/xml目录下创建network_security_config.xml,内容如下
在AndroidManifest.xml文件下的application标签增加以下属性