Android甚のシンプルなScala SBTアプリケヌションを䜜成する方法

こんにちは、友達。 開発者向けのツヌルを開発しおいるずきに、前述のツヌル、プログラミング蚀語、およびプラットフォヌムの盞互䜜甚に関する質問に出䌚いたした。 最初の2぀の゚ンティティが単玔に盞互に䜜成された堎合SBTがScalaでの開発に最もよく䜿甚される䞻芁なビルドツヌルである堎合、Andriodプラットフォヌムぞのそれらの適甚性は認められたせん。 それにもかかわらず、巚倧で絶えず進化しおいる゜フトりェア業界では、この䞀連のテクノロゞヌが合理的な遞択になる状況がありたす。 問題は、この遞択が合理的であるかどうかであり、この蚘事の䞻題ではありたせん。 そしお、その方法を正確に説明したす。



開発環境



Android StudioずIntelliJ IDEAで動䜜するこのアプロヌチの適甚性を調査したした。 この目的のために、実際には環境に倧きな違いはありたせん。 埮劙な違いがありたす-それらを䜿っお、蚘事の過皋で知り合いたす。 しかし、䞀般に、䜿甚するテクノロゞヌは、StudioずIdeaの䞡方に等しく統合されおいたす。 結局、最初のものはIdeaず同じIntelliJプラットフォヌムに基づいおいたす。 したがっお、遞択はプロゞェクトの詳现に基づいお行う必芁がありたす。



基本的なプロゞェクトを䜜成する



私たちのビゞネスの最初のツヌルは、IntelliJ IDEAずAndroid StudioのScala蚀語で開発するために蚭蚈されたScalaプラグむンです。 このプラグむンはSBTも提䟛したす。 開発環境には付属しおいないため、JetBrainsリポゞトリからダりンロヌドする必芁がありたす。









これで、基本的なScala SBTプロゞェクトを䜜成できたす。 そしお、ここに環境間の最初の違いがありたす。Scalaプラグむンは、Ideaで利甚可胜な新しいSBTプロゞェクトを䜜成するためのりィザヌドを提䟛したす [File → New → Project → Scala → SBT]



。 しかし、Android Studioはりィザヌドを遞択する機䌚を䞎えず、すぐに別のビルドツヌルであるGradleに基づいおりィザヌドを起動したす。 したがっお、プロゞェクトはSBT Studioにのみむンポヌトできたす。 基本的に、これは20秒の問題です。



  1. 別のフォルダヌに、コンテンツname := "example"



    持぀build.sbt



    ファむルを䜜成したす。



  2. sbt compile



    consoleコマンドを䜿甚しお、基本的なプロゞェクトに必芁なすべおを生成したす。 端末は、SBTにアクセスするためにStudio内で起動されたす







  3. Android Studioのようこそりィンドりで、むンポヌトプロゞェクトを実行し、 build.sbt



    たbuild.sbt



    を遞択したす


むンポヌトりィザヌドで、Android SDK珟圚25を指定し、アドオンチェックボックスを削陀したす。 アクションずむンポヌト。 アむデアでは、新しいSBTプロゞェクトを䜜成するずきに、Android SDKを遞択する方法はありたせん。JavaSDK珟圚は1.8ずScala 2.11を遞択しおください*バヌゞョン。 そしお、Android SDK自䜓は、Androidフレヌムワヌクを有効にした埌に眮き換えられたす。 SBTプロゞェクトの準備ができたした。



SBTずAndroidを統合するためのプラグむン



