Kotaro666-dev / android-project-refactoring

Apache License 2.0
1 stars 0 forks source link

開発をスタートする準備を整えてください #10

Closed Kotaro666-dev closed 1 year ago

Kotaro666-dev commented 1 year ago

要件

開発をスタートする準備を整えてください

完了条件

TODO 項目を完了すること

手順

参考資料

Kotaro666-dev commented 1 year ago

release ビルドタイプを選択した場合のエラー

Error: The apk for your currently selected variant (Unknown output) is not signed. Please specify a signing configuration for this variant (release).

解決方法

キーストアを作成して、releaseバリアントの署名設定をする

作成したキーストア

$ keytool -v -list -keystore jp.co.yumemi.android.codecheck.jks 
Enter keystore password:  
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: app_key
Creation date: Dec 30, 2022
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Kotaro666-dev
Issuer: CN=Kotaro666-dev
Serial number: 102d6a1f
Valid from: Fri Dec 30 19:49:06 JST 2022 until: Tue Dec 24 19:49:06 JST 2047
Certificate fingerprints:
         SHA1: E8:20:43:46:B3:A9:D0:B5:FA:EC:3E:7A:DA:90:F0:1B:DE:B5:73:5B
         SHA256: C9:13:A7:18:9F:57:1E:30:A3:8E:B9:BA:29:8C:0B:20:A5:60:A5:82:7F:5D:29:13:20:D8:53:EE:CD:04:8F:20
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 73 1A C6 A8 23 14 75 9C   FB 42 90 20 5D 63 5E D6  s...#.u..B. ]c^.
0010: 97 8E E5 AB                                        ....
]
]

*******************************************
*******************************************

ビルド時のエラー

