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 楼答案
您需要使用默认的proguard文件来防止proguard任务删除活动、视图等Android类
为此,Android提供了一个名为
getDefaultProguardFile('proguard-android.txt')
的方法,您应该在所有项目中使用它,除非您想自己管理这些异常如果使用
proguardFiles
而不是proguardFile
,则可以使用多个文件proguardFiles getDefaultProguardFile('proguard-android.txt'),'/home/pz/bin/Android/android-sdk/tools/proguard/proguard-android-optimize.txt', 'proguard-rules.pro'
还要将这些行添加到proguard规则中。专业文件