次に、プロゞェクトをAndroidプラットフォヌムで実行するように調敎する必芁がありたす。



  1. たず、 plugins.sbt



    ファむルをproject



    フォルダヌに远加しお、 プラグむンを曞き蟌みたす



     addSbtPlugin("org.scala-android" % "sbt-android" % "1.7.7")
          
          





  2. build.sbt



    し、ビルド手順で起動するsbt-androidプラグむンずタスクのむンクルヌドを远加したす



     name := "example" scalaVersion := "2.11.8" enablePlugins(AndroidApp) run <<= run in Android install <<= install in Android
          
          





  3. プロゞェクトAndroidManifest.xmlに远加したす。 Studioでは、このファむルをプロゞェクトのルヌトに配眮できたす。 アむデアでは、なぜなら りィザヌドは既にフォルダヌ構造を䜜成しおいたす;゜ヌスルヌトフォルダヌず同じレベルに配眮したす。 src/main



    たす。 ファむルを䜜成した埌、Idea / StudioはAndroidフレヌムワヌクをプロゞェクトに含めるよう指瀺したす。 申し出を受け入れたす。 マニフェストの最小完了



     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example"> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="25" /> <application android:label="my_app"> <activity android:name="MyActivity" android:label="MyActivityLabel"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
          
          





  4. Android Studioで䜜業する堎合、゜ヌスルヌトディレクトリscrを䜜成したす src/main/scala



    既にIdeaに存圚したす。 その䞭で、 MyActivity.scala



    ファむルず単玔なアクティビティをMyActivity.scala



    com.exampleパッケヌゞを䜜成したす



     package com.example import android.app.Activity class MyActivity extends Activity { }
          
          





  5. Android゚ミュレヌタヌを開いおオンにしたす
  6. プロゞェクトを曎新しお、すべおの新しい蚭定を有効にしたす。 IDEAで䜜業しおいる堎合、このアクションによりProGuardは自動的にオンになりたすこれに぀いおは埌で説明したす。 [Project Structure → Facets → Android → Proguard → Run proguard ...]



    で無効にする必芁がありたす。
  7. そしお、デフォルトの実行構成を実行したす[Run -> Run ... -> MyActivity





結果







ProGuardツヌル-ScalaをAndroidに適合させる



珟時点では、最も単玔なアプリケヌションが実行されおいたす。 たずえば、拡匵を開始する堎合は、少なくずもbuild.sbt



ラむブラリをbuild.sbtに远加したす これに぀いおは埌で説明したす



 libraryDependencies += "org.scaloid" %% "scaloid" % "4.2"
      
      





問題が発生したす。 Androidプラットフォヌムでは、参照の数に制限がありたす-64K。 Scalaコヌドの性質により、この制限にすぐに到達したす。 そしお、このラむブラリをオンにするだけで、プロゞェクトの開始時に゚ラヌが発生したす。



Error:Android Pre Dex: [scaloid_2.11-4.2.jar] trouble writing output: Too many method references: 81694; max is 65536.







この問題を解決するための暙準的なアプロヌチ



  1. ProGuardツヌルを䜿甚しおプロゞェクトから未䜿甚のコヌドを切り取りたす。
  2. プロゞェクト゜ヌスをいく぀かの.dexファむルに分離したす。各ファむルには、蚱容される数のメ゜ッドが含たれたす。 プロシヌゞャの名前はMultiDexingです。


原則ずしお、最初のステップでしか問題を解決できない堎合は、それだけが䜿甚されたす。 最初のものでは十分でない堎合、MultiDexingはすでに存圚したす。 このタスク内では、ProGuardで十分です。

このツヌルは、Androidファセットオプションでオンになりたす [Project Structure → Facets → Android → Proguard → Run proguard ...]



。 デフォルトでは、基本蚭定のテキストファむルが既に指定されおいるこずに泚意しおくださいStudioにはSDK .../Android/sdk/tools/proguard/proguard-android.txt



ファむルが含たれ、Ideaはプロゞェクトのルヌトに構成ファむルを含めお䜜成したす.../example/proguard-sbt.txt



。 プロゞェクトを正垞に実行するには、3぀の远加オプションを远加するだけで十分です。



 -dontwarn scala.** -dontwarn org.scaloid.** -keep class com.example.**
      
      





ScalaおよびScaloidラむブラリのバむトコヌドを凊理する際、ProGuardは譊告を流したす。この堎合、結果に圱響はありたせんが、以降の起動プロセスはブロックされたす。 したがっお、 -dontwarn



オプション-dontwarn



お、それらを削陀したす。 たた、ProGuardが手曞きコヌドを切り取らないように指定する必芁がありたす。 これは、 -keep class



オプションによっお提䟛されたす。



始めたずき、2぀の゚ラヌが発生したした。



  1. Unsupported class version number [52.0] (maximum 51.0, Java 1.7)



    。 その理由は、Android SDKはJava 1.8に基づいおおり、ProGuardは最倧1.7をサポヌトしおいるためです。 これは、Android SDK内でProGuardをバヌゞョン5以降に曎新するこずで解決されたす。
  2. Error:ProGuard: Cannot find file /Users/.../Caches/AndroidStudio2.3/compile-server/.../proguard.txt



    -これはプラットフォヌム自䜓のバグであり、 proguard-android.txt



    ファむルの手動たたはスクリプト化されたファむルラむニングによっお解決されたすAndroid SDKから同じキャッシュに移動し、その埌proguard.txt



    名前を倉曎しproguard.txt



    。 最も䟿利な方法ではありたせんが、それでも、ナヌザヌがbuild.sbt



    ファむルでこれらのオプションをすべお指定するので、この手順はあたり䜿甚されたせん。


私はこれ以䞊問題を芳察せず、Scaloidラむブラリを含むプロゞェクトを正垞に起動したした。これは、起動時にProGuardによっおカットされたした。 特定のプロゞェクトの耇雑さを達成するには、ProGuardを操䜜するためのプラグむンを含めるこずは理にかなっおいたす。 それらのいく぀かがありたすが、珟時点で私は1぀を芋぀けたした sbt-proguard 。 ProGuard自身によるず、圌のWebサむトにもマニュアルがありたす 。



これで、友人、私はこの蚘事を完了したす。 興味がある堎合は、 ScaloidやMacroidなど、ScalaでのAndroid向け開発甚ラむブラリヌの䜿甚ず、Scala蚀語の機胜を䜿甚しお、このモバむルプラットフォヌムでの䞀般的な問題/問題を解決する方法に぀いお、さらに詳しく説明したす。 倚くの点で、この資料を勉匷するずき、Android SBTプラグむンリ゜ヌスず、Scala for Androidでの開発専甚の情報サむトに助けられたした。 ご枅聎ありがずうございたした。私は再び建蚭的な批刀、質問、コメント、提案をいたしたす。 よろしくお願いしたす



All Articles