В вашем журнале я вижу две основные причины, вызвавшие сбои.
W/cr_CrashFileManager:
/data/user/0/com.gochronicle.chronicle/cache/WebView/Crash Reports does not
exist or is not a directory
I/Choreographer: Skipped 46 frames! The application may be doing too much
work on its main thread.
Первая ошибка могла быть связана с appCachePath, который занимал время для обработки из-за неправильного пути.
Более поздняя ошибка связана с тем, что вашему коду / веб-просмотру требуется много времени для обработки, а фреймы пропускаются из-за этого. Возможно, из-за какой-то тяжелой обработки, которую вы выполняете в основе вашего приложения, что вызывает нить остановится на некоторое время.
Решением было бы использовать отдельный поток от основного потока пользовательского интерфейса, для которого вы можете использовать AsyncTask в Android.
В вашем случае асинхронная задача может не потребоваться, если ошибка произошла из-за того, что каталог не найден для appCachePath.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
FrameLayout.LayoutParams rl = new
FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
android.webkit.WebView wView = new
android.webkit.WebView(this.getContext());
wView.setId(0x100);
//wView.setWebChromeClient(new WebChromeClient());
wView.setWebViewClient(new WebViewClient());
wView.getSettings().setJavaScriptEnabled(true);
wView.getSettings().setAllowFileAccess(true);
wView.getSettings().setAllowUniversalAccessFromFileURLs(true);
wView.getSettings().setAllowContentAccess(true);
wView.getSettings().setAppCacheEnabled(true);
//also check this line of code for appCachePath
String appCachePath = this.getCacheDir().getAbsolutePath();
webSettings.setAppCachePath(appCachePath);
wView.setScrollContainer(false);
wView.setLayoutParams(rl);
//execute asynctTask
new LoadWebViewAsync.execute();
}
class LoadWebViewAsync extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
wView.loadUrl(linktourl);
return null;
}
};
Как уже упоминалось в других ответах, вам сначала необходимо приобрести сертификат, подходящий для подписи кода. Это будет стоить несколько сотен долларов, а не тысячи. Когда я недавно обновил сертификат моей компании в Globalsign , было также проведено расследование, чтобы проверить, была ли компания законной - поскольку я использовал номер мобильного телефона для процесса регистрации, они хотели получить письмо от бухгалтера компании, чтобы проверить что мы настоящий бизнес.
Чтобы подписать исполняемый файл, я использую задачу MSBuild. Вот выдержка из соответствующих частей:
<!--
Installer files that need to be signed.
-->
<ItemGroup>
<InstallerSignedFiles Include="$(BuildRoot)path\to\myinstaller.msi"/>
<InstallerSignedFiles Include="$(BuildRoot)path\to\setup.exe"/>
</ItemGroup>
<Target Name="ReleasePackaging">
<!-- Sign the files we're going to release -->
<SignTool
CertificateStoreName="My"
CertificateSubjectName="MyCompany"
Description="My application description"
TimestampServerUrl="http://timestamp.verisign.com/scripts/timstamp.dll"
TargetFiles="@(InstallerSignedFiles)"
/>
</Target>
Чтобы это работало, как указано выше, вам необходимо установить сертификат в хранилище личных сертификатов (см. CertificateStoreName="My"
в приведенном выше примере). На веб-сайте Globalsign эта установка была автоматической частью процесса загрузки сертификата. Примечание: я обнаружил, что это помогает использовать Internet Explorer при загрузке сертификата, поскольку он интегрирован с хранилищем сертификатов Windows. Как только он окажется в хранилище сертификатов на загрузочном компьютере, вы можете экспортировать его в виде файла pfx , перенести на свой компьютер сборки и импортировать на него. Если вы все же экспортируете его, я бы посоветовал вам защитить экспортированный файл паролем на случай, если он попадет в чужие руки.
Когда вы используете задачу SignTool MSBuild, как описано выше, она считывает сертификаты из личного хранилища («Мое»), связанного с текущей учетной записью пользователя Windows. Это означает, что вы можете контролировать, кто может подписывать код с вашим сертификатом, что является хорошей вещью. Вы должны импортировать сертификат только в личный магазин разработчиков, которым вы доверяете.
Хорошая идея использовать сервер отметок времени при подписании кода, чтобы вам не нужно было переподписывать код после истечения срока действия сертификата.
Вам понадобится утилита командной строки для подписи кода от Microsoft.
А затем:
signtool.exe sign /v /f "MyCertificate.pfx" -t "http://timestamp.verisign.com/scripts/timstamp.dll" "MyApp.exe"
или альтернативно
signcode.exe -a "sha1" -spc "MySoftwarePublishingCertificate.spc" -v "MyPrivateKeyFile.pvk" -t "http://timestamp.verisign.com/scripts/timstamp.dll" "MyApp.exe"
Вы можете прочитать Код подписи и проверки с помощью Authenticode .
Я никого здесь не рекламирую, но попробуйте VeriSign . Они предлагают Подписание кода , что вы и ищете.