facebook twitter hatena line email

Android/開発環境/AndroidStudio/ビルドバージョンアップ/Android11対応

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

やり方

公式:https://developer.android.com/preview/setup-sdk?hl=ja

  1. AndroidStudioのプレビュー版をDL(20200729時点で4.0.1β) https://developer.android.com/studio/preview?hl=ja
  2. Android/Tools/SDKManager (もしくはAndroidStudioのwelcome画面のConfigureのSDKManager)
  3. SDK Platformsタブで、Android R Previewを選択
  4. SDK Toolsタブで、Android SDK Build-Tools 30を選択

app/build.gradleのcompileSdkVersionとtargetSdkVersionを30へ

apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    defaultConfig {
        targetSdkVersion 30
    }
}

AndroidGradleのプラグインを4系へ

プロジェクト直下のbuild.gradle

buildscript {
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.1"
    }
}

gradle/wrapper/gradle-wrapper.propertiesのdistributionUrlを変更

distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

androidのgradleプラグインとgradleのversionの関係

こちらを参照 https://developer.android.com/studio/releases/gradle-plugin.html

kotlinでCould not initialize class org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetKtがる場合

build.gradleのkotlin_versionを1.3.10から1.3.72にあげると直る。

buildscript {
    ext.kotlin_version = "1.3.72"
}

buildToolsVersionを更新

buildToolsVersionがない場合は、デフォルトの値(DEFAULT_BUILD_TOOLS_REVISION)が使用される。

apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    buildToolsVersion = '30.0.3'
    defaultConfig {
        targetSdkVersion 30
    }
}

参考:https://qiita.com/tatsuhama/items/4890d92cf236e6ddd62b

webviewで端末に保存したファイルが見れない

webviewに"ウェブページへのアクセス不可 ERR_ACCESS_DENIED"と出る場合

以下権限を追加してもだめだった。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

結局build.gradleをtargetSdkVersion 30から29にしないとならないかも。もしくはandroid11のβが取れるのを一旦待つ。

参考:https://support.wikitude.com/support/discussions/topics/5000095108

非推奨コード対応

build.gradleにoptions.compilerArgsを追加

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}
$ ./gradlew lint

ボタンでMissingConstraintsエラーが出るとき

以下エラーが出るとき

app/src/main/res/layout/activity_main.xml:18: Error: This view is not constrained vertically: at runtime it will jump to the top unless you add a vertical constraint [MissingConstraints]
     <Button
      2020年8月7日 (金) 14:56 (JST)~

修正前

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="text" />

修正後

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="text"
        tools:ignore="MissingConstraints" />

MissingConstraintsを追加する

Android11からAsyncTask非推奨

java.util.concurrentへ変換、もしくはkotlinのコールチンを使うように。 https://developer.android.com/reference/android/os/AsyncTask.html

HandlerのHandler()は非推奨となるとき

修正前

final Handler handler = new Handler();

修正後

final Handler handler = new Handler(Looper.getMainLooper());

WindowManagerのgetDefaultDisplay()は非推奨となるとき

以下のような警告

警告: [deprecation] WindowManagerのgetDefaultDisplay()は非推奨になりました

Context.getDisplayがapi30で追加されているので、そちらを使う。

修正前

WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
Display disp = windowManager.getDefaultDisplay();

修正後

Display display;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
   display = context.getDisplay();
} else {
    WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
    display = windowManager.getDefaultDisplay();
}

参考:https://developer.android.com/reference/android/view/WindowManager#getDefaultDisplay()

DisplayのgetSize(Point)は非推奨になりましたとなるとき

以下警告が出るとき

警告: [deprecation] DisplayのgetSize(Point)は非推奨になりました

Display.getSize(Point)はAPI30で非推奨となったので、API30から追加されたgetSize (Point outSize)を使って置き換る

修正前

Point realDisplaySize = new Point();
disp.getSize(realDisplaySize);

修正後

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
    final WindowInsets windowInsets = metrics.getWindowInsets();
    Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
            | WindowInsets.Type.displayCutout());
    int insetsWidth = insets.right + insets.left;
    int insetsHeight = insets.top + insets.bottom;
    final Rect bounds = metrics.getBounds();
    final Size legacySize = new Size(bounds.width() - insetsWidth,
            bounds.height() - insetsHeight);
    Log.i("test", "bounds.width=" + legacySize.getWidth());
    Log.i("test", "bounds.height=" + legacySize.getHeight());
} else {
    Point realDisplaySize = new Point();
    disp.getSize(realDisplaySize);
    Log.i("test", "realDisplaySize.x=" + realDisplaySize.x);
    Log.i("test", "realDisplaySize.y=" + realDisplaySize.y);
}

参考:https://developer.android.com/reference/android/view/Display

WebSettingsのsetAppCacheEnabled(boolean)が非推奨なとき

以下警告が出る

警告: [deprecation] WebSettingsのsetAppCacheEnabled(boolean)は非推奨になりました

Service workersを使う・・。一旦削除で対応したので、根本対応はしなかった・・。

This method was deprecated in API level 30.
The Application Cache API is deprecated and this method will become a no-op on all Android versions once support is removed in Chromium. Consider using Service Workers instead. See https://web.dev/appcache-removal/ for more information.

参考:https://developer.android.com/reference/android/webkit/WebSettings

指定dirのコードを無視する

buildとかの生成されたコードを無視したい場合 app/lint.xml

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="all">
        <ignore path="build" />
    </issue>
</lint>


参考:https://www.yslibrary.net/2016/07/05/ignore-directory-androidlint/

Hiltがbuildで非推奨エラーが出るとき

Hiltが邪魔であれば、lint.xmlで非表示にする。

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="all">
        <ignore path="build/generated/source/kapt/productionDebug/view/fragment/Hilt_*.java" />
        <ignore path="build/generated/source/kapt/mockDebug/view/fragment/Hilt_*.java" />
        <ignore path="build/generated/source/kapt/productionRelease/view/fragment/Hilt_*.java" />
        <ignore path="build/generated/source/kapt/mockRelease/view/fragment/Hilt_*.java" />
        <ignore path="build/generated/source/kapt/stagingDebug/view/fragment/Hilt_*.java" />
        <ignore path="build/generated/source/kapt/stagingRelease/view/fragment/Hilt_*.java" />
    </issue>
</lint>