2019年2月22日金曜日

EclipceからAndroidStudioへのお引っ越し ーその2ー

Eclipce側での修正はひと段落したので、いよいよAndroidStudioへの移行を行いたいます。
AndroidStudio側でEclipceのワークスペースをインポートする機能があるので、簡単にできるかと思いましたが、3箇所ほどつまづきましたのでメモを残しておきます。

その1:ビルドができない。


インポートそのものは本家の解説を見て問題なくできたのですが、ビルドをするとエラーが出てしまいます。
ERROR: Could not find com.android.tools.build:gradle:3.3.1.
Searched in the following locations:
  - https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.pom
  - https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.jar
Required by:
    project :
Add Google Maven repository and sync project
Open File
Enable embedded Maven repository and sync project
色々と検索をして見ましたが、これはというサイトが見つかりませんでした。いずれにしろGradle関連の設定では無いかと検討をつけてこちらのサイトを参考に、プロジェクト全体のbuild.gradleにgoogle()を追加すれば良いことがわかりました。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
        google() ・・・・・この行を追加
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
    }
}

allprojects {
    repositories {
        jcenter()
        google() ・・・・・この行を追加
    }
}

新規にプロジェクトを作成する場合は、初めから追加されているようですがEclipceからインポートした場合には記述されなかったようです。

これに関連して、自動生成された各モジュールのbuild.gradleのdependenciesですが、compileで生成されますがcompileが非推奨となったとのことで、implementationとapiに変更しておいた方が良いようです。
私のアプリでは「アプリケーションモジュール→ライブラリモジュール→Android supportライブラリ」という依存関係があるので
アプリケーションモジュール
 dependencies {
     implementation project(':myLib')
 }

myLibモジュール
 dependencies {
     api project(':lvl')
     api 'com.android.support:appcompat-v7:28.0.0'
     api 'com.android.support:preference-v7:28.0.0'
     api 'com.android.support:recyclerview-v7:28.0.0'
 }

lvlモジュール
 dependenciesは無し
lvlモジュールのメソッドで一部アプリケーションモジュールで利用するものがありますが、myLibでapi宣言しているのでアプリケーションモジュールではlvlを指定する必要はありません。

その2:実行ができない!


無事にビルドも完了したので、さて実行をと思ったところで問題発生。
実行の構成を行おうとメニューから実行>実行の構成>TemplatesからAndroid Appを選択しましたが、モジュールが空っぽで選択することができません。

ソースも特にいじっていなかったので、一旦モジュールを削除して再度インポートし直したところ、実行の構成でモジュールの選択ができるようになりました。

1つのプロジェクトにアプリケーションと共通ライブラリがあったので、まずはライブラリからインポートしたので原因でしょうか?

後でわかった事として、各モジュールのbuild.gradleの先頭で各モジュールの属性を宣言しているようです。Android developerではビルドの設定>ビルド設定ファイル(build.gradle ファイル)>モジュール レベルのビルドファイルにもそれらしい説明はなく詳細はAndroid Plugin DSL Reference(英語)を見ろと突き放しています。結局、こちらに先頭行のプラグインでアプリケーションとライブラリを切り替えている事が説明されていました。ただ、ここは日本語に翻訳されていますが、バージョンが古いのでしょう依存関係の説明でcompileが使用されています。

その3:":" is not a valid resource name


やっと実行に漕ぎ着けましたが、実行してみると上記のようエラーが出てしまいます。

同じようなエラーはネット上でもいくつか見受けましたが、何れにしてもリソース関係のようです。string.xml又はlayout.xmlあたりでnameに":"を使っていないかということをヒントに、検索してみるとlayout.xml内でname="@id/android:empty"と指定しているところがありました。これはListActivityでデータが1件も無かった場合、自動的にこのidを持っているTextViewを表示してくれるという機能を使うためなんですが、どうやらこの指定方法が古かったようです。最近では@android:id/emptyと指定するようです。

ここでも浦島太郎になっていました(笑)

その他


Javaには長いことお世話になってきましたが、Oracleは(サポート≒セキュリティパッチ)有償化に踏み切ったようで、その話題で盛り上がっている界隈もあるようです。

その昔、SunがOracleに買収された時にJavaが有償化されるのではという危惧をしましたが、ついに来たかという感想です。そうなると次は「MySqlよお前もか!」にならなければいいんですが。(MySqlは現在も有償版とGPL版がありますが、今後はサポートを有償化という流れで、Oracleがあまたある利用サイトからお金を徴収しようと考えるかですね)

まあ、使う側としては、お金のある企業さんはサポート契約を結ぶんでしょうし、中小企業ではセキュリティリスクを我慢して(というか、サポート要員もいないので納品されたシステムをそのまま運用しているので、セキュリティもへったくれも無い)今のまま何もしないという流れではないか、と予想しています。(Oracle側もプライバシーマクを取得しているような企業や、セキュリティに責任を持つ企業さんは有償化わかってるよね、的な発言しているようですしね。)

Androidの開発でもJavaを使っていますが、Androidは2016年にはJavaのライブラリをOpenJDKへ切り替えていますので、直接の影響は出ないでしょう。まあ、GoogleとOracleの間ではJavaに関して訴訟が2010年ごろからあったので、Googleとしてはこの事態はすでに予想して対応していたんでしょう。

この話題と関連してかKotlinという言語が話題に上がってきているようです。すでにAndroid関連の話題でもKotlinを使ったページもだいぶ出てきているようです。

ということで、今年は今あるアプリをSwiftとKotlinで書き直してみたいと思います。

0 件のコメント:

コメントを投稿

MicroSDカードアダプタでWindows10がクラッシュ

事の初め  Raspberry Pi 4のスタータキットをAmazonで購入したところ、MicroSDカードをUSB-TypeAとTypeCで利用できるようにするアダプタがついてきました。非常にコンパクトで良さげです。 TypeAの方ではチョコチョコと使っていましたが、特に問題は...