この非常に小さな Cordova + AngularJS アプリは、Android 4.2.2 を実行している Galaxy S4 で実行すると終了します (「ああ、クラッシュしました。ここから出ました!」というような方法で)。テストした他のすべてのデバイスで問題なく動作します。たとえば、Android 4.1.2 を実行している Galaxy Note II では問題ありません。
www ディレクトリのものは、S4/Android 4.2.2 デバイスのブラウザーを含むブラウザーでも正常に動作します。
したがって、このコードが次の場合にのみバグが発生するようです。
- Cordova アプリとして実行する
- Android 4.2.2 を実行している Galaxy S4 の場合
動作を複製する手順
- レポをクローンする
- Cordova を使用して Android 実行可能ファイルを作成します。コマンドライン ツールと
cordova
Android SDK がインストールされている場合:cordova platform add android
cordova build
- 生成された APK を取得し、Android 4.2.2 を実行している Galaxy S4 にインストールします。所有していない場合は、http://developer.samsung.com/remotetestlabで無料でテストできます。
- アプリを起動します。
- アプリのメイン画面でテキストをタップします。
- 数秒待つと、アプリが終了します。
私がテストした他のすべてのものでは、予想される動作であるカラー リストのコンテンツが読み込まれます。
つまり、私の質問は次のとおりです。これを修正してクラッシュしないようにするにはどうすればよいですか? または、これをデバッグするにはどうすればよいですか?
関連コード
これらのファイルはすべてリポジトリにありますが、クリックしたくない場合は、次のようにします。
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Galaxy S4 + Android 4.2.2 + Cordova Crash</title>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
</head>
<body>
<div id="ng-app" data-ng-app="main">
<!-- Begin Templates -->
<script type="text/ng-template" id="main">
<a ng-click="showList()">On Galaxy S4, touch here, wait a few seconds, and the app will crash.</a>
</script>
<script type="text/ng-template" id="list">
<progress data-ng-show="loading"></progress>
<ol data-ng-hide="loading">
<li data-ng-repeat="color in colors">
{{color.name}}
</li>
</ol>
</script>
<!-- End Templates -->
<div data-ng-view=""></div>
</div>
<script src="js/angular.js"></script>
<script src="js/angular-mobile.js"></script>
<script src="js/modules/main.js"></script>
<script src="js/modules/list.js"></script>
</body>
</html>
main.js
(function () {
'use strict';
angular.module('main', ['ngMobile','list'])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/', {templateUrl: 'main', controller: 'mainController'})
.otherwise({redirectTo: '/'});
}]).
controller('mainController', ['$scope', '$location', function ($scope, $location) {
$scope.showList = function () {
$location.path('/list');
};
}]);
}());
list.js
(function () {
'use strict';
angular.module('list', [])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/list', {templateUrl: 'list', controller: 'listController'});
}])
.controller(
'listController',
['$scope', '$timeout', function ($scope, $timeout) {
$scope.loading = true;
var callback = function () {
$scope.loading = false;
$scope.colors = [
{name: 'Almost Blue'},
{name: 'Kind Of Blue'},
{name: 'Totally Not Blue'}
];
};
// Using $timeout to sort of fake an XHR just to rule out XHR as a cause
$timeout(callback, 500);
}]
);
}());
ログ
これは、少なくともhttp://developer.samsung.com/remotetestlabを使用している場合、Android ログに表示されます。
ERROR|10-19 03:39:49.448|6938|6938||CallbackProxy|UPDATE_URL
ASSERT|10-19 03:39:49.493|6938|6953||libc|Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 6953 (WebViewCoreThre)
その他の注意事項
Cordova 3.1.0 で試してみました。また、コミット 28c41294bba746c75beae0ab26a42c8412cc665aの cordova-android リポジトリからコンパイルされた cordova-3.2.0-dev.jar で試してみました(2013 年 10 月 20 日現在の master への最新のコミットは今日です)。動作に変更はありません。アプリは引き続き予期せず終了します。