「adb shell getprop」で端末情報を見る

ダッシュボード  |  Android Developers

つぶやきを監視しております。いつもありがとうございます。


やってみる。


~ $ adb shell getprop | grep api
[ro.product.first_api_level]: [25]

「SDK」関連を見てみます。


~ $ adb shell getprop | grep sdk
[ro.bootimage.build.version.sdk]: [28]
[ro.build.version.min_supported_target_sdk]: [23]
[ro.build.version.preview_sdk]: [1]
[ro.build.version.preview_sdk_fingerprint]: [9049062ccadb8a692212952393179260]
[ro.build.version.sdk]: [28]
[ro.qc.sdk.audio.fluencetype]: [fluencepro]
[ro.system.build.version.sdk]: [28]
[ro.vendor.build.version.sdk]: [28]

てか、整数のAPIバージョン数が分からないので、コードネームとの対照を調べる。


23 M                      6             Marshmallow
24 N                      7             Nougat
25 N_MR1                  7.1           Nougat
26 O                      8.0           Oreo
27 O_MR1                  8.1           Oreo
28 P                      9.0           Pie

core/java/android/os/Build.java - platform/frameworks/base - Git at Google

または、アプリ内部から吐かす。


Build.VERSION_CODES::class.declaredMembers.forEach { p ->
  p.isAccessible = true
  Log.d("VERSIONS", "${p.call()} -> ${p.name}")
}


D/VERSIONS: 1 -> BASE
D/VERSIONS: 2 -> BASE_1_1
D/VERSIONS: 3 -> CUPCAKE
D/VERSIONS: 10000 -> CUR_DEVELOPMENT
D/VERSIONS: 4 -> DONUT
D/VERSIONS: 5 -> ECLAIR
D/VERSIONS: 6 -> ECLAIR_0_1
D/VERSIONS: 7 -> ECLAIR_MR1
D/VERSIONS: 8 -> FROYO
D/VERSIONS: 9 -> GINGERBREAD
D/VERSIONS: 10 -> GINGERBREAD_MR1
D/VERSIONS: 11 -> HONEYCOMB
D/VERSIONS: 12 -> HONEYCOMB_MR1
D/VERSIONS: 13 -> HONEYCOMB_MR2
D/VERSIONS: 14 -> ICE_CREAM_SANDWICH
D/VERSIONS: 15 -> ICE_CREAM_SANDWICH_MR1
D/VERSIONS: 16 -> JELLY_BEAN
D/VERSIONS: 17 -> JELLY_BEAN_MR1
D/VERSIONS: 18 -> JELLY_BEAN_MR2
D/VERSIONS: 19 -> KITKAT
D/VERSIONS: 20 -> KITKAT_WATCH
D/VERSIONS: 21 -> LOLLIPOP
D/VERSIONS: 22 -> LOLLIPOP_MR1
D/VERSIONS: 23 -> M
D/VERSIONS: 24 -> N
D/VERSIONS: 25 -> N_MR1
D/VERSIONS: 26 -> O
D/VERSIONS: 27 -> O_MR1
D/VERSIONS: 28 -> P
D/VERSIONS: 10000 -> Q

この端末は API 25 の Nougat(MR1) でデビューしています。

今現在 「28-9.0-Pie」ように見えていますが、実際は、「Q-Preview」です。

Android OS バージョンのコードネームを取得する



Android人気ニュース速報 2019-04-28

Galaxy Fold

サムスンの折り畳みスマホGalaxy Foldの実物をようやく触った

折り畳みスマホSamsung Galaxy Fold使用レポート(1日目)

折りたたみスマホ「Galaxy Fold」、発売前に「壊れた」というレビュアー報告多数 - ITmedia NEWS

Samsung、折りたたみスマホ「Galaxy Fold」を発売延期 - PC Watch

iFixit、折りたたみスマホGalaxy Foldをさっそく料理。評価は「驚くほど壊れやすい」

iFixitがGalaxy Foldの分解レポートを公開〜ゴミが入りやすい? - iPhone Mania

Palm Phone

手のひらサイズの「Palm Phone」、4月24日発売 - ケータイ Watch

超小型スマホ「Palm Phone」日本上陸 3.3型液晶で手のひら大

バイクや自転車、腕にも装着できる超小型スマホ「Palm Phone」 - AV Watch

小さいスマホを探している人あつまれー! 「Palm」がSIMフリーで日本上陸 | ギズモード・ジャパン

クレジットカードサイズの3.3型スマホ「Palm Phone」、4月24日に国内発売! – すまほん!!

手のひらサイズの小型軽量スマホ「Palm Phone」4月24日に発売 - iPhone Mania

魅惑的な凝縮感、手のひらスマホ「Palm Phone」を見る


Kotlin で書きたい「正しいシングルトン(Singleton)」

汎用性のある使えるシングルトン、

どのように書いてますか?


class Singleton private constructor() {

  // getInstance() ???

}

ここから、どんな getInstance() を?

いくつか。


fun getInstance(): Singleton {
  synchronized(this) {
    if(INSTANCE == null){
      INSTANCE = Singleton()
    }
    return INSTANCE!!
  }
}


companion object {
  private var INSTANCE: Singleton ? = null
  fun getInstance(): Singleton {
    if(INSTANCE == null){
      INSTANCE = Singleton()
    }
    return INSTANCE!!
  }
}


companion object {
  val INSTANCE = Singleton()
  fun  getInstance(): Singleton {
    return INSTANCE
  }
}


@Volatile private var INSTANCE: Singleton ? = null
fun getInstance(): Singleton {
  if(INSTANCE == null){
    synchronized(this) {
      INSTANCE = Singleton()
    }
  }
  return INSTANCE!!
}


companion object {
  @Volatile private var INSTANCE: Singleton ? = null
  fun getInstance(): Singleton {
    return INSTANCE?: synchronized(this){
      Singleton().also {
        INSTANCE = it
      }
    }
  }
}

Singleton Pattern — What you might be doing wrong! – Hacker Noon

正解?

Googleの人はこう書いてます。


class CheeseRepository(
  private val api: CheeseApi,
  private val db: CheeseDatabase,
  private val executor: Executor
) {

  companion object {
    private const val PAGE_SIZE = 30

    private var instance: CheeseRepository? = null

    fun getInstance(context: Context) = instance ?: synchronized(this) {
      instance ?: CheeseRepository(
          CheeseApi(),
          Room.databaseBuilder(context, CheeseDatabase::class.java, "cheese").build(),
          Executors.newFixedThreadPool(4)
      ).also { instance = it }
    }
  }

CheesePage/CheeseRepository.kt at master · yaraki/CheesePage

あと、Dagger の @Singleton もこのスタイルに変換されますので安心です。覚えておきたい記述です。

まとめ

なんだか気持ちが悪くても、
なかなか正解が見つけられないこと多くね? 最近。