天天看點

Unity開發踩坑記錄# Google aab提包# Android權限判斷問題# android.support.v4與androidX沖突# 小米K30手機上跑應用後殺程序重進,出現閃退的情況# WebCamTexture + ARM64在部分機型上閃退的問題

# Google aab提包

1. The release is not compliant with the Google Play 64-bit requirement

Unity開發踩坑記錄# Google aab提包# Android權限判斷問題# android.support.v4與androidX沖突# 小米K30手機上跑應用後殺程式重進,出現閃退的情況# WebCamTexture + ARM64在部分機型上閃退的問題

項目中存在32位的包,需要替換成64位:

Unity Editor - Project Settings - Player - Android - Other Settings:

Scripting Backend選擇IL2CPP;

Target Architectures勾選ARM64;

Unity開發踩坑記錄# Google aab提包# Android權限判斷問題# android.support.v4與androidX沖突# 小米K30手機上跑應用後殺程式重進,出現閃退的情況# WebCamTexture + ARM64在部分機型上閃退的問題

2. 重新提包時,版本号需要擡一下

Unity開發踩坑記錄# Google aab提包# Android權限判斷問題# android.support.v4與androidX沖突# 小米K30手機上跑應用後殺程式重進,出現閃退的情況# WebCamTexture + ARM64在部分機型上閃退的問題

# Android權限判斷問題

1. Android 6.0及以上判斷權限

private static int PERMISSIONS_CODE = 1;
private String _unityObjName = "";

public boolean hasPermission(String unityObjName, String permission)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        _unityObjName = unityObjName;
        this.checkPermissoin(permission) == PackageManager.PERMISSION_GRANTED;
    }
    return true;
}

public void requestPermission(String permission)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        this.requestPermission(new String[] {permission}, PERMISSIONS_CODE);
    }
}           

複制

2. Android 6.0以下權限判斷

private static int PERMISSIONS_CODE = 1;
private String _unityObjName = "";

public boolean hasPermission(String unityObjName, String permission)
{
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
    {
        _unityObjName = unityObjName;
        PermissionChecker.checkSelfPermission(this, permission) == PermissionChecker.PERMISSION_GRANTED;
    }
    return true;
}

public void requestPermission(String permission)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        ActivityCompat.requestPermissions(this, new String[] {permission}, PERMISSIONS_CODE);
    }
}           

複制

Android 6.0以下版本,一旦玩家拒絕了權限,判斷權限的接口永遠範圍true。

解決方法:

暫時無解,體驗上可以告知玩家,目前功能需要這個權限,并提供前往手機設定的按鈕。

在權限回調裡向Unity發送Message,交給邏輯層面去處理。

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, granteResults);

    if (PERMISSIONS_CODE != requestCode) return;

    for (int i = 0; i < permissions.length; i++)
    {
        String permission = permissions[i];
        int grantResult = grantResults[i];

        if (grantResult == PackageManager.PERMISSION_GRANTED)
        {
            sendUnityMessage("OnPermissionRequested", permission);
        }
        else
        {
            sendUnityMessage("OnPermissionDenied", permission);
        }
    }
}

private void sendUnityMessage(String funcName, String param)
{
    UnityPlayer.UnitySendMessage(_unityObjName, funcName, param);
}           

複制

# android.support.v4與androidX沖突

android 6.0以下權限判斷用到了2個類:PermissionChecker 和 ActivityCompat,這兩個類需要android.support.v4包,但是和第三方庫使用androidX沖突。

plugins - Android裡面

gradleTemplate

檔案添加如下兩句:

android.useAndroidX=true
android.enableJetifier=true           

複制

# 小米K30手機上跑應用後殺程序重進,出現閃退的情況

小米K30手機,Android系統11,打開Unity打包的應用,然後讓引用進入背景,通過殺程序的方式關掉應用,再重新打開,應用有非常大的機率出現閃退的問題。有時候可以通過多嘗試打開幾次讓應用成功開啟,但是大多數情況依然會出現閃退。

原因:

出現閃退的包是用Debug方式打出來的,占用記憶體消耗、性能、包體大小都是沒有經過優化的,是以當殺程序後,實際應用占用記憶體是沒有馬上被釋放掉的(猜測),這時啟動應用,大量占用的記憶體會導緻程式被系統Kill掉,出現閃退的情況;

而Release方式打出來的包是經過優化的,不會出現閃退的情況。

Unity開發踩坑記錄# Google aab提包# Android權限判斷問題# android.support.v4與androidX沖突# 小米K30手機上跑應用後殺程式重進,出現閃退的情況# WebCamTexture + ARM64在部分機型上閃退的問題

Ref:

http://c.biancheng.net/view/4124.html

# WebCamTexture + ARM64在部分機型上閃退的問題

用IL2CPP + ARM64打出來的包,在小米 K30機子上,調用webCamTexture.Play()方法後出現穩定閃退的情況。

進一步發現:

Debug包不會有閃退問題,但是Release包會有問題。

原因:

new WebCamTexture的時候,傳入了螢幕寬高作為攝像頭拍照的尺寸,在小米K30上用ARM64打Release包的時候會出現閃退。

解決方法:

不傳入指定寬高,拍出來的圖像,将其裁剪成螢幕寬高大小,模拟全屏拍照的效果。