Proguardの設定について

734 views
Skip to first unread message

kke...@gmail.com

unread,
Jan 30, 2019, 8:18:51 AM1/30/19
to 日本Androidの会
Proguardの警告、及び、エラーにより、プロジェクトのビルドができず困っています。
簡単な開発環境の概要は
Android studio 3.2.1
Gradle version:4.10.1
です。
-keepでandroid.support.v4を指定しても、
「Warning: androidx.media.AudioAttributesCompatParcelizer: can't find referenced field 'android.support.v4.media.AudioAttributesImpl mImpl' in program class android.support.v4.media.AudioAttributesCompat」
とワーニングが出てしまい、かと言って
-dontwarnでandroid.support.v4を指定しても、
「java.lang.ArrayIndexOutOfBoundsException」
とエラーが出てしまいます。
このワーニングの場合、どのクラスをkeepするよう指定すれば良いのでしょうか?
どなたか、お助けください。
build_gradle_project.txt
build_gradle_app.txt
proguard_rules_pro.txt

Hirokazu Fukami

unread,
Jan 30, 2019, 9:13:33 AM1/30/19
to android-g...@googlegroups.com
こんばんはfkmです

> androidx.media
と出ているので、gradle.propertiesに
android.enableJetifier=true
が書かれており、support.v4とかのサポートライブラリ時代のパッケージ名が
androidxに書き換えられているように見えます。

ここにマイグレーションガイドがあるので、参考になれば。
https://developer.android.com/jetpack/androidx/migrate
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
> https://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

kke...@gmail.com

unread,
Jan 30, 2019, 8:37:46 PM1/30/19
to 日本Androidの会

深見 様 お忙しいところご助言ありがとうございます。 
月末で忙しい為、すぐに詳しく確認、試すことができませんが、
近いうちに試し、再度、試行錯誤の結果を投稿させて頂きます。
(Androidxへの移行の関係なのでね。)

Monxarat

unread,
Jan 30, 2019, 8:57:11 PM1/30/19
to android-g...@googlegroups.com
おはようございます。
チンです。
Proguardファイルのなかで以下のコンフィグレーションを試してください。

-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-dontwarn android.support.**
また
-libraryjars /android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment


2019年1月31日(木) 10:38 <kke...@gmail.com>:
--

kke...@gmail.com

unread,
Jan 30, 2019, 11:59:42 PM1/30/19
to 日本Androidの会

チン様、お忙しいところご助言頂き、ありがとうございます。
残念ながらError while dexing.となり、
「Caused by: java.lang.ArrayIndexOutOfBoundsException」
のエラーが出てしまいます。

私の環境では意図して、深見様の指摘されていた、Androidxへの移行(こうすると移行される旨の作業は意図して行っていません。)はしていない為、
これが問題になるのでしょうか?
問題のアプリの他にもアプリを作成している為、他のアプリへの影響が気になり気が重いです。

Monxarat

unread,
Jan 31, 2019, 11:11:32 PM1/31/19
to android-g...@googlegroups.com

Androidxへの移行すれば。
まずAndroid StudioのなかでRefactorのMigrate to Androidx...を選んで、プロセズ終わったら、gradle.propertiesで以下のコンフィグレーションを追加します。

android.enableJetifier=true
android.useAndroidX=true

build.gradle(app level)

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        applicationId "com.vizo.beforeafter"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 10
        versionName '1.0'
       
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    // gradle.buildに以下の設定を追加してください
    // APKファイルを抽出しらた、このPathを見ることができます
    packagingOptions {
        exclude 'META-INF/proguard/androidx-annotations.pro'
    }
    ...
}
dependencies {
    ....
    // Android support libs
    implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01'
    implementation 'androidx.exifinterface:exifinterface:1.0.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.vectordrawable:vectordrawable:1.1.0-alpha01'
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
    implementation 'androidx.multidex:multidex:2.0.0'
    ....
    }

私のプロジェクトは問題ないです。


2019年1月31日(木) 14:00 <kke...@gmail.com>:

kke...@gmail.com

unread,
Feb 1, 2019, 1:14:21 AM2/1/19
to 日本Androidの会

Androidxへの移行を行い、invalidate cashesを行った上でBuildしましたが、
やはり、
「Caused by: java.lang.ArrayIndexOutOfBoundsException」
のエラーが出てしまいます。

う~ん、困ってしまいました。

errlog.txt

Monxarat

unread,
Feb 1, 2019, 2:04:13 AM2/1/19
to android-g...@googlegroups.com
エラーメッセージからデバッグするため、以下の方法でより多くのログを見ることができます
Mac: 
Android Studioなかで:
"Preference" (on the ubuntu -> File/Settings)
"Build, Execution, Deployment"
"Compiler"
Add "--stacktrace" to "Command-line Options"

そしてプロジェクトをリビルドして。 ログを参照してください。

kke...@gmail.com

unread,
Feb 1, 2019, 8:40:40 AM2/1/19
to 日本Androidの会
チン様のご指摘した方法でBuildのログを取ってみました。
やり方が合っているのかわかりませんが、とりあえず投稿してみます。
errlog.txt

Monxarat

unread,
Feb 3, 2019, 10:15:16 AM2/3/19
to android-g...@googlegroups.com

返事遅くなってすみません。

ビルドが失敗するのは、Androidが64kメソッドしか持っていないという制限によるものです。
これはDalvikの実行可能ファイルの仕様の制限によるものです。

Multidexを使用するためのアプリの設定を有効にして64 k制限を回避することができます。
minSdkVersionを21 以上に設定している場合は、次に示すように、モジュール レベルの build.gradle 
ファイルでmultiDexEnabledtrueに設定するだけです。

android {
    defaultConfig {
        ...
        minSdkVersion 21
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

build.gradle ファイルを変更して Multidex を有効にし、Multidex ライブラリを依存関係として追加します。

android {
    defaultConfig {
        ...
        minSdkVersion 15
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.3'
}

Application クラスをオーバーライドする場合、次のように MultiDexApplication を拡張するように変更します(可能な場合)。
public class MyApplication extends MultiDexApplication { ... }

Application クラスをオーバーライドする場合で、基本クラスを変更できない場合は、attachBaseContext() メソッドをオーバーライドして MultiDex.install(this) を呼び出すことで Multidex を有効にできます。

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

なお
ProGuardを使用してjarファイルを縮小することで、不要なメソッドやAPIを取り除くことができます。
ProGuardに関する詳細情報はこちら
https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html

ProGuardを統合してandroidビルドの一部としてjarファイルを縮小する方法です。
https://developer.android.com/studio/build/shrink-code


日本語ではっきり説明でしなかったのですみません。



2019年2月1日(金) 22:41 <kke...@gmail.com>:
チン様のご指摘した方法でBuildのログを取ってみました。
やり方が合っているのかわかりませんが、とりあえず投稿してみます。

kke...@gmail.com

unread,
Feb 4, 2019, 1:32:17 AM2/4/19
to 日本Androidの会
チン様 お忙しいところありがとうございます。
残念ながらMultidexに対応させたのですが、やはり、
「Caused by: java.lang.ArrayIndexOutOfBoundsException」
のエラーが出てしまいます。

困ってしまいました。
ちなみに64K越えの場合、proguardを掛けても掛けなくてもBuildでエラーになるのではないかと思うのですが、
(Proguardを掛けなければBuildは成功します。)何か違う原因があるのでしょうか?

build_gradle_project.txt
build_gradle_app.txt
proguard_rules_pro.txt
errlog.txt

kke...@gmail.com

unread,
Feb 4, 2019, 3:22:06 AM2/4/19
to 日本Androidの会
解決しました。
※本当は解決していません。なぜならBuildのログを見て、明確にここでエラーになっているから、
こう直そうとして解決したわけではないからです。

チン様 深見様、貴重なお時間を割いて頂き、本当にありがとうございました。

とりあえず、途方に暮れていたのですが、Buildのログに--debugを入れてみたらという旨の
ことが書いてあったので、チン様に教えて頂いた方法で
Compiler Command-line Optionsに対し、--stacktrace --debugを
設定し、Buildしたのですが、
Proguardの設定上、
-keep public class com.google.android.gms.ads.** {public *;}
としているにもかかわらず、ログ上に
「com.google.android.gms.ads」以外のクラスの記述があったので、
おかしいなと思いました。

運の悪いことに警告無視は(これがいちばんの自分のミスであると思います。)
-dontwarn com.google.android.gms.**
としていた為、警告無視のレベルと合わせ、
-keep public class com.google.android.gms.** {*;}
としてBuildしてみたところ、Buildが完了しました。

そういえば、dependencies上の
implementation 'com.google.android.gms:play-services-base:等のバージョンを
最新に変更したのでその関係かもしれませんが、
結果的には「com.google.android.gms」関連の難読化除外の設定ミスであったということでした。
皆様には、お騒がせしてしまいお恥ずかしい限りです。
貴重なお時間を割いて頂き、本当にありがとうございました。

もう少し、Buildエラーのログについて、原因に直接たどり着けるような記載はできないのだろうかと
八つ当たり的なことを考えてしましました。(皆さんにとっては、おいおいそんなナンセンスなといったところでしょうが…)
素人的には非常に苦しんだエラーでした。
Reply all
Reply to author
Forward
0 new messages