プロジェクト

全般

プロフィール

インターネット非接続環境でのAndroid Studioセットアップ

本件は現在調査中です。

SDKの構成

インターネットに接続されていない環境では、SDKが構成されません(エラーメッセージが表示される)。

startup_noninet-01.png

手動で構築するには、エミュレータなし(実機を接続して実行)の場合で次が必要です。

  • Android SDK Platform
    対象Androidバージョン(APIレベル)に対応するSDK Platform
  • Android SDK Platform-Tools
  • Android SDK Build-Tools
  • Android SDK Tools

現時点でこれらをすべてダウンロードするには、ダウンロードURLを何らかの手段で把握する必要があります。

インターネット接続したマシンにインストールしたAndroid Studioから情報を取得

インターネット接続したマシンでAndroid StudioとSDKがインストールされた環境で調べる方法です。
[Tools]メニュー > [SDK Manager] で「Settings for New Projects」画面にAndroid SDK設定ペインが表示されます。
右側ペインで[SDK Update Sites]タブをクリックし、[Android Repository]行の右側URL欄に記載されているURLをメモし、WebブラウザでURLを開きます。

SDKUpdateSites-01.png

このXMLの中を調べてダウンロードするURLを把握します。

2020年8月時点で、Android RepositoryのURLは次となっています。
https://dl.google.com/android/repository/repository2-1.xml

このファイルの中から調べたダウンロード先は次です。

display-name 必須 url 備考
Android SDK Platform 29 platform-29_r05.zip
Android SDK Build-Tools 30.0.1 build-tools_r30.0.1-windows.zip Linux, macosxのURLは省略
Android SDK Command-line Tools commandlinetools-win-6604631_latest.zip Linux, macosxのURLは省略
Android SDK Platform-Tools platform-tools_r30.0.4-windows.zip Linux, macosxのURLは省略
Android Emulator emulator-windows-6755297.zip Linux, macosxのURLは省略
Android SDK Tools sdk-tools-windows-4333796.zip Linux, macosxのURLは省略

上述の表中のurlは、XMLファイルのある場所からの相対パスとなるので、次の様にダウンロードします。

D:\work> curl -O https://dl.google.com/android/repository/platform-29_r05.zip

2020年8月時点で、エミュレータ用のイメージ(Android System Image)のURLは次となっています。
https://dl.google.com/android/repository/sys-img/android/sys-img2-1.xml

このファイルの中から調べたダウンロード先は次です。

display-name url 備考
Intel x86 Atom_64 System Image x86_64-29_r07-windows.zip Linux, macosxのURLは省略

ダウンロードしたファイルの展開と設定

インターネット接続マシンで展開されたディレクトリ構成と照らし合わせながらダウンロードしたファイルを展開します。
なお、インターネット接続マシンでは、デフォルトのSDK配置場所がユーザー固有ディレクトリ(%LOCALAPPDATA%\Android\Sdk)となっていますが、今回は複数ユーザーで同じSDKを使えるよう別な場所をSDK配置場所としています。(例、C:\tools\android\sdk)

platform-29_r05.zip

SDK配置場所の下に platforms ディレクトリを手動作成し、その中にzipファイル中のandroid-10を配置
このAndroid SDK Platformを配置すると、SDKマネージャーがそれが含まれるディレクトリをSDK配置場所として認識できます。

  • 「Welcome to Android Studio」画面の右下[Configure] > [Settings] で「Settings for New Projects」画面を開く
  • 左側ペインで [Appearance & Behavior] > [System Settings] > [Android SDK]を選択する

setting_sdk-01.png

  • 右側ペインで [Android SDK Location]欄の右端にある[Edit]をクリック

setting_sdk-02.png

  • 「SDK Setup」画面で下右側 [Android SDK Location]欄の右端にあるフォルダアイコンをクリックし、上述のSDK配置場所(例、C:\tools\android\sdk)を指定する

setting_sdk-03.png

  • Emulatorがないと警告の画面がでるが、[Finish]をクリックすると、SDK Platform に[Android 10.0 (Q)]が Installed として表示される

setting_sdk-06.png

build-tools_r30.0.1-windows.zip

SDK配置場所の下に build-tools ディレクトリを手動作成し、その中にzipファイル中のandroid-11を配置、さらにandroid-11のディレクトリ名を30.0.1に変更します。

setting_sdk-07.png

platform-tools_r30.0.4-windows.zip

SDK配置場所の下に zipファイル中のplatform-toolsを配置します。

setting_sdk-08.png

sdk-tools-windows-4333796.zip

SDK配置場所の下に zipファイル中のtoolsを配置します。

  • 注)SDK Managerの表示には、SDK toolsは表示されないようです。

プロジェクトの構成

オフラインでプロジェクトを構成

新規作成したプロジェクトがオフラインではビルドできない理由

新規に作成したプロジェクトで使用するビルドツールのGradleは、デフォルトでは次の設定となっています。

  • 理由1)gradle wrapper を使用し、ビルド実行時にgradleをダウンロードしにいくため
  • 理由2)依存するライブラリをインターネット上のリポジトリからダウンロードして使用するため

それぞれ設定の詳細を確認します。

gradle wrapperの設定

プロジェクトで生成されるgradle wrapperのファイル群は次です。

<プロジェクト基点ディレクトリ>
  +-- gradle
        +-- wrapper
              +-- gradle-wrapper.jar
              +-- gradle-wrapper.properties

gradle wrapperの設定ファイルの記述内容は次です。

  • gradle-wrapper.properties
    #Sat Aug 22 16:16:45 JST 2020
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
    

ここで、distributionUrlにあるgradleをダウンロードしようします。

対処方法は、gradle wrapperを使用せず、マシンにローカルインストールしたgradleを使用します。

依存ライブラリのリポジトリ設定

非インターネット接続環境で新規プロジェクトを生成すると、インターネット上の必要なリポジトリにアクセスできないため、GradleのSyncが失敗します。
具体的には、生成されたbuild.gradleに次の記述があります。

allprojects {
    repositories {
        google()
        jcenter()
    }
}

google および jcenter は、インターネット上に設けられたリポジトリで、ビルドにおいて使用する依存コンポーネント(ライブラリ)はこのリポジトリから取得します。
そのため、非インターネット接続環境では、これらリポジトリへのアクセスができないため、ビルドができません。

対処方法は凡そ次の2つあります。

  1. リポジトリのローカルコピーを用意し、Gradleにローカルコピーをリポジトリとして参照するよう設定
  2. リポジトリを利用せず、依存コンポーネントをローカルに配置して参照する

オフライン設定

Gradle設定

ローカルマシン上にGradleをインストールし、そのGradleを使用する設定に変更します。

[File]メニュー > [Settings]で「Settings」画面を開き、左側ペインで [Build, Execution, Deployment] > [Gradle]を選択します。

setting_sdk-11.png

右側ペインで [Use Gradle from]欄の選択肢から[Specified location]を選択します。右端にファイルパスを設定する入力項目が表われるのでフォルダアイコンをクリックします。

setting_sdk-12.png

Gradleをインストールしたディレクトリ(例、C:\Program Files\Java\gradle)を指定します。

setting_sdk-13.png

No cached version of com.android.tools.build:gradle:4.0.1 available for offline mode

Android Studio 4.0.1で生成したプロジェクトのbuild.gradleには次の記述があります。

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

次の項で入手するオフラインコンポーネントには、現時点では com.android.tools.build.gradle のバージョンが3.0.0~3.4.0となっており、4.0.1が含まれていません。そのため、インターネットへの接続を試みるためオフラインではエラーとなります。

googleのmavenリポジトリから、直接ライブラリを取得してみます。これを、次の項のオフラインコンポーネントのディレクトリに追加しましたが、エラーは解消されませんでした。(今後要調査)

https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/4.0.1/gradle-4.0.1.jar
https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/4.0.1/gradle-4.0.1-javadoc.jar
https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/4.0.1/gradle-4.0.1-sources.jar
https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/4.0.1/gradle-4.0.1.pom

オフライン化は一時中断

コンポーネントのダウンロードと設定

ネットワーク接続なしでビルドする場合の対処の一つとして、依存コンポーネントをダウンロードしてローカルに展開したものを利用します。
次のドキュメントに記載があります。
オフラインコンポーネント

上述サイトから、Google Maven dependencies を入手します(容量が少々大きく3GB弱ほどあります)。

offline-gmaven-stable.zip

USERPROFILE\.android\manual-offline-m2 ディレクトリを作成し、その中に上述zipアーカイブファイルのgmaven_stableの中を展開します。

%USERPROFILE\
  +-- .android
        +-- manual-offline-m2
              +-- android
              +-- androidx
              +-- com
              +-- io
              +-- org

USERPROFILE\.gradle\init.d ディレクトリを作成し、その中に offline.gradleファイルを作成し設定を記述します。

def reposDir = new File(System.properties['user.home'], ".android/manual-offline-m2")
def repos = new ArrayList()
reposDir.eachDir {repos.add(it) }
repos.sort()

allprojects {
    buildscript {
        repositories {
            for (repo in repos) {
                maven {
                    name = "injected_offline_${repo.name}" 
                    url = repo.toURI().toURL()
                }
            }
        }
    }
    repositories {
        for (repo in repos) {
            maven {
                name = "injected_offline_${repo.name}" 
                url = repo.toURI().toURL()
            }
        }
    }
}