我想减小应用程序的大小,因此我在发布模式下使用minifyenabled true
,但由于此应用程序崩溃。下面是我的
Build.Gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
// replace with the current version of the Android plugin
classpath 'com.android.tools.build:gradle:1.1.0'
// the latest version of the android-apt plugin
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apt {
arguments {
androidManifestFile variant.outputs[0].processResources.manifestFile
resourcePackageName android.defaultConfig.applicationId
}
}
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.iifl.news.codereduce"
minSdkVersion 10
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.+'
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.jakewharton:butterknife:5.0.+'
compile 'com.jakewharton.timber:timber:2.2.+'
compile 'com.squareup.dagger:dagger:1.2.+'
provided 'com.squareup.dagger:dagger-compiler:1.2.+'
apt 'com.squareup.dagger:dagger-compiler:1.2.2'
compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
compile 'com.squareup.retrofit:retrofit:1.6.1'
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+'
compile 'com.github.satyan:sugar:1.3'
compile 'com.pnikosis:materialish-progress:1.2'
compile 'com.android.support:cardview-v7:21.0.3'
compile 'com.google.android.gms:play-services-analytics:7.0.0'
compile files('libs/volley.jar')
}
我添加了proguard-rules.pro。如果我移除它,它会给我多个警告。
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class okhttp.** { *; }
-dontwarn okhttp.**
-keep class retrofit.** { *; }
-dontwarn retrofit.**
-keep class okio.** { *; }
-dontwarn okio.**
-keep class dagger.** { *; }
-dontwarn dagger.**
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
-dontwarn okio.**
-dontwarn com.squareup.okhttp.internal.huc.JavaApiConverter$CacheHttpURLConnection
-dontwarn com.squareup.okhttp.internal.huc.HttpURLConnectionImpl
我的清单是这样的:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iifl.news.codereduce" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<application
android:name=".app.IIFLApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".activities.SplashActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activities.BaseActivity"
android:label="@string/title_activity_iiflbase"
android:screenOrientation="portrait" >
</activity>
</application>
</manifest>
public class IIFLApplication extends Application {
private ObjectGraph applicationGraph;
private Tracker tracker;
private static final String PROPERTY_ID = "UA-61984632-2";
public static int GENERAL_TRACKER = 0;
public enum TrackerName {
APP_TRACKER, GLOBAL_TRACKER, ECOMMERCE_TRACKER,
}
public HashMap mTrackers = new HashMap();
@Override
public void onCreate() {
super.onCreate();
/*if (BuildConfig.DEBUG) {
Timber.plant(new DebugTree());
} else {
//Timber.plant(new CrashlyticsTree());
}*/
//create object graph
applicationGraph = ObjectGraph.create(getModules().toArray());
applicationGraph.inject(this);
}
private List<Object> getModules() {
return Arrays.<Object>asList(new AppModule(this));
}
public ObjectGraph getApplicationGraph() {
return this.applicationGraph;
}
/**
* A tree which logs important information for crash reporting.
*/
private static class CrashlyticsTree extends Timber.HollowTree {
@Override
public void v(String message, Object... args) {
logMessage(message, args);
}
@Override
public void v(Throwable t, String message, Object... args) {
logMessage(message, args);
// NOTE: We are explicitly not sending the exception to Crashlytics here.
}
@Override
public void i(String message, Object... args) {
logMessage(message, args);
}
@Override
public void i(Throwable t, String message, Object... args) {
logMessage(message, args);
// NOTE: We are explicitly not sending the exception to Crashlytics here.
}
@Override
public void w(String message, Object... args) {
logMessage("WARN: " + message, args);
}
@Override
public void w(Throwable t, String message, Object... args) {
logMessage("WARN: " + message, args);
// NOTE: We are explicitly not sending the exception to Crashlytics here.
}
@Override
public void e(String message, Object... args) {
logMessage("ERROR: " + message, args);
}
@Override
public void e(Throwable t, String message, Object... args) {
logMessage("ERROR: " + message, args);
//Crashlytics.logException(t);
}
private void logMessage(String message, Object... args) {
//Crashlytics.log(String.format(message, args));
}
}
public synchronized Tracker getTracker(TrackerName appTracker) {
if (!mTrackers.containsKey(appTracker)) {
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
Tracker t = (appTracker == TrackerName.APP_TRACKER) ? analytics.newTracker(PROPERTY_ID) : (appTracker == TrackerName.GLOBAL_TRACKER) ? analytics.newTracker(R.xml.global_tracker) : analytics.newTracker(R.xml.ecommerce_tracker);
mTrackers.put(appTracker, t);
}
return (Tracker) mTrackers.get(appTracker);
}
}
05-22 15:15:43.067 3158-3158/com.iifl.news.codereduce E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.iifl.news.codereduce, PID: 3158
java.lang.RuntimeException: Unable to create application com.iifl.news.codereduce.app.IIFLApplication: java.lang.IllegalStateException: Module adapter for class com.iifl.news.codereduce.a.b could not be loaded. Please ensure that code generation was run for this module.
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4521)
at android.app.ActivityThread.access$1500(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1339)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
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:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.IllegalStateException: Module adapter for class com.iifl.news.codereduce.a.b could not be loaded. Please ensure that code generation was run for this module.
at dagger.internal.FailoverLoader$1.create(Unknown Source)
at dagger.internal.FailoverLoader$1.create(Unknown Source)
at dagger.internal.Memoizer.get(Unknown Source)
at dagger.internal.FailoverLoader.getModuleAdapter(Unknown Source)
at dagger.internal.Modules.loadModules(Unknown Source)
at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(Unknown Source)
at dagger.ObjectGraph$DaggerObjectGraph.access$000(Unknown Source)
at dagger.ObjectGraph.create(Unknown Source)
at com.iifl.news.codereduce.app.IIFLApplication.onCreate(Unknown Source)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)
at
我也尝试过使用-keep class com.iifl.news.codereduce.{*;}-dontwarn com.iifl.news.codereduce.**
,但它仍然在发布模式下崩溃,在调试模式下运行良好。
我还尝试在依赖项中添加androidtestapt'com.squareup.dagger:dagger-compiler:1.2.2'
。但没有运气
我也有同样的问题。问题是proguard在应用程序启动时删除了未使用的类方法,但应用程序稍后可能需要这些类方法,例如当您切换到其他活动或退出应用程序时,这时应用程序崩溃了。您需要将minifyEnabled属性更改为false,以永久保留未使用的方法。但仍然可以在发布期间使用shrink属性收缩所有文件。缩量可能提振APP业绩。
release {
minifyEnabled false //keeps unused methods instead of removing them
shrinkResources true //to shrink files
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
我是编程新手,正在尝试制作一款android应用程序。最近几天我在使用调试器时遇到了麻烦。该应用程序在正常运行模式下工作正常。应用程序连接到firebase,所有数据都保存在那里。如果我尝试以学生身份在调试模式下登录,应用程序将立即崩溃。如果我以教授的身份登录,我会进入主页,但如果我单击“下一步”按钮,我会返回到登录页面,它会变为运行模式。我真的不知道问题出在哪里,但调试器和firebase有什么
我有一个应用程序,现在我要发布它。我已经创建了一个apk文件,并且安装了它,但是当我向服务器发送登录请求时,它返回NULL。 奇怪的是,当我用调试构建启动应用程序时,它工作得很好。该问题仅发生在释放模式。所以看了这篇文章后我认为问题出在proguard 这是我目前所做的。 null 这是我的proguard-rules.pro文件。
这是LOGCAT日志
我有应用程序上传在玩商店。它在调试模式下运行良好,但当我从play store下载相同的APK(发布模式)时,它就崩溃了。我无法确定堆栈跟踪没有给出准确的错误位置。 java.lang.RuntimeException:在Android.os.AsyncTask$3上完成(asynctask.java:318)在java.util.concurrent.FutureTask.FinishCompl