All Projects → gfx → android-oss-best-practices

gfx / android-oss-best-practices

Licence: MIT license
Best practices on creating Android OSS library projects [JA]

Projects that are alternatives of or similar to android-oss-best-practices

guide
Maintenance Guidelines for GitHub/npm organization.
Stars: ✭ 12 (-62.5%)
Mutual labels:  oss, document
Opensource.guide
📚 Community guides for open source creators
Stars: ✭ 9,460 (+29462.5%)
Mutual labels:  oss, best-practices
trace-cocoa-sdk
Catch bugs before they reach production — get detailed crash reports and monitor how your app is performing across the entire install base.
Stars: ✭ 15 (-53.12%)
Mutual labels:  oss
terraform-provider-graylog
Terraform Provider for Graylog
Stars: ✭ 21 (-34.37%)
Mutual labels:  oss
spring-boot-learn-box
spring boot集成其他组件
Stars: ✭ 21 (-34.37%)
Mutual labels:  oss
deep-learning-for-document-dewarping
An application of high resolution GANs to dewarp images of perturbed documents
Stars: ✭ 100 (+212.5%)
Mutual labels:  document
gof design patterns
GoF Design Patterns implemented in modern C++.
Stars: ✭ 21 (-34.37%)
Mutual labels:  best-practices
grape-jwt-authentication
A reusable Grape JWT authentication concern
Stars: ✭ 31 (-3.12%)
Mutual labels:  oss
a11y-contracting
Building Accessibility Best Practices into Contracting
Stars: ✭ 43 (+34.38%)
Mutual labels:  best-practices
books
Programming books
Stars: ✭ 27 (-15.62%)
Mutual labels:  document
derivejs
DeriveJS is a reactive ODM - Object Document Mapper - framework, a "wrapper" around a database, that removes all the hassle of data-persistence by handling it transparently in the background, in a DRY manner.
Stars: ✭ 54 (+68.75%)
Mutual labels:  document
everydocs-core
A simple Document Management System for private use with basic functionality to organize your documents digitally
Stars: ✭ 112 (+250%)
Mutual labels:  document
go-interfaces
This repos has lots of Go interface usage and best practice examples
Stars: ✭ 112 (+250%)
Mutual labels:  best-practices
RuoYi-Vue-Plus
基于RuoYi-Vue集成 Lombok+Mybatis-Plus+Undertow+knife4j+Hutool+Feign 重写所有原生业务 定期与RuoYi-Vue同步
Stars: ✭ 110 (+243.75%)
Mutual labels:  oss
BackportCpp
Library of backported modern C++ types to work with C++11
Stars: ✭ 53 (+65.63%)
Mutual labels:  best-practices
aliyun-oss-laravel
Laravel 的 Aliyun OSS 扩展, 支持 Laravel 9. Alibaba Cloud Object Storage Service For Laravel.
Stars: ✭ 91 (+184.38%)
Mutual labels:  oss
CleanSCAN
A simple, smart and efficient document scanner for Android
Stars: ✭ 151 (+371.88%)
Mutual labels:  document
dx-scanner
CLI tool that allows you to measure quality of a team work and an app based on your source code.
Stars: ✭ 79 (+146.88%)
Mutual labels:  best-practices
mall4cloud
⭐️⭐️⭐️ Springcloud商城 O2O商城 小程序商城 PC商城 H5商城 APP商城 Java商城 分销商城 多用户商城 uniapp商城 微服务商城
Stars: ✭ 3,915 (+12134.38%)
Mutual labels:  oss
prototype
📖Prototype Document
Stars: ✭ 45 (+40.63%)
Mutual labels:  document

Android OSSプロジェクトのベストプラクティス

これはOSS開発のリテラシー / Android編 として potatotips #56, 2018/11/15 in SmartNews で発表したものを改編したものです。

Table of Contents

この文書について

  • AndroidプロジェクトをOSSとして開発するにあたってベストプラクティスをまとめた
  • あくまでも「プロジェクトの構成」についてまとめたもの
    • gfxの個人的な経験に基づく
    • コードについては触れていない
  • Androidに依存することも、OSSに一般的なことも混在しているが、いずれも利用者としてあると嬉しいという基準で選定した
  • 紹介するベストプラクティスは MUST / SHOULD で分類した
    • MUST は「これが満たされてないとプロダクションで使用するのは難しい」というレベル
    • SHOULD は「できれば満たしてほしい」というレベル

リポジトリのホスティング

  • この文書は何らかのリポジトリホスティングサービスを利用することを想定している
    • GitHub, GItLab, BitBucketなど
  • 特定のホスティングサービスに依存することはこの文書では触れない

ベストプラクティス実践事例

https://github.com/maskarade/Android-Orma

  • 2015年から gfx がプロダクトオーナーとしてメンテナンスしているAndroidのORM
  • Ormaの開発で得たベストプラクティスが多いので、実践事例として紹介する

[MUST] OSSライセンスを設定する

  • OSSライセンス(OSIが「OSSライセンスである」と規定したライセンス)の設定されていないソフトウェアはOSSとはいえないので、これはベストプラクティスというよりはOSSの定義そのものではある
  • ライセンスは README にセクションを設けて一言触れ、さらにLICENSE ファイルを用意すべき
    • 各々のソースコードの冒頭でライセンスを書くのは、できればやったほうがよい
      • これは「やったほうがよい」程度という認識
  • Android界隈だと使われるライセンスはApache 2.0 License, MIT あたりがメジャーか

