トップ 最新 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2022-08-09 [Android][Kotlin]圧縮ネイティブ・ライブラリについて

新規アプリケーションをPlay Consoleにアップロードする場合はAndroid App Bundle (AAB) 形式が義務付けられているが、既存アプリケーションでリリース手順を変更したくないとか、デバッグ用途でadbコマンドで端末にアプリケーションをインストールする場合はAndroid Application Package (APK) 形式でアプリケーションを生成することになる。

Play ConsoleにアップロードされたAABは、ストアによってインストールする端末に対応しAPKを生成し、ストアによって署名して端末にダウンロードされインストールされる。

AAB

アプリケーションのサイズを縮小するという目的で、デフォルト値がサイズ縮小の方向になるようになった。

Gradleで署名されたAPKを生成される場合は、サイズ縮小のための変更点について気にしなくても問題がないが、手動で署名する場合、変更点を気にするポイントがある。

_ アプリのサイズを削減する

APK内のネイティブ・ライブラリが圧縮されていると、インストール時にPackageManagerがAPKからネイティブ・ライブラリをコピーするが、圧縮されていないとコピーされない。圧縮されていないとAPKのファイルサイズは増加するが、ネイティブ・ライブラリのコピーが発生しないので、結果的に端末のストレージを消費するサイズが小さくなる。

_ APKのダウンロードサイズ

ネイティブ・ライブラリが非圧縮の方が、ストアの圧縮効率が高いと説明されており、結果、ダウンロードサイズが小さくなるそうだ。ただし、こちらの欠点は、Play Consoleにアプリをアップロードしないと、ダウンロードサイズが制限内か分からないことだ。

Android StudioにはAPK Analyzerが用意され、これを使うとダウンロードサイズを得ることができるが、サポートに確認したところ、これの計算式はストアでダウンロードサイズを得る計算式と異なるという説明だったので、目安程度と考えるのが良さそうだ。

_ ネイティブ・ライブラリの圧縮の指定

AndroidManifest.xmlのandroid:extractNativeLibsが"false"だと非圧縮となる。Android Gradle プラグイン (AGP) 4.2.0 以降は、build.gradleのuseLegacyPackagingに置き換わっている。また、extractNativeLibsのデフォルト値はminSdkVersionとAGPのバージョンによって異なる。

_ zipalignの-pオプション

APKに共有ライブラリ.soが含まれている場合は、-pオプションを指定して、mmapに適して4KBページ境界にライブラリをアライメントする必要がある。この対応はネイティブ・ライブラリが非圧縮となった場合に必須となったようだ。

本件は関係する項目がバラバラに説明されており、把握するのに苦労した。Googleが推奨する手順、Android StudioでアプリケーションをAAB形式で生成する場合、変更点を把握していなくても、気づかず、うまく行っていたと思うが、非推奨の手順を選択していると罠に引っかかることがある。今回、APK内の共有ライブラリ.soは圧縮から非圧縮に変わり、Gradleで署名していない場合、zipalignコマンドの-pオプションの指定が必須になっていたとは…

本日のツッコミ(全1件) [ツッコミを入れる]

_ Steferd [Create and manage classes, assignments, and grades online ..]


2022-08-20 [Swift][アルゴリズムとデータ構造]2の負のべき乗

少数fがk-1桁の10進形で、以下のような配列dで表されているとする。

f=Si : 1<=i

fを2で割りたいとする。これは、iを1からk-1この数字diに対して割り算を繰り返すことで行える。以下のように、ひとつ前の桁からの桁下がりの可能性や、次の桁への余りrの保持を考慮して、各桁の数字を2で割っていけばいい。

r=10*r+d[i]; d[i]=rDIV2; r=rMOD2

これをSwiftでコード化すると以下のようになる。Swiftでは配列の添字は0始めなので、添字の扱いを少々変更している。

import Foundation
 
let N = 10
var d = [Int](repeating: 0, count: N)
for k in 0..<N {
    print(".", terminator: "")
    var r: Int = 0
    for i in 0..<k {
        r = 10 * r + d[i] // 前の桁の余りr
        d[i] = r / 2 // 角桁の数字を2で割っている
        r = r % 2 // 余りr
        print("\(d[i])", terminator: "")
    }
    d[k] = 5
    print("5")
}

結果は以下のとおり。

.5
.25
.125
.0625
.03125
.015625
.0078125
.00390625
.001953125
.0009765625

トップ 最新 追記