$ adb shell am start -n "jp.co.yumemi.android.codecheck.release/jp.co.yumemi.android.code_check.TopActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 21335 on device 'google-pixel_3-8CSX1SS92'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/decheck.releas: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
    Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: jp.co.yumemi.android.codecheck.release, PID: 21335
    java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.co.yumemi.android.codecheck.release/jp.co.yumemi.android.code_check.TopActivity}: java.lang.RuntimeException: Exception inflating jp.co.yumemi.android.codecheck.release:navigation/nav_graph line 25
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.RuntimeException: Exception inflating jp.co.yumemi.android.codecheck.release:navigation/nav_graph line 25
        at androidx.navigation.r.c(:97)
        at androidx.navigation.NavController.w(:557)
        at androidx.navigation.NavController.v(:539)
        at androidx.navigation.fragment.NavHostFragment.l0(:248)
        at androidx.fragment.app.Fragment.M0(:2949)
        at androidx.fragment.app.s.e(:475)
        at androidx.fragment.app.s.m(:278)
        at androidx.fragment.app.t.r(:112)
        at androidx.fragment.app.m.G0(:1647)
        at androidx.fragment.app.m.O(:3128)
        at androidx.fragment.app.m.y(:3061)
        at androidx.fragment.app.h.f(:240)
        at androidx.fragment.app.e.onCreate(:276)
        at android.app.Activity.performCreate(Activity.java:7825)
        at android.app.Activity.performCreate(Activity.java:7814)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: jp.co.yumemi.android.code_check.item
        at androidx.navigation.t.a(:181)
        at androidx.navigation.r.e(:191)
        at androidx.navigation.r.g(:155)
        at androidx.navigation.r.b(:128)
        at androidx.navigation.r.b(:141)
        at androidx.navigation.r.c(:88)
        at androidx.navigation.NavController.w(:557) 
        at androidx.navigation.NavController.v(:539) 
        at androidx.navigation.fragment.NavHostFragment.l0(:248) 
        at androidx.fragment.app.Fragment.M0(:2949) 
        at androidx.fragment.app.s.e(:475) 
        at androidx.fragment.app.s.m(:278) 
        at androidx.fragment.app.t.r(:112) 
        at androidx.fragment.app.m.G0(:1647) 
        at androidx.fragment.app.m.O(:3128) 
        at androidx.fragment.app.m.y(:3061) 
        at androidx.fragment.app.h.f(:240) 
        at androidx.fragment.app.e.onCreate(:276) 
        at android.app.Activity.performCreate(Activity.java:7825) 
        at android.app.Activity.performCreate(Activity.java:7814) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: java.lang.ClassNotFoundException: jp.co.yumemi.android.code_check.item
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:454)
        at java.lang.Class.forName(Class.java:379)
        at androidx.navigation.t.a(:169)
        at androidx.navigation.r.e(:191) 
        at androidx.navigation.r.g(:155) 
        at androidx.navigation.r.b(:128) 
        at androidx.navigation.r.b(:141) 
        at androidx.navigation.r.c(:88) 
        at androidx.navigation.NavController.w(:557) 
        at androidx.navigation.NavController.v(:539) 
        at androidx.navigation.fragment.NavHostFragment.l0(:248) 
        at androidx.fragment.app.Fragment.M0(:2949) 
        at androidx.fragment.app.s.e(:475) 
        at androidx.fragment.app.s.m(:278) 
        at androidx.fragment.app.t.r(:112) 
        at androidx.fragment.app.m.G0(:1647) 
        at androidx.fragment.app.m.O(:3128) 
        at androidx.fragment.app.m.y(:3061) 
        at androidx.fragment.app.h.f(:240) 
        at androidx.fragment.app.e.onCreate(:276) 
        at android.app.Activity.performCreate(Activity.java:7825) 
        at android.app.Activity.performCreate(Activity.java:7814) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "jp.co.yumemi.android.code_check.item" on path: DexPathList[[zip file "/data/app/jp.co.yumemi.android.codecheck.release-jmN5-D-aVQFnwrBlTGNlUg==/base.apk"],nativeLibraryDirectories=[/data/app/jp.co.yumemi.android.codecheck.release-jmN5-D-aVQFnwrBlTGNlUg==/lib/arm64, /system/lib64, /product/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at java.lang.Class.classForName(Native Method) 
        at java.lang.Class.forName(Class.java:454) 
        at java.lang.Class.forName(Class.java:379) 
        at androidx.navigation.t.a(:169) 
        at androidx.navigation.r.e(:191) 
        at androidx.navigation.r.g(:155) 
        at androidx.navigation.r.b(:128) 
        at androidx.navigation.r.b(:141) 
        at androidx.navigation.r.c(:88) 
        at androidx.navigation.NavController.w(:557) 
        at androidx.navigation.NavController.v(:539) 
        at androidx.navigation.fragment.NavHostFragment.l0(:248) 
        at androidx.fragment.app.Fragment.M0(:2949) 
        at androidx.fragment.app.s.e(:475) 
        at androidx.fragment.app.s.m(:278) 
        at androidx.fragment.app.t.r(:112) 
        at androidx.fragment.app.m.G0(:1647) 
        at androidx.fragment.app.m.O(:3128) 
        at androidx.fragment.app.m.y(:3061) 
        at androidx.fragment.app.h.f(:240) 
        at androidx.fragment.app.e.onCreate(:276) 
        at android.app.Activity.performCreate(Activity.java:7825) 
        at android.app.Activity.performCreate(Activity.java:7814) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

ビルドエラーの対応

カスタム proguard に原因となっているクラスを保持するようにルールを記載した。

Path: app/proguard-rules.pro

# 通常ビルド時に発生した以下のエラー対応
# Caused by: java.lang.ClassNotFoundException: Didn't find class "jp.co.yumemi.android.code_check.item" on path: DexPathList[[zip file "/data/app/jp.co.yumemi.android.codecheck.release-jmN5-D-aVQFnwrBlTGNlUg==/base.apk"],nativeLibraryDirectories=[/data/app/jp.co.yumemi.android.codecheck.release-jmN5-D-aVQFnwrBlTGNlUg==/lib/arm64, /system/lib64, /product/lib64]]
# 背景: コードの圧縮時に該当クラスファイルが削除されてしまっていた可能性がある
# 参考資料: https://developer.android.com/studio/build/shrink-code#keep-code

-keep public class jp.co.yumemi.android.code_check.item

参考資料

Kotaro666-dev commented 1 year ago

本 issue の要件が達成できたため、issue をクローズします。