2014年7月28日月曜日

Android Studioの構成で、既存のプロジェクトをEclipseからAndroid Studioへ移行する

EclipseとAndroid Studioではプロジェクトの構成が異なる

ビルドシステムが異なるので、構成も異なります。

Eclipse
.
├── AndroidManifest.xml
├── assets(アセットなど)
├── bin(自動生成)
├── gen(自動生成)
├── libs(ライブラリなど)
├── project.properties
├── res(リソースなど)
│   ├── drawable
│   ├── layout
│   ├── menu
│   ├── values
│   └── xml
└── src(ソースなど)

Android Studio
.
├── プロジェクト名.iml
├── app
│   ├── app.iml(自動生成)
│   ├── build(自動生成)
│   ├── build.gradle
│   ├── libs(ライブラリなど)
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets(アセットなど)
│           ├── java(ソースなど)
│           └── res(リソースなど)
│               ├── drawable
│               ├── layout
│               ├── menu
│               ├── values
│               └── xml
├── build(自動生成)
├── build.gradle
├── gradle(自動生成)
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties(Gradleのバージョンを変えるときに稀にいじる)
├── gradle.properties(ビルドするときの変数などを記述)
├── gradlew(自動生成)
├── gradlew.bat(自動生成)
├── local.properties(Android SDKのパスなどを記述)
└── settings.gradle(ビルドするモジュールを記述)



Android Studioから Eclipseのプロジェクトをインポートする

Preview以前は無かった気がするのですが、Android Studioから直接インポートできるようになっていました。
Eclipseからエクスポートする場合と比べて、プロジェクトの構成まできちんと変換してくれます!
これでAndroid Lに触れますね。



既存のリポジトリを活用したい

Android Studioからインポートすればうまいことできるのですが、SCMの設定はうまく引き継がれません。
そういうときは、Android Studioで空のプロジェクトを作り、そこに既存のプロジェクトから、必要なフォルダ/ファイルだけ外部参照してあげると良い感じになります。

Subversionの場合は以下のようにします。

[studio app]$ svn propedit svn:externals . --editor-cmd=vi
リポジトリ/libs libs

[studio main]$ svn propedit svn:externals . --editor-cmd=vi
リポジトリ/res res
リポジトリ/assets assets
リポジトリ/AndroidManifest.xml AndroidManifest.xml
[studio java]$ svn propedit svn:externals . --editor-cmd=vi
リポジトリ/パッケージ パッケージ


複雑でないプロジェクトならこれで解決します。こうすることによって、EclipseとAndroid Studio同時に開発を進めることが出来ます!環境が異なるのであまりお勧めできませんが、会社などでいち早くAndroid Studioを検証したいときなどに使えると思います。



参考

Qiita / EclipseからAndroid Studioに移行する
うさがにっき / EclipseからAndroidStudioへの開発環境移行、疑問編
WEBTECH WALKER / svnコマンドの覚え書き



2014年7月26日土曜日

Maven Centralに自作ライブラリを登録するまでの長い道のりと挫折と回り道

ライブラリを簡単に使えるように

Maven Centralというところに登録すればライブラリの導入が簡単になるらしいということで、自作ライブラリを登録した。

  • Maven
    • プロジェクト管理ツール。ビルドもできるし、依存性も解決してくれるらしい。

環境

  • Eclipse() : 4.2 Juno
    • 通常のAndroidプロジェクトを作成。
    • AndroudStudio版も調べます!てか今後は全部移行すべき。
  • Eclipse ADT Plugin : 22.6
  • Apache Maven : 3.1.1

Sonatypeアカウント作成

  • Maven Centralにライブラリを登録するために必要。
    • Sonatypeのリポジトリを通して公開する。
  • https://issues.sonatype.org/

EclipseプロジェクトのMaven対応

  • プラグインを入れてなければ入れる
    • Maven Integration for Eclipse
  • Configure -> Convert to Maven
    • pom.xml が作成される(pom = Project Object Model)
      • 作成時の項目は後から変更できる。
      • GroupId
      • com.github.sakebook
      • ArtifactId
      • DialogHelper
      • Version
      • 0.0.1
    • Packaging
      • jar
    • Name
      • DialogHelper
    • Description
      • Easy way to make dialog for everyone.

  • 変更前の.classpath

 
 
 
 
 
 



  • 変更後に追加される
...
 
  
   
   
  
 
...
 
  
   
  
 
 
  
   
  
 
...


  • 変更前の.project

    DialogHelperSample
    
    
    
    
        
            com.android.ide.eclipse.adt.ResourceManagerBuilder
            
            
        
        
            com.android.ide.eclipse.adt.PreCompilerBuilder
            
            
        
        
            org.eclipse.jdt.core.javabuilder
            
            
        
        
            com.android.ide.eclipse.adt.ApkBuilder
            
            
        
    
    
        com.android.ide.eclipse.adt.AndroidNature
        org.eclipse.jdt.core.javanature
    

  • 変更後に追加される
...
        
            org.eclipse.m2e.core.maven2Builder
            
            
        
...
    
        org.eclipse.m2e.core.maven2Nature
        com.android.ide.eclipse.adt.AndroidNature
        org.eclipse.jdt.core.javanature
    
...

  • 作成されるpom.xml

  4.0.0
  sample.convert.maven
  MavenConvertSample
  0.0.1
  MCS
  sample
  
    src
    
      
        maven-compiler-plugin
        3.1
        
          
          
        
      
    
  


JREが、J2SE-1.5に変更されるので、プロジェクトデフォルトに戻す。
* BuildPath -> Configure Build Path -> Java Build Path -> Libraries -> JRE SystemLibrary -> Edit -> Workspace default library

    pom.xmlの設定

    • Mavenでビルドする際に必要な記述を追加していく。
      また、Maven Centralに登録して皆が使えるようにするには、誰が作ったのか?どのようなライセンスなのか?なども記述しないといけない。先に完成系を張っておく。
    
        4.0.0
    
        
            org.sonatype.oss
            oss-parent
            7
           
    
        com.github.sakebook
        DialogHelper
        0.0.1
        jar
        DialogHelper
        Easy way to make dialog for everyone.
        https://github.com/sakebook/android-library-dialog-DialogHelper/
    
        
            
                Apache License 2.0
                http://www.apache.org/licenses/LICENSE-2.0
                repo
            
        
    
        
            https://github.com/sakebook/android-library-dialog-DialogHelper
            scm:git:git://github.com/sakebook/android-library-dialog-DialogHelper.git
            scm:git:git://github.com/sakebook/android-library-dialog-DialogHelper.git
        
    
        
            
                sonatype-nexus-staging
                Nexus Staging Repository
            https://oss.sonatype.org/service/local/staging/deploy/maven2/
            
        
    
        
            
                sakebook
                Shinya Sakemoto
                sakebook@gmail.com
                http://sakebook.blogspot.com/
                
                    developer
                
            
        
    
        
            GitHub
            https://github.com/sakebook/android-library-dialog-DialogHelper/issues
        
    
        
            UTF-8
            UTF-8
            UTF-8
            UTF-8
            4.1.1.4
            16
            r7
            1.6
            3.1.1
        
    
        
            
                
                    com.google.android
                    android
                    ${android.version}
                    provided
                
                
                    com.google.android
                    annotations
                    ${android.version}
                
                
                    com.google.android
                    support-v4
                    ${android.support.version}
                
            
        
    
        
            ${base.dir}src
            
                
                    res
                     
            
            
                
                    
                        org.apache.maven.plugins
                        maven-compiler-plugin
                        3.1
                        
                            ${java.version}
                            ${java.version}
                            true
                            ${project.build.sourceEncoding}
                            ${project.reporting.outputEncoding}
                        
                    
                    
                        com.jayway.maven.plugins.android.generation2
                        android-maven-plugin
                        3.8.2
                        
                            ${project.basedir}/AndroidManifest.xml
                            
                                ${env.ANDROID_HOME}
                                ${android.platform}
                            
                        
                        true
                    
                    
                        org.apache.maven.plugins
                        maven-javadoc-plugin
                        2.9
                            
                                ${project.build.directory}
                            
                    
                    
                        org.apache.maven.plugins
                        maven-source-plugin
                        
                            
                                package
                                
                                    jar
                                
                            
                        
                    
                
            
            
                
                    org.apache.maven.plugins
                    maven-release-plugin
                    2.4
                    
                        ${project.build.sourceEncoding}
                        ${project.reporting.outputEncoding}
                        forked-path
                        true
                    
                
            
        
    
        
        
            
                release-sign-artifacts
                
                    
                        performRelease
                        true
                    
                
                
                    
                        
                            org.apache.maven.plugins
                            maven-gpg-plugin
                            1.4
                            
                                ${project.build.sourceEncoding}
                                ${project.reporting.outputEncoding}
                            
                            
                                
                                    sign-artifacts
                                    verify
                                    
                                        sign
                                    
                                
                            
                        
                    
                
            
        
    
    
    

    • parent
      • 親プロジェクト。sonatypeのレポジトリを利用するため。
    • licenses
      • プロジェクトのライセンス。
    • scm
      • プロジェクトのソースコード管理システムを記述。
    • distributionManagement
      • リモートリポジトリにでプロイするために必要な情報を記述。
    • developers
      *プロジェクトの開発者を記述。 貢献者がいる場合はcontributorsへ書く。
    • issueManagement
      • バグ管理システムを記述。
    • properties
      • 変数を定義。pluginで同様のプロパティ名を持つ場合、pomに記述した内容が用いられる。
    • dependencyManagement
      • 依存関係を定義。dependenciesのみで定義した場合との違いは、Managementで括ると、子pomに依存関係は、明示的に宣言しないといけない。その代わりバージョンは親pomのものが継承される。
    • build
      • buildに関する情報を定義。
      • sourceDirectory
        • ソースディレクトリを相対パスで定義。今回はEclipseのプロジェクトをConvertしたので、通常のMavenプロジェクトとは構成が異なる。
      • resources
        • リソースを定義。ソースと同様に、EclipseのプロジェクトをConvertしたので、通常のMavenプロジェクトとは構成が異なる。
      • pluginManagement
        • 依存関係を定義。dependenciesのみで定義した場合との違いは、Managementで括ると、子pomに依存関係は、明示的に宣言しないといけない。その代わりバージョンは親pomのものが継承される。
      • plugins
        • プラグインに関する情報を定義。
    • profiles
      • プロジェクトのプロファイルを定義。環境に依存する設定を記述。今回はperformReleaseビルド時のみmaven-gpg-pluginを利用するように。

    • ローカルの設定やpasswordの設定は ~/.m2e/setting.xmlに記述。
    
        
            
                
                sonatype-nexus-staging
                xxxxxxxxx
                xxxxxxxxx
            
        
        
            
                android-sdk
                
                    
                    xxxxxxxxxx/xxxxxxx
                
            
        
        
            android-sdk
        
    
    
    

    issue作成

    • 先ほど作成したSonatypeで、リポジトリを作成してもらうようにissueを作成します。
      • 僕が作成したissueはこちらです。Group Idに問題があり、やりとりがありました汗
      • 作ってもらったら、今度はライブラリをデプロイしたときにまたコメントしましょう。

    pgp署名確認

    • Maven Centralに登録するには、公開物に対して署名をしなければなりません。
    • 未インストールの場合はこちらから。

    鍵作成

    • 聞かれる値はデフォルト値でOK
    $ gpg --gen-key
    
    • 作成された鍵の確認
    $ gpg --list-keys
    
    • 対象ファイルの署名
    $ gpg -ab FILE
    
    • 署名の確認
      • sub鍵で署名されていないか確認
        • 45yH63G3 の様な8文字が鍵のID
        • pub(公開鍵) のIDと一致していればOK
    $ gpg --verify FILE
    
    • 公開鍵の配布
    $ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 45yH63G3
    
    • 確認
      • 45yH63G3 が帰ってくればOK
    $ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 45yH63G3
    

    コマンドラインからビルド

    プロジェクトのルートディレクトリで

    $ mvm clean package
    
    • ライブラリ本体のjarを作成
    $ mvm deploy
    
    • distributionManagementに記述したリポジトリにライブラリ本体とpom.xmlをデプロイ。
    • デプロイしたら、次のURLからstagingリポジトリに上がったことを確認できます。
    $ mvm source:jar
    
    • ソースファイルのjarを作成
    $ mvm javadoc:jar
    
    • javadocのjarを作成
    $ mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=pom.xml -Dfile=target/DialogHelper-0.0.1.jar -Dgpg.passphrase=yourpassphrase
    
    • jarを署名してリポジトリにアップロード
    $ mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=pom.xml -Dfile=target/DialogHelper-0.0.1-javadoc.jar -Dclassifier=javadoc -Dgpg.passphrase=yourpassphrase
    
    • javadocを署名してリポジトリにアップロード
    $ mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=pom.xml -Dfile=target/DialogHelper-0.0.1-sources.jar -Dclassifier=sources -Dgpg.passphrase=yourpassphrase
    
    • sourceを署名してリポジトリにアップロード
    • ここまでくれば、Stagingにある自分のリポジトリをCloseして、しばらくすると、Releaseできます。

    issue追記

    • Releaseが完了したので、その旨をコメントに記入しましょう。
    • 返事があり、その後しばらくすると、登録完了です!

    使ってみる

    • pom.xml
    
    
        com.github.sakebook
        DialogHelper
        0.0.1
        jar
    
    
    • build.gradle
    compile 'com.github.sakebook:DialogHelper:0.0.1'
    

    初めて上がったときは感動です!サンプルアプリや、CI済みなどがわかるとより使われやすくなると思います。皆さんも自作ライブラリを作り、職場や家でも簡単に使い回せるようにしましょう!


    参考

    #侍ズム / 【最新版】Maven Central Repository へのライブラリ登録方法 #maven
    @vvakameの日記 / JsonPullParser が Maven Central Repository に入るようです
    ノウハウ共有サイト!Knowledge Enabling / appendix. mavenセントラルリポジトリに公開する
    エルピーベ / MacOSXでGnuPGを使おう
    SlideShare / Maven基礎
    Unlimited Island / pom.xml