2015-10-05 13 views
35

Tôi hiện đang làm việc trên một dự án Cordova và có vấn đề là 8 đã được nối một cách bí ẩn vào versionCode của dự án của tôi. Ví dụ: Mã phiên bản gốc của tôi là 100, Mã phiên bản mới của tôi là 1008Tại sao Cordova/Phonegap nối thêm 8 vào Mã phiên bản Android của tôi?

Tôi đã theo dõi vấn đề thông qua toàn bộ đường dẫn xây dựng và tìm mã có trách nhiệm trong tập lệnh Gradle Build.

if (Boolean.valueOf(cdvBuildMultipleApks)) { 
    productFlavors { 
     armv7 { 
      versionCode cdvVersionCode ?: defaultConfig.versionCode + 2 
      ndk { 
       abiFilters "armeabi-v7a", "" 
      } 
     } 
     x86 { 
      versionCode cdvVersionCode ?: defaultConfig.versionCode + 4 
      ndk { 
       abiFilters "x86", "" 
      } 
     } 
     all { 
      ndk { 
       abiFilters "all", "" 
      } 
     } 
    } 
} else if (!cdvVersionCode) { 
    def minSdkVersion = cdvMinSdkVersion ?: privateHelpers.extractIntFromManifest("minSdkVersion") 
    // Vary versionCode by the two most common API levels: 
    // 14 is ICS, which is the lowest API level for many apps. 
    // 20 is Lollipop, which is the lowest API level for the updatable system webview. 
    if (minSdkVersion >= 20) { 
    defaultConfig.versionCode += 9 
    } else if (minSdkVersion >= 14) { 
    defaultConfig.versionCode += 8 
    } 
} 

Tôi không chắc chắn lý do tại sao cordova nghĩ rằng nó là đúng phải thay đổi mã phiên bản của tôi, và thêm vào đó, tôi không chắc chắn nếu hành vi này là đúng ... should not nó thêm số lượng và không thêm nó?

Tôi có thể chỉ xóa phần tương ứng trong build.gradle hoặc có một số ý nghĩa ẩn đằng sau hành vi này không?

Trả lời

21

O.K. có vẻ như đây là một lỗi lớn chưa được giải quyết trong Cordova phiên bản 5 trở lên. Here is the link to the ticket.

Tôi không có vấn đề khi loại bỏ các mã vi phạm từ build.gradle tôi

+0

Điều này thật tuyệt. Tôi nghĩ rằng tôi đã phạm sai lầm, nó vẫn còn trong 6.0.0 –

+0

Có vẻ như sửa chữa đã được [sáp nhập gần đây] (https://github.com/apache/cordova-android/pull/270) để cordova-android gần đây nhưng chưa phát hành (cordova-android 5.1.1 không có bản sửa lỗi) –

+6

Điều này dường như được khắc phục trong Cordova 6.2.0. Tuy nhiên, giờ đây, chữ số phụ không được thêm vào mã phiên bản nữa, APK mà tôi tạo bằng phiên bản Cordova này luôn có mã phiên bản nhỏ hơn so với các phiên bản trước và do đó google play không chấp nhận các APK này. – Ehsan

7

Các nền tảng \ android \ build.gradle kịch bản sẽ bổ sung thêm 4, 2, 8 hoặc 9 đến tập tin phiên bản phụ thuộc vào architecure nhắm mục tiêu - arm/x86 hoặc phiên bản api được nhắm mục tiêu của android.

Tôi đã gặp phải tình huống trong đó dự án của tôi có số "8" được thêm vào số phiên bản và điều này đã được tải lên cửa hàng Play. Các bản dựng tiếp theo dường như đã giảm 8, điều đó có nghĩa là tôi không thể tải lên các bản cập nhật thêm - lệnh cordova prepare tạo lại tệp AndroidManifest.xml, ghi đè các thay đổi thủ công đối với tệp này.

Vấn đề phiên bản có thể được giải quyết bằng cách tạo ra một nền tảng \ gradle.properties \ android nộp với những nội dung cdvVersionCode=13008

Ngoài ra, trong trường hợp của tôi, tôi chèn thuộc tính một android-mã phiên bản vào config.xml:

<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="uk.co.my.app" android-versionCode="103008" version="1.3.0" xmlns="http://www.w3.org/ns/widgets" defaultlocale="en-GB"> 

Phiên bản Android mong muốn, trong trường hợp 103008 của tôi sau đó được ghi chính xác vào tệp AndroidManifest.xml được sử dụng cho bản dựng.

Nhược điểm là phải tự cập nhật phiên bản Android, ngược lại, có thể tải lên apk!

+0

Tôi thích đặt cdvVersionCode ở gradle.properties, nếu không có cách tự động. –

5

Đối với những người muốn giữ kết thúc '8', tôi đã viết một móc after_prepare để làm cho nó dễ dàng, không cần phải duy trì android-versionCode trong config.xml theo cách thủ công được đề cập bởi @ChilledFlame.

Lưu ý: nếu bạn không giữ kết thúc '8', khi bạn gửi ứng dụng của mình đến appstore, mã phiên bản Android của bạn nhỏ hơn trước đó được xây dựng bởi Cordova 5, bạn có thể gặp phải "vấn đề hạ cấp mã phiên bản".

tạo tệp theo thư mục hooks/after_prepare/, thêm mã sau đây.

#!/usr/bin/env node 

var path = require('path'); 
var fs = require('fs'); 
var xml2js = require('xml2js'); 

function xmlFileToJs(filename, cb) { 
    var filepath = path.normalize(path.join(__dirname, filename)); 
    fs.readFile(filepath, 'utf8', function (err, xmlStr) { 
     if (err) throw (err); 
     xml2js.parseString(xmlStr, {}, cb); 
    }); 
} 

function jsToXmlFile(filename, obj, cb) { 
    var filepath = path.normalize(path.join(__dirname, filename)); 
    var builder = new xml2js.Builder(); 
    var xml = builder.buildObject(obj); 
    fs.writeFile(filepath, xml, cb); 
} 

var androidManifestRPath = '../../platforms/android/AndroidManifest.xml'; 
xmlFileToJs(androidManifestRPath, function(error, data) { 
    var config = data; 
    config.manifest.$['android:versionCode'] += '8'; 
    jsToXmlFile(androidManifestRPath, config) 
}); 

hoặc tải về từ liên kết này: append_8_to_version_code.js

+0

cảm ơn vì móc. Bạn có thể cho tôi biết làm thế nào tôi có thể thêm nó vào xây dựng của tôi. Tôi vẫn đang đối mặt với cùng một vấn đề. Bạn đã tìm thấy giải pháp nào khác chưa? – krv

+0

tạo tệp này trong dự án của bạn: hooks/after_prepare/append_8_to_version_code.js. @krv – Leon

+0

Tôi nhớ hiểu rằng tôi muốn loại bỏ 8. Tại sao 8 được thêm vào và tại sao bất cứ ai muốn giữ nó cho người mà bạn đã viết bài này? – krv

0

Sau khi loại bỏ những thay đổi mã phiên bản từ ./platforms/android/build.gradle, một "8" vẫn đang được nối vào mã phiên bản trong APK của tôi.

Cần phải "lau sạch dây" trước khi APK mới được tạo sẽ có mã phiên bản chính xác trong đó.

Các vấn đề liên quan