2011-11-10 29 views
7

Theo thời gian dự án Android của chúng tôi đã mở rộng rất nhiều và những ngày này chúng tôi đang tạo nhiều APK thương hiệu từ cùng một cây nguồn. Điều này đã trở thành thách thức do các yêu cầu đặt tên gói của Android.Làm thế nào để giải quyết các thuộc tính tùy chỉnh của Thư viện Android và ánh xạ lại tên gói trong khi xây dựng?

Chúng tôi có tất cả mã được chia sẻ của chúng tôi trong dự án Thư viện Android, được bao gồm trong dự án ứng dụng chính. Ngoài ra, chúng tôi có 'lớp phủ' của thư viện Android cho các tài nguyên có thương hiệu được áp dụng cho từng thương hiệu. Khi chúng tôi muốn xây dựng thương hiệu, chúng tôi bao gồm một vài thuộc tính bổ sung cho thương hiệu đó, bao gồm cả thư viện Android 'phủ' trước mã chia sẻ chính của Thư viện Android. Để minh họa:

AppProject 
    Include: BrandALibrary or BrandBLibrary 
    Include: SharedLibrary 

SharedLibrary 
-> src/.. 
-> res/.. 
BrandALibrary 
-> res/.. 
BrandBLibrary 
-> res/.. 

'BrandALibrary hoặc BrandBLibrary' được chuyển đổi theo thời gian xây dựng, bằng cách bao gồm tệp .properties tại thời gian xây dựng bằng cách sử dụng công tắc dòng lệnh. Không có gì quá lạ mắt ở đó. Kịch bản lệnh xây dựng cũng phải thay đổi tên gói của .APK tại thời gian xây dựng sao cho hai tệp .APK có thể cùng tồn tại trên một thiết bị nhất định (chủ yếu cho mục đích QA, vì chúng tôi không mong đợi khách hàng có cả hai đồng thời ... mặc dù họ có thể).

Mọi thứ đang hoạt động rất tốt cho đến khi phiên bản của chúng tôi bị hỏng hôm nay sau khi thêm lớp vào dự án thư viện mã được chia sẻ của chúng tôi. Trong nhìn xung quanh vì một lý do tại sao điều này ocurring tôi stumbled khi trang web sau đây, nơi mà các đồng nghiệp đã gặp phải vấn đề tương tự và đã cố định phiên bản của ông aapt để làm cho công việc này:

http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml-attributes-part-2/

Trong xây dựng của chúng tôi , các lỗi sau đây được thể hiện trong các bản ghi:

-pre-build: 

-code-gen: 
    [echo] ---------- 
    [echo] Handling aidl files... 
    [aidl] No aidl files to compile. 
    [echo] ---------- 
    [echo] Handling RenderScript files... 
[renderscript] No renderscript files to compile. 
    [echo] ---------- 
    [echo] Handling Resources... 
    [aapt] Found Deleted Target File 
    [aapt] Generating resource IDs... 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\layout\fancy_layout.xml:22: error: No resource identifier found for attribute 'state_add' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\layout\fancy_layout.xml:22: error: No resource identifier found for attribute 'state_list' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:4: error: No resource identifier found for attribute 'state_add' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:4: error: No resource 
identifier found for attribute 'state_list' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:5: error: No resource 
identifier found for attribute 'state_add' in package 'com.myapp' 
    [aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector_button_selector.xml:5: error: No resource identifier found for attribute 'state_list' in package 'com.myapp' 

BUILD FAILED 
C:\android-sdk\tools\ant\build.xml:539: The following error occurred while executing this line: 
C:\android-sdk\tools\ant\build.xml:568: null returned: 1 

thuộc tính tùy chỉnh của tôi là không có gì ngoạn mục, tôi đã có một state_add, và state_list định nghĩa mà tôi có thể sử dụng để thiết lập các trạng thái mặc định cho một điều khiển mà hiển thị một nút với biểu tượng cho biết trạng thái nào sẽ được hiển thị. Nó giống như nút 'chuyển đổi' theo cách nào đó và thay vào đó tôi có thể thay thế điều khiển này bằng nút bật tắt.

Tôi đã theo dõi this tutorial khi tôi tạo nút này.

Câu hỏi của tôi là, cuối cùng (anh chàng này có gió dài phải không?), Có cách nào để đảm bảo rằng aapt sẽ 'remap' tên gói được sử dụng trong thuộc tính tùy chỉnh hay không. Nếu tôi thậm chí còn muốn viết thêm điều khiển tùy chỉnh vào thư viện của chúng tôi, chúng tôi sẽ cần appt để có thể làm như sau:

  • Nếu một namespace tùy chỉnh được định nghĩa trong dự án thư viện, remap namespace đó để không gian tên của ứng dụng android đang được xây dựng.

Tôi có thiếu cái gì cơ bản với cách các thuộc tính tùy chỉnh được ánh xạ trong bản dựng Ant không? Có điều gì đơn giản mà tôi có thể làm để khắc phục sự cố xây dựng của mình không?

+0

Được biết vấn đề. Đây là trạng thái lỗi: http://code.google.com/p/android/issues/detail?id=9656 Gắn dấu sao. Chúng tôi sẽ sửa chữa nhanh hơn. :-) –

+0

Cảm ơn Andrzej. Tôi đã làm như vậy. Trong khi chờ đợi, tôi đã gỡ bỏ mã mà tôi đã sử dụng để làm điều này và đã giải quyết trên chỉ bằng cách sử dụng một ToggleButton và thao tác trạng thái được kiểm tra của nó một cách thích hợp trong mã để có được hiệu ứng tương tự.Thật buồn khi một cái gì đó như thế này không hoạt động bởi vì chính khuôn khổ đó đã đánh bại khả năng. –

Trả lời

19

Điều này was solved.

Ví dụ:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" > 
... 
+0

Điều này đã giúp ích rất nhiều. Cảm ơn! –

+3

Một bài viết tham khảo hay khác: Trường hợp Thư viện Android và các thuộc tính xml tùy chỉnh (phần 2) http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml -nhóm-phần-2 / – Noah