質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

706閲覧

Android Studio)proguardが原因でRecyclerViewが表示されない

navesanta

総合スコア198

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/10/19 08:15

編集2017/10/19 08:20

Android studioを使って最初のActivityでRecyclerViewが表示されるアプリを作っています。
ほとんど完成してテスト用のビルドも実機テストも問題なくRecyclerViewが表示されました。

しかしApk化して端末に入れてテストすると最初のActivityで表示されるRecyclerViewが表示されないので
色々試してみたところproguardがtrueの時に表示されないことが分かりました。

proguardがいたずらしているみたいなので、ネットを色々調べてkeepするコードを設定してみましたが
やはり表示されません。ちなみにコード構造上に問題があるかと思い、Lintチェックをひと通りやって
Javaファイルは全部緑のチェックが入っている状態です。

質問は
1)どういった要因が考えられるでしょうか?
2)proguardのkeepしたものも下記に提示しますがこれ以外に抜けているものがあるでしょうか?
3)Apk化したものをログキャットの様にエラー確認したいのですが方法はあるでしょうか?
よろしくお願いします。

環境 os mac
開発環境 Android studio 2.2.3

build.gradle

buildTypes { debug { minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.google.firebase:firebase-ads:10.0.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.android.support:cardview-v7:25.3.1' compile 'com.android.support:design:25.3.1' compile 'com.google.code.gson:gson:2.2.4' compile 'com.android.support:support-v4:25.3.1' testCompile 'junit:junit:4.12' } apply plugin: 'com.google.gms.google-services'

proguard-rules.pro

-keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -optimizationpasses 5 -keep class !com.○○○○.** -keep class android.support.v7.widget.RecyclerView{ *; } -dontwarn android.support.design.** -keep class android.support.design.**{ *; } -keep public class android.support.design.R$*{ *; } -keep interface android.support.design.**{ *; } -keepattributes *Annotation*

KujiViewHolder.java

public class KujiViewHolder extends RecyclerView.ViewHolder { View base; TextView kujiContents; TextView kujiNumber; public KujiViewHolder(View v) { super(v); this.base = v; this.kujiContents = (TextView)v.findViewById(R.id.kujiContents); this.kujiNumber = (TextView)v.findViewById(R.id.kujiNumber); //文字数制限して1行にする this.kujiContents.setSingleLine(true); } }

KujiAdapter.java

public class KujiAdapter extends RecyclerView.Adapter<KujiViewHolder> { private ArrayList<DataType> arrayList; private int tabNumber; public KujiAdapter(ArrayList<DataType> arrayList, int tabNumber) { this.arrayList = arrayList; this.tabNumber = tabNumber; } @Override public KujiViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from( parent.getContext()).inflate(R.layout.card_layout, parent, false ); return new KujiViewHolder(view); } @Override public void onBindViewHolder(final KujiViewHolder holder, int listposition) { holder.kujiContents.setText(arrayList.get(listposition).getKuji_contents()); holder.kujiNumber.setText(arrayList.get(listposition).getKuji_number()); holder.base.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(holder.base.getContext(),ChangeActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("position",holder.getAdapterPosition()); intent.putExtra("tabnumber",tabNumber); intent.putExtra("hint1",arrayList.get(holder.getAdapterPosition()).getKuji_contents()); intent.putExtra("hint2",arrayList.get(holder.getAdapterPosition()).getKuji_number()); MyApplication.getmContext().startActivity(intent); } }); } @Override public int getItemCount() { return arrayList.size(); } }

MainActivity.java

public class MainActivity extends AppCompatActivity { private ArrayList<DataType> lot1Array; private ArrayList<DataType> arrayList; RecyclerView recyclerView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lot1Array = new ArrayList<>(); arrayList = new ArrayList<>(); String Lot1Name = PrefManager.loadString(getApplicationContext(),"lot1key", this.getString(R.string.loto1_button)); recyclerView = (RecyclerView) findViewById(R.id.cardList); recyclerView.setHasFixedSize(true); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); lot1Array = PrefManager.loadDataList(getApplicationContext(),"lot1Array"); //ArrayListの初期値設定して保存 if (lot1Array.isEmpty()){ initArray(lot1Array,"1等","2等"); arrayList = lot1Array; PrefManager.saveDataList(getApplicationContext(),"lot1Array", lot1Array); } //既にデータがあるので lot1Array = PrefManager.loadDataList(getApplicationContext(),"lot1Array"); IndicateArray(lot1Array, tabNumber); } //Arraylistを表示するメソッド public void IndicateArray(ArrayList<DataType> arrayList, int tabNumber){ RecyclerView.Adapter adapter = new KujiAdapter(arrayList,tabNumber); recyclerView.setAdapter(adapter); recyclerView.addItemDecoration(new DividerItemDecoration(this)); adapter.notifyDataSetChanged(); } //Arraylistを初期化するメソッド public void initArray(ArrayList<DataType> lotArray, String content1, String content2){ String[] contentData = { content1, content2 }; String[] numberData = { "1", "3" }; for (int i = 0; i < contentData.length ; i++){ String kuji_contents = contentData[i]; String kuji_number = numberData[i]; lotArray.add(new DataType( kuji_contents, kuji_number )); } } }

activityMain.xml

<android.support.v7.widget.RecyclerView android:id="@+id/cardList" android:layout_weight="100" android:layout_width="match_parent" android:layout_height="0dp" />

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1

まず、直接関係はないかもしれませんが、こちらの公式ドキュメントはお読みになられましたか?
自分も難読化を組み込んだことがありますが、useProguardのようなプロパティは今はないはずです。

minifyEnabled = trueの時点でproguardを有効にする設定ができています。

2

keepしているものですが、使用しているライブラリのgithubを覗きに行かなければいけません。
自分もaws関連の時にここで苦労した覚えがあります。
質問者様の場合だとgsonは個別の設定があります。こちらに載っています

3

Apkファイルをlogcatで確認する方法ですが、以下のようにdebuggable true を設定すると、apkファイルをダウンロードしたエミュレータもしくは実機をパソコンに繋げば、AndroidStudioのログで見ることができますよ。(とはいえ、難読化されているので解読は難しいと思いますが)

debug { minifyEnabled false debuggable true ...以下略 }

参考になればと思い、自分のプロガードファイルを載せておきます。

## For Reflection ## ここにリフレクションを使っている部分を記述しています。 ## See https://developer.android.com/guide/topics/resources/menu-resource.html, #actionViewClass. -keep class android.support.v7.widget.SearchView { *; } ## Local Warnings # Classes which are part of JavaRunTime but not AndroidRunTime # Java logging API -dontwarn org.slf4j.** -dontwarn jp.pickme.pickme.ui.board.community.diary.player.DiaryPlayerFragment$** ## Retrofit # https://github.com/square/retrofit -dontwarn okio.** -dontwarn javax.annotation.** ## gms -dontwarn com.google.android.gms.** -dontwarn com.appsflyer.GcmInstanceIdListener ## AWS # https://github.com/aws/aws-sdk-android/blob/master/Proguard.md # Class names are needed in reflection -keepnames class com.amazonaws.** -keepnames class com.amazon.** # Request handlers defined in request.handlers -keep class com.amazonaws.services.**.*Handler # The following are referenced but aren't required to run -dontwarn com.fasterxml.jackson.** -dontwarn org.apache.commons.logging.** # Android 6.0 release removes support for the Apache HTTP client -dontwarn org.apache.http.** # The SDK has several references of Apache HTTP client -dontwarn com.amazonaws.http.** -dontwarn com.amazonaws.metrics.** ## Glide # https://github.com/bumptech/glide#proguard -keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.AppGlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } ## Jackson # github.com/FasterXML/jackson-docs/wiki/JacksonOnAndroid -keep @com.fasterxml.jackson.annotation.JsonIgnoreProperties class * { *; } -keep class com.fasterxml.** { *; } -keep class org.codehaus.** { *; } -keepnames class com.fasterxml.jackson.** { *; } -keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility { public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; } ## Gson # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. # https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg -keepattributes Signature # For using GSON @Expose annotation -keepattributes *Annotation* # Gson specific classes -keep class sun.misc.Unsafe { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { *; } # Prevent proguard from stripping interface information from TypeAdapterFactory, # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer ## Rx # https://github.com/artem-zinnatullin/RxJavaProGuardRules/blob/master/rxjava-proguard-rules/proguard-rules.txt -dontwarn sun.misc.Unsafe -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { long producerNode; long consumerNode; }

投稿2017/10/19 11:56

編集2017/10/19 12:07
hiramekun

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

navesanta

2017/10/20 04:37

>まず、直接関係はないかもしれませんが、こちらの公式ドキュメントはお読みになられましたか? ネット検索で色々見ましたが公式ドキュメントを見るのを忘れていました。全部目を通して基本の部分の確認と知らない部分を参考にすることができました。助言ありがとうございます。 >自分も難読化を組み込んだことがありますが、useProguardのようなプロパティは今はないはずです。 >minifyEnabled = trueの時点でproguardを有効にする設定ができています。 useProguardは古いんですね。こちらもネットで探して設定していました。理解しました。
navesanta

2017/10/20 04:39

>keepしているものですが、使用しているライブラリのgithubを覗きに行かなければいけません。 >自分もaws関連の時にここで苦労した覚えがあります。 >質問者様の場合だとgsonは個別の設定があります。こちらに載っています。 gsonの設定もしましたがまだ表示されないままです。3で指摘受けたデバッグを試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問