有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法在发布模式下启动活动(使用proguard安卓optimize配置)

我的应用程序中的此活动不是在proguard 安卓优化配置的发布模式下启动的。通过调试和发布配置,活动可以正常启动。由于错误只发生在proguard 安卓优化配置中,我无法从logcat跟踪错误,因为它重命名了所有类

这里是活动。(检查函数onCreateOptions菜单())

import 安卓.app.ProgressDialog;
import 安卓.os.AsyncTask;
import 安卓.os.Bundle;
import 安卓.support.v7.app.AppCompatActivity;
import 安卓.support.v7.widget.LinearLayoutManager;
import 安卓.support.v7.widget.RecyclerView;
import 安卓.support.v7.widget.SearchView;
import 安卓.support.v7.widget.Toolbar;
import 安卓.view.Menu;
import 安卓.view.MenuItem;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import package.name.CardInfo;
import package.name.CardViewAdapter;
import package.name.DataStore;
import package.name.R;

public class SearchActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
    List<CardInfo> list;
    ArrayList<String> wrds;
    LinearLayoutManager ll;
    CardViewAdapter adapter;
    RecyclerView rv;
    List<CardInfo> all;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    Toolbar tb = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(tb);
    list = new ArrayList<>();
    rv = (RecyclerView) findViewById(R.id.rv);
    new LoadData().execute();
}

class LoadData extends AsyncTask<Void, Void, Void> {
    List<CardInfo> a;
    ProgressDialog pd;
    DataStore ds;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ds = new DataStore(SearchActivity.this);
        pd = new ProgressDialog(SearchActivity.this);
        pd.setMessage("Loading ..");
        pd.setIndeterminate(true);
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setCanceledOnTouchOutside(false);
        pd.show();
        a = new ArrayList<>();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        pd.dismiss();
        all = a;
    }

    @Override
    protected Void doInBackground(Void... params) {
        ds.open();
        a = ds.getData();
        ds.close();
        Thread t = new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    Thread.sleep(2000);
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        };
        t.start();
        return null;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // I believe problem is residing somewhere here in this function


    getMenuInflater().inflate(R.menu.search_activity_menu, menu);
    SearchView sv = (SearchView) menu.findItem(R.id.search_x).getActionView();
    ll = new LinearLayoutManager(getBaseContext());
    sv.onActionViewExpanded();
    sv.setOnQueryTextListener(this);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {
    if (newText.length() >= 1) {
        filter(newText);
        rv.setLayoutManager(ll);
        adapter = new CardViewAdapter(getSupportFragmentManager(), list);
        rv.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
    return true;
}

void filter(String qry) {
    list.clear();
    wrds = getWords(qry);
    for (CardInfo i : all) {
        for (String query : wrds) {
            if (i.getAmount().toLowerCase().contains(query.toLowerCase()) ||
                    i.getAction().toLowerCase().contains(query.toLowerCase()) ||
                    i.getPurpose().toLowerCase().contains(query.toLowerCase()) ||
                    i.getDesc().toLowerCase().contains(query.toLowerCase()) ||
                    i.getYear().toLowerCase().contains(query.toLowerCase()) ||
                    i.getMonth().toLowerCase().contains(query.toLowerCase()) ||
                    i.getStore().toLowerCase().contains(query.toLowerCase()) ||
                    i.getDay().toLowerCase().contains(query.toLowerCase())

                    ) {
                if (!list.contains(i))
                    list.add(i);
            }
        }
    }
}


static ArrayList<String> getWords(String msg) {
    ArrayList<String> arr = new ArrayList<>();
    Pattern pattern = Pattern.compile("(\\S+)");
    Matcher matcher = pattern.matcher(msg);
    while (matcher.find()) {
        arr.add(matcher.group());
    }
    return arr;
}

}

这是我的身材。格雷德尔档案

apply plugin: 'com.安卓.application'

安卓 {
    signingConfigs {
        Pzy64Signing {
            keyAlias 'xxxx'
            keyPassword 'xxxxxxxx'
            storeFile file('/home/pz/bin/Android/keyStore/PzyKeystore.jks')
            storePassword 'xxxxxxxx'
        }
   }
compileSdkVersion 24
buildToolsVersion "24.0.2"

defaultConfig {
    applicationId "package.name"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 9
    versionName "9.0"
}
buildTypes {
    Pzt64Release {
        signingConfig signingConfigs.Pzy64Signing
        minifyEnabled true
        pseudoLocalesEnabled true
        proguardFile '/home/pz/bin/Android/安卓-sdk/tools/proguard/proguard-安卓-optimize.txt'
        zipAlignEnabled true
    }
}
productFlavors {
    Pzy64Config {
        proguardFile '/home/pz/bin/Android/安卓-sdk/tools/proguard/proguard-安卓-optimize.txt'
        signingConfig signingConfigs.Pzy64Signing
        versionCode 9
        versionName '9.0'
        minSdkVersion 15
        applicationId 'package.name'
        targetSdkVersion 24
    }
}
dexOptions {
    incremental true
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.安卓.support:appcompat-v7:24.2.0'
compile 'com.安卓.support:design:24.2.0'
compile 'com.安卓.support:cardview-v7:24.2.0'
compile 'com.安卓.support:recyclerview-v7:24.2.0'
compile 'com.安卓.support:support-v4:24.2.0'
compile 'com.google.firebase:firebase-ads:9.2.1'
}
apply plugin: 'com.google.gms.google-services'

这是航海日志

        FATAL EXCEPTION: main
    Process: package.name, PID: 14035
    java.lang.NullPointerException: Attempt to invoke virtual method 'void 安卓.support.v7.widget.SearchView.a()' on a null object reference
    at pzy64.pocketmath.summary.SearchActivity.onCreateOptionsMenu(Unknown Source)
    at 安卓.app.Activity.onCreatePanelMenu(Activity.java:2866)
    at 安卓.support.v4.app.s.onCreatePanelMenu(Unknown Source)
    at 安卓.support.v7.view.n.onCreatePanelMenu(Unknown Source)
    at 安卓.support.v7.a.ai.onCreatePanelMenu(Unknown Source)
    at 安卓.support.v7.view.n.onCreatePanelMenu(Unknown Source)
    at 安卓.support.v7.a.bk.run(Unknown Source)
    at 安卓.os.Handler.handleCallback(Handler.java:815)
    at 安卓.os.Handler.dispatchMessage(Handler.java:104)
    at 安卓.os.Looper.loop(Looper.java:194)
    at 安卓.app.ActivityThread.main(ActivityThread.java:5550)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:750)

共 (1) 个答案

  1. # 1 楼答案

    您需要使用默认的proguard文件来防止proguard任务删除活动、视图等Android类

    为此,Android提供了一个名为getDefaultProguardFile('proguard-android.txt')的方法,您应该在所有项目中使用它,除非您想自己管理这些异常

    如果使用proguardFiles而不是proguardFile,则可以使用多个文件

    proguardFiles getDefaultProguardFile('proguard-android.txt'),'/home/pz/bin‌​/Android/android-sdk‌​/tools/proguard/prog‌​uard-android-optimiz‌​e.txt', 'proguard-rules.pro'

    还要将这些行添加到proguard规则中。专业文件

    -keep class android.support.v7.widget.** { *; }
    -keep interface android.support.v7.widget.** { *; }