마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

proguard 적용시 parcel 에러 질문입니다

0 추천

05-12 15:14:57.646: E/Parcel(3715): Class not found when unmarshalling: kr.re.nfrdi.db.AreaInfo
05-12 15:14:57.646: E/Parcel(3715): java.lang.ClassNotFoundException: kr.re.nfrdi.db.AreaInfo
05-12 15:14:57.646: E/Parcel(3715):     at java.lang.Class.classForName(Native Method)
05-12 15:14:57.646: E/Parcel(3715):     at java.lang.Class.forName(Class.java:400)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.Parcel.readParcelableCreator(Parcel.java:2517)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.Parcel.readParcelable(Parcel.java:2471)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.Parcel.readValue(Parcel.java:2374)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.Parcel.readArrayMapInternal(Parcel.java:2727)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.BaseBundle.unparcel(BaseBundle.java:269)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.BaseBundle.getString(BaseBundle.java:992)
05-12 15:14:57.646: E/Parcel(3715):     at android.content.Intent.getStringExtra(Intent.java:6702)
05-12 15:14:57.646: E/Parcel(3715):     at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:336)
05-12 15:14:57.646: E/Parcel(3715):     at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1097)
05-12 15:14:57.646: E/Parcel(3715):     at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5767)
05-12 15:14:57.646: E/Parcel(3715):     at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5572)
05-12 15:14:57.646: E/Parcel(3715):     at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:176)
05-12 15:14:57.646: E/Parcel(3715):     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3573)
05-12 15:14:57.646: E/Parcel(3715):     at android.os.Binder.execTransact(Binder.java:573)
05-12 15:14:57.646: E/Parcel(3715): Caused by: java.lang.ClassNotFoundException: kr.re.nfrdi.db.AreaInfo
05-12 15:14:57.646: E/Parcel(3715):     at java.lang.Class.classForName(Native Method)
05-12 15:14:57.646: E/Parcel(3715):     at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
05-12 15:14:57.646: E/Parcel(3715):     at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
05-12 15:14:57.646: E/Parcel(3715):     at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
05-12 15:14:57.646: E/Parcel(3715):     ... 16 more
05-12 15:14:57.646: E/Parcel(3715): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

 

AreaInfo.java

package kr.re.nfrdi.search;

import java.io.IOException;

import kr.co.rinasoft.support.utils.TypefaceFactory;
import kr.re.nfrdi.db.AreaInfo;
import kr.re.nfrdi.db.DBmanager;
import kr.re.nfrdi.temperature.MainActivity;
import kr.re.nfrdi.temperature.PageFragment;
import kr.re.nfrdi.temperature.R;
import kr.re.nfrdi.temperature.TemperatureImageDialogFragment;
import kr.re.nfrdi.util.FavAlertFactory;
import kr.re.nfrdi.util.Fonts;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;


public class AreaActivity extends SherlockFragmentActivity {

    public static final String EXTRA_AREA_INFO = "EXTRA_AREA_INFO";
    public static final String EXTRA_CODE = "EXTRA_CODE";

    private Button imageBt;
    private AreaInfo mAreaInfo;
    private String mCode;

    private OnFavClicked mOnFavClicked = new OnFavClicked();

    private DBmanager mDb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_area);

        try{
            mDb = new DBmanager(this);
        } catch (IOException e){
            System.out.println("io예외");
        }

        Intent intent = getIntent();
        if (intent != null){
            mAreaInfo = intent.getParcelableExtra(EXTRA_AREA_INFO);
            mCode = intent.getStringExtra(EXTRA_CODE);
            if (mCode == null && mAreaInfo != null){
                mCode = mAreaInfo.getCode();
            }
        }

        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.navi_color)));
        if (mAreaInfo != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        int actionBarTitle = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
        TextView actionBarTitleView = (TextView) getWindow().findViewById(actionBarTitle);
        actionBarTitleView.setTypeface(TypefaceFactory.getTypeFace(this, Fonts.NANUM_B));

        imageBt = (Button) findViewById(R.id.imageButton);
        imageBt.setTypeface(TypefaceFactory.getTypeFace(this, Fonts.NANUM_B));
        imageBt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                TemperatureImageDialogFragment dialog = new TemperatureImageDialogFragment();
                dialog.show(getSupportFragmentManager(), TemperatureImageDialogFragment.TAG);
            }
        });

        PageFragment page = PageFragment.create(0, 0, mCode);
        FragmentTransaction t = getSupportFragmentManager().beginTransaction();
        t.replace(R.id.container, page);
        t.commit();
        page.startPage();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (mAreaInfo != null){
            getSupportMenuInflater().inflate(R.menu.search_menu, menu);
            menu.findItem(R.id.action_fav).setIcon(mAreaInfo.isFavorite() ? R.drawable.search_fav_on : R.drawable.search_fav_off);
        }
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home){
            finish();
            return true;
        } else if (id == R.id.action_home){
            Intent intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            finish();
            return true;
        } else if (id == R.id.action_fav){
            FavAlertFactory.settingFavorite(this, mDb, mAreaInfo, mOnFavClicked);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private final class OnFavClicked implements DialogInterface.OnClickListener {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            setResult(RESULT_OK);
            finish();
        }
    }
}

 

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

proguard-project.txt 이런식으로 작성되어있고 구글검색해서 다른식으로 다바꿔봐도 같은 에러만뜹니다

어제랑오늘 하루종일 proguard 적용만 하고있는데 너무힘듭니다ㅜㅜ 

도움 부탁드립니다.

 

함번해보자 (140 포인트) 님이 2017년 5월 12일 질문

1개의 답변

0 추천
아래와 같이 AreaInfo 클래스 자체를 프로가드 안하게 해 보세요.

-keep public class kr.re.nfrdi.db.AreaInfo {
 *;
}
익명사용자 님이 2017년 5월 12일 답변
해봤는데 안되네요ㅜㅜ 경로전체에 keep걸어봐도 변함이없네요
답변감사합니다
해결했습니다 다른부분들을 -keep public 으로 하니까 잘되네요ㅜㅜ
주요소스 대부분을 -keep해놓아서 제대로 된건지는 모르겠지만...
아무튼 감사합니다
해결된건 다행인데, 전부 keep하면 프로가드 걸 이유가 없는데요. 디컴파일 해 보시는 걸 추천합니다.
...