かなで技術日誌

プログラミングやエンジニアリング周りについて

主なアウトプットはScrapboxObsidianにまとめてます。

MacでNativeScript導入でハマりまくった話

環境構築でこれまで一番ハマったかもしれないです。
Android StudioJavaは二回ほど入れ直して普通に辞めようかと思ったけどなんとかなった・・・
ありがとうStackOverflow

OS:macOS High Sierra 10.13.6
Android Studio: 3.2
Java:JDK8

目標
・NativeScriptをインストールし、Android/iOSアプリ開発環境を作る
・"tns run android(or ios)"でエミュレーターが起動すること

Android開発は全くの素人なので間違った理解があるかもしれないので、指摘していただけるとありがたいです。

手順
①Node.jsをインストール
これはすでにあったので割愛
qiita.com

$ node --version
v10.5.0

②NativeScriptをインストール

$ npm install -g nativescript

uninstallするときは

$ npm uninstall -g nativescript

ここでHomebrewとかAndroidSDKとかJavaの確認をしてインストールしてくれる。

試しに

$ tns

と入力すると

# NativeScript CLI

┌─────────┬─────────────────────────────────────────────────────────────────────┐
│ Usage   │ Synopsis                                                            │
│ General │ $ tns <Command> [Command Parameters] [--command <Options>]          │
│ Alias   │ $ nativescript <Command> [Command Parameters] [--command <Options>] │
└─────────┴─────────────────────────────────────────────────────────────────────┘

## General Commands

...省略

## Project Development Commands

...省略

## Publishing Commands

...省略

## Device Commands

...省略

## Environment Configuration Commands

...省略

## Global Options

...省略

といった感じでコマンド一覧が表示されるはずです。


③プラットフォーム間の依存関係を解決する

$ ruby -e "$(curl -fsSL https://www.nativescript.org/setup/mac)"

たくさん確認されますが。全てyesでいいです。

④依存関係の診断
依存関係に問題が無いか、コマンドで確認することができます。

$ tns doctor

ここで

✔ Your ANDROID_HOME environment variable is set and points to correct directory.
✔ Your adb from the Android SDK is correctly installed.
✔ The Android SDK is installed.
✔ A compatible Android SDK for compilation is found.
✔ Javac is installed and is configured properly.
✔ The Java Development Kit (JDK) is installed and is configured properly.
✔ Xcode is installed and is configured properly.
✔ xcodeproj is installed and is configured properly.
✔ CocoaPods are installed.
✔ CocoaPods update is not required.
✔ CocoaPods are configured properly.
✔ Your current CocoaPods version is newer than 1.0.0.
✔ Python installed and configured correctly.
✔ The Python 'six' package is found.
✔ Getting NativeScript components versions information...
✔ Component nativescript has 4.2.4 version and is up to date.

と一発で表示されればまずは第一関門突破です。

もしConfigrationの選択肢が表示されたらAndroid SDKJava周りがうまくいっていないです。

自分はいくつも参考にしたところからAndroid SDKのpath違いからエラーが起きており
Android SDKの確認
Android Studioを起動→Configure→SDK Managerで以下があることを確認
27とか26があれば大丈夫らしいですが23まで入れました。
f:id:kana_kanade:20181006112608p:plain
あと後でエミュレーターを起動する時のために、右下のShow Package Detailを選択して、Google APIs Intel x86 Atom System Imageが入っていることを確認。
(無ければ入れる)
f:id:kana_kanade:20181006112617p:plain
Defaultだとこうなっていると思われるのでこれも確認。
f:id:kana_kanade:20181006112612p:plain

Android SDKのパス
参考にしたところでpathがLibrary/Android/sdkだったり/usr/local/share/android-sdkだったりで統一されていなかったので、.bash_profileを

export ANDROID_HOME=${HOME}/Library/Android/sdk

としました。
/usr/local/share/android-sdkだとemulatorディレクトリが作られず、AVD(Android Virtual Device)でエミュレーターが起動しない原因にもなる。

Androidエミュレーターを起動
クリアできたら

$ android avd list

で起動したいAVDを確認したら

$ $ANDROID_HOME/emulator -avd nexus6p(任意の実行したいAVD名)

エミュレーターが起動したらOK
もし起動せず

$ emulator -avd Nexus_5X_API_25
[140736266523584]:ERROR:./android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
Could not launch '../emulator/qemu/darwin-x86_64/qemu-system-x86_64': No such file or directory

といったエラーが出てしまった場合、下記URLの方法で.bashrcに追記すると解決することがあるそうです。
www.wazalab.com


自分はこれでも解決できず、原因は前述したようにpathが/usr/local/share/android-sdk/で、そこにemulatorディレクトリが作られていなかったのが問題でした。

これで恐らくエミュレーターが起動したのではないかと思います。

tns doctorで確認しましょう。

⑥プロジェクト作成

$ tns create [プロジェクト名]

Angularの場合は

$ tns create [プロジェクト名] --ng

README.md
node_modules
app
hooks
package-lock.json
package.json
tsconfig.json

が作成されると思います。
platformディレクトリが無い場合は

$ cd [プロジェクト名]

tns platform add android(or ios)

でplatformが追加されます

⑦tnsコマンドでエミュレーターを起動

$ tns run android(or ios)

で起動するはずですが、自分はずっとエミュレーターが開かないでタイムアウトしてしまいました。

原因としては
github.com
にあるように、HAXMの問題だそうです。
$ANDROID_HOME/extras/intel
に移動し、Hardware_Accelerated_Execution_Managerディレクトリに入ります。
.dmgファイルがあるので、それを叩いてインストーラーを起動させます。

インストールが終わったら、再度

$ tns run android


f:id:kana_kanade:20181006121019p:plain
エミュレーターが起動しました!

だいぶきつかったですがなんとかなりました。

何かの参考になれば幸いです。