2016-09-14 51 views
1

我的應用中的此活動未以發佈模式使用proguard-android-optimize配置啓動。該活動在調試和發佈配置方面均可正常啓動。由於錯誤只發生在proguard-android-optimize配置中,所以我無法從logcat中追蹤錯誤,因爲它重命名了所有的類。無法在發佈模式下啓動活動(使用proguard-android-optimize配置)

這是活動。 (檢查函數onCreateOptionsMenu())

import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.SearchView; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.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; 
} 

} 

這是我的build.gradle文件。

apply plugin: 'com.android.application' 

android { 
    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/android-sdk/tools/proguard/proguard-android-optimize.txt' 
     zipAlignEnabled true 
    } 
} 
productFlavors { 
    Pzy64Config { 
     proguardFile '/home/pz/bin/Android/android-sdk/tools/proguard/proguard-android-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.android.support:appcompat-v7:24.2.0' 
compile 'com.android.support:design:24.2.0' 
compile 'com.android.support:cardview-v7:24.2.0' 
compile 'com.android.support:recyclerview-v7:24.2.0' 
compile 'com.android.support:support-v4:24.2.0' 
compile 'com.google.firebase:firebase-ads:9.2.1' 
} 
apply plugin: 'com.google.gms.google-services' 

這裏是logcat的

 FATAL EXCEPTION: main 
    Process: package.name, PID: 14035 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.a()' on a null object reference 
    at pzy64.pocketmath.summary.SearchActivity.onCreateOptionsMenu(Unknown Source) 
    at android.app.Activity.onCreatePanelMenu(Activity.java:2866) 
    at android.support.v4.app.s.onCreatePanelMenu(Unknown Source) 
    at android.support.v7.view.n.onCreatePanelMenu(Unknown Source) 
    at android.support.v7.a.ai.onCreatePanelMenu(Unknown Source) 
    at android.support.v7.view.n.onCreatePanelMenu(Unknown Source) 
    at android.support.v7.a.bk.run(Unknown Source) 
    at android.os.Handler.handleCallback(Handler.java:815) 
    at android.os.Handler.dispatchMessage(Handler.java:104) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.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.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750) 
+0

爲什麼從proguardFiles中刪除'getDefaultProguardFile('proguard-android.txt')'?您可以使用逗號分隔多個文件。在開始時添加一個,然後添加你的 –

+0

所以我需要從gradle文件中刪除Pzt64Release部分,並添加版本而不是使用逗號分隔的文件列表的Pzy64Release。 – Pzy64

+0

這不是從proguard。該錯誤似乎來自proguard。只需編輯你的proguardFiles。保留簽名 –

回答

1

您需要使用默認的proguard的文件保留的Android類之類的活動,意見等從您的ProGuard任務被刪除。

對於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-rules.pro文件

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

還添加了-keep類android.support.v7。** {*; } -keep interface android.support.v7。** {*; }在proguard-rules.pro – Pzy64

+0

是否需要? – Pzy64

+0

我不確定是否默認文件保持。但最好保持它的安全:)你可以在互聯網上找到其他更好的文檔編寫的proguard.pro文件,例如'https://github.com/krschultz/android-proguard-snippets/tree/master/libraries' –