[英]App stops working with signed APK playstore version but does work from the compiled one from Android Studio
当我登录时间表页面时,从从android studio下载到我的手机的版本中,它可以正常工作,并将我带到时间表。 但是,当我尝试从Playstore下载的版本登录时间表页面时,它将永久加载。
那么,是否有可能通过查看控制台中的消息来测试从Play商店下载的版本? ( https://play.google.com/store/apps/details?id=com.gmail.gogobebe2.thedayahead )
这是完整的源代码: https : //github.com/gogobebe2/TheDayAhead
这是停滞不前的地方-登录按钮onclick侦听器:( https://github.com/gogobebe2/TheDayAhead/blob/master/app/src/main/java/com/gmail/gogobebe2/thedayahead/timetable /TimetableFragment.java#L192 ):
@SuppressLint({"AddJavascriptInterface", "SetJavaScriptEnabled"})
@Override
public void onClick(View view) {
if (view.getId() == R.id.login_button) {
if (kmarDocument == null) initKmarLoginConnection();
else {
EditText usernameEditText = (EditText) loginRelativeLayout.findViewById(R.id.editText_username);
EditText passwordEditText = (EditText) loginRelativeLayout.findViewById(R.id.editText_password);
updateLoginPreferences((CheckBox) loginRelativeLayout.findViewById(R.id.checkBox_rememberMe),
usernameEditText, passwordEditText);
WebView webView = new WebView(getContext());
webView.setVisibility(View.INVISIBLE);
webView.clearCache(true);
webView.clearHistory();
clearCookies(this);
webView.addJavascriptInterface(new HTMLRetrieverJavaScriptInterface(this), "HtmlRetriever");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onLoadResource(WebView webView, String destinationUrl) {
CheckBox rememberMeCheckbox = (CheckBox) loginRelativeLayout.findViewById(R.id.checkBox_rememberMe);
ProgressBar progressBar = (ProgressBar) loginRelativeLayout.findViewById(R.id.progressBar);
progressBar.setVisibility(View.VISIBLE);
rememberMeCheckbox.setVisibility(View.INVISIBLE);
super.onLoadResource(webView, destinationUrl);
}
@Override
public void onPageFinished(WebView webView, String urlLoaded) {
final String LOGIN_JAVASCRIPT = "javascript:document.getElementById(\"loginSubmit\").click()";
final String HTML_RETRIEVER_JAVASCRIPT = "javascript:window.HtmlRetriever.showHTML" +
"('<html>' + document.getElementsByTagName('html')[0].innerHTML + '</html>');";
if (urlLoaded.equals(KMAR_TIMETABLE_URL)) {
// debug: webView.setVisibility(View.VISIBLE);
webView.loadUrl(HTML_RETRIEVER_JAVASCRIPT);
} else if (!urlLoaded.equals(LOGIN_JAVASCRIPT)) {
webView.loadUrl(LOGIN_JAVASCRIPT);
}
}
});
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
loginRelativeLayout.addView(webView);
Element loginUsernameElement = kmarDocument.getElementById("loginUsername");
Element loginPasswordElement = kmarDocument.getElementById("loginPassword");
loginUsernameElement.attr("value", usernameEditText.getText().toString());
loginPasswordElement.attr("value", passwordEditText.getText().toString());
webView.loadData(kmarDocument.html(), "text/html", "UTF-8");
// I then call the click() function on the loginSubmit button when the page is finished
// loading in the overridden onPageFinished(WebView webView, String url) method.
}
}
}
这是proguard文件。 我不知道我是否做对了,但是我在其他类似于我的堆栈溢出问题中看到问题通常出在此。 ( https://github.com/gogobebe2/TheDayAhead/blob/master/app/proguard-rules.pro ):
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /home/william/Android/Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
-keepclassmembers class com.gmail.gogobebe2.thedayahead.timetable.TimetableFragment$HTMLRetrieverJavaScriptInterface {
public *;
}
这是JavascriptInterface( https://github.com/gogobebe2/TheDayAhead/blob/master/app/src/main/java/com/gmail/gogobebe2/thedayahead/timetable/TimetableFragment.java#L177 ):
public class HTMLRetrieverJavaScriptInterface {
TimetableFragment timetableFragment;
HTMLRetrieverJavaScriptInterface(TimetableFragment timetableFragment) {
super();
this.timetableFragment = timetableFragment;
}
@JavascriptInterface
void showHTML(String html) {
kmarTimetableHTML = html;
MainActivity.timetable = new Timetable(kmarTimetableHTML, timetableFragment);
}
}
编辑:在build.gradle
我将minifyEnabled
从false
更改为true
。 现在,从Play商店下载了一个,当我导航到时间表页面时,该应用程序完全崩溃了。 但是,如果我使用从android studio下载的软件,则可以正常工作。
解决了自己。
新的Javascript接口类:
@Keep
public class HTMLRetrieverJavaScriptInterface {
TimetableFragment timetableFragment;
public HTMLRetrieverJavaScriptInterface(TimetableFragment timetableFragment) {
super();
this.timetableFragment = timetableFragment;
}
@Keep
@JavascriptInterface
public void showHTML(String html) {
kmarTimetableHTML = html;
MainActivity.timetable = new Timetable(kmarTimetableHTML, timetableFragment);
}
}
新的保护文件:
-keepclassmembers class com.gmail.gogobebe2.thedayahead.timetable.TimetableFragment$HTMLRetrieverJavaScriptInterface {
public *;
}
-keepattributes JavascriptInterface
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.