補足: OSSライブラリを使うときにはまずライセンスを確認すべき

  • ライセンスのない野良コードを製品に組み込むのはNG(訴訟リスクあり)
  • GPL系も使うのは難しい
    • 条件次第では可能だったりはするが…(アプリ自体をOSSにするなど)

[MUST] READMEを置く

  • 書くべきもの:
    • [MUST] ソフトウェアの名前
    • [SHOULD] ToC (エディタのpluginで自動生成すると便利)
    • [MUST] シンプルな使い方( “synopsis” )
    • [MUST] インストール方法
    • [SHOULD] APIリファレンス(synopsisだけで済む場合は不要)
    • [SHOULD] 開発のしかた(コントリビューションガイド)
    • [SHOULD] リリースエンジニアリング(releng)
    • [MUST] 作者の情報(連絡方法も含めて)
    • [MUST] ライセンス
  • Q「コントリビューションガイドは何を書けばいいか」A「PRを送るのに困らないようにするための開発のための解説でよいかと。開発環境とか」

例: https://github.com/maskarade/Android-Orma

READMEについての規格 "Standard Readme"

https://github.com/RichardLitt/standard-readme

  • 必ずしも広まっているとはいえないものの、こういう規格もある
  • Standard Readme is designed for open source libraries. Although it’s historically made for Node and npm projects, it also applies to libraries in other languages and package managers.

    • "npm用に開発された規格だが、他のOSSライブラリにも適用できる" とのこと
  • 個人的には重厚すぎて完全に従うのは面倒くさい
    • とはいえ見るべきものはあるので一読をおすすめしたい

[MUST] リリースしたら git tag を打ってpushする

  • 手でやってると忘れるのでコード化するとよい
  • 言語によっては自動的にやってくれたりする (e.g. rake release for ruby gems)

[MUST] CI を設定してバッヂをREADMEに置く

  • テストがなくてもCIの設定はすべき
  • CIの設定こそ開発環境やビルドの方法をコード化したものだからである
  • テストがある場合にはもちろんテストを実行する
  • 余裕があればカバレッジもとってバッジ化する(coverallsなどで可能)

[SHOULD] アーティファクトのgroupIdはライブラリ固有のもににする

  • Ormaのように複数のアーティファクトからなるライブラリでgroupIdをたとえば com.github.gfx みたいにしていたら「Ormaライブラリ群」を識別できない
  • なおartifactIdにも ormaorma-processor などライブラリ名を含めるほうがよい
    • artifactIdはしばしばファイル名として使われるので library みたいな名前だと他のものとパッと見てわからなくなりがち
  • Q「小さなライブラリなら com.github.gfx でもよいのでは」⇢ A「将来的にアーティファクトを分割したときに困るし、ルールはシンプルなほうがいいいので常に groupId をライブラリ固有のものにするのをおすすめする」

[SHOULD] bintrayに成果物を公開するときはライブラリごとにorgをつくる

  • 理由のひとつは、groupId同様に「ライブラリ群」を識別しやすくするため
  • 理由のもうひとつは、公開権限を複数人にするにはorgにするしかないため
    • Ormaは最初個人アカウントに公開していたが、最近メンテナが増えたのでorg管理に変えた
      • このorgへの移行のせいでgroupIdを変更しなければならなかった…
  • 余談: bintrayにアップロードするpluginは、 bintray-release はメンテが滞りがちなので、bintray公式のgradle-bintray-pluginを使うほうがよい

[SHOULD] Android Studioでプロジェクトをつくる

  • Android Studioで作ったプロジェクト構成やbuild.gradleが “Android Standard” といえるので、Android Standardに沿ってないプロダクトをたまにみると面食らう
  • gradlew とその関連ファイルもrepoにいれるべき
    • gradleのバージョンとandroid gradle pluginのバージョンはわりとちゃんと合ってないと動かないので、gradlewがrepoにないとビルドすらできないということになりがち

[SHOULD] テストを書く

  • 可能であればテストを書き、カバレッジもとってバッヂにするとよい
  • Tips: Robolectric 4.0 は、Android Instrumentation Test用に書いたテストをJVMで実行するためのテスティングフレームワーク
    • OrmaはRobolectricを使って「開発時はJVM test、リリース前にInstrumentation test」というスタイルでやっている
    • Robolectric固有の制限は(大量に)あるので、ライブラリによってはRobolectricだとまともに動かせないと思われるが…
      • それでもUIの絡まないビジネスロジック部分だけでもJVMでテストできると捗ると思われる

[SHOULD] ChangeLogファイルを置く

Changelogの書き方についての緒論

https://keepachangelog.com/

  • Changelogの書き方についての文書

[SHOULD] リリースエンジニアリングをコード化する

  • Ormaは gradle + make
    • bumpMajor などのversion変更用taskがあるのは、README内の依存関係の記述を最新のバージョンに保つため
    • ツールはなんでもいいが、とにかくコード化してREADMEに書いておくべき
      • 主に自分のために
      • たくさんOSSをメンテしてるとrelengの方法を忘れがち
      • かといって言語ごとにベストプラクティスが違うので統一も難しい
  • OrmaのREADMEより:
./gradlew bumpMajor # or bumpMinor / bumpPatch
code CHANGES.md # edit change logs
git add -va
make publish # run tests, build artifacts, publish to jcenter, and make a git tag to HEAD

[SHOULD] セマンティックバージョニングに従う

License

MIT License

Copyright (c) 2018 FUJI Goro

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].