18 tháng 2, 2022
Bài viết này ghi lại một số kinh nghiệm cá nhân của tôi khi thử làm một ứng dụng Android siêu nhỏ cho bản thân tự sử dụng. Đây không phải lần đầu tiên tôi làm ứng dụng cho điện thoại Android, nhưng vì đã bỏ không đụng tới trong nhiều năm, nên giờ cũng như trải nghiệm lần đầu, đương nhiên là ít bỡ ngỡ hơn những người chưa có kinh nghiệm nào.
Lưu ý: Đây không phải là bài viết với mục đích hướng dẫn mọi người nên trong bài tôi có sử dụng nhiều từ ngữ chuyên môn. Bạn sẽ cảm thấy chán khi đọc, nếu bạn chưa có nền tảng nào về những vấn đề này.
Lưu ý do tôi không cài Unity thông qua Unity Hub, nên khi muốn build app cho android phải tự tải thêm một số phần còn thiếu. Để build được android app, Unity yêu cầu trên máy của chúng ta phải có JDK, Android SDK, Android NDK, Gradle. Từ phiên bản 2019 trở đi, Unity đã dùng Gradle để quản lý cấu trúc cho các ứng dụng Android. Cái Gradle này khá lung tung, vì mỗi phiên bản của nó sẽ tương thích tốt nhất với một phiên bản JDK tương ứng. Bạn sẽ biết được các yêu cầu này khi bấm build Android app, Unity sẽ kêu bạn thêm vào các thứ còn thiếu trong Preferences/External Tools. Sau khi phát hiện mình còn thiếu nhiều thứ cần thiết, tôi làm theo các bước dưới đây.
Bước đầu tiên là tải JDK phù hợp, tôi dùng bản 1.8, có sẵn trên máy vì các bản mới hơn phần JRE đã nằm chung trong JDK, thay đổi này làm cho Unity không tự nhận biết được vị trí của JRE của JDK mới. Tôi đang sử dụng version Unity 2020.3.28f1 khi build ứng dụng android này, tôi không chắc đây là vấn để của Unity hay là do các thiết lập trong máy của mình. Nhưng để xử lý khá tốn thời gian, nên tôi quyết định dùng JDK 1.8 để mọi chuyện bớt phức tạp. Nhìn chung, đôi khi đội ngũ phát triển engine Unity cũng còn bỏ sót nhiều thứ lắm, càng sống lâu với nghề mới thấy là không chỉ dev ta mới “chuối”, mà dev tây cũng “chuối” không kém gì, điểm khác biệt là số lượng “chuối” của mỗi bên nhiều hơn hay ít hơn thôi.
Bước hai là tải Android SDK, trước đây trên website của android developer cho phép chúng ta tải riêng phiên bản mà mình muốn, nhưng từ khi Android Studio xuất hiện thì tùy chọn đó không còn hiện diện trên website của họ nữa. Nên chúng ta sẽ tải Android Studio về và mở ứng dụng quản lý SDK trong cái IDE này. Cũng đã khá lâu tôi không làm việc với các ứng dụng di động như android hay iOS, nhưng cảm nhận về trải nghiệm của tôi đối với Android Studio là tương đối dễ dàng. Giao diện thân thiện, dù tôi không code dòng nào trong IDE này nhưng các ứng dụng hỗ trợ quản lý SDK và Devices rất trực quan. Khi “Make Project” có hỗ trợ download những package còn thiếu hoặc version phù hợp với thiết lập của project. IDE này còn có tính năng cho phép chạy Debug ứng dụng trên thiết bị thật qua kết nối Wifi sử dụng QR Code hoặc Pair Code, trước đây khi muốn chạy trên thiết bị thật tôi phải cắm USB và dùng công cụ ADB để cài file APK lên. Tính năng rất hay tuy nhiên khi tôi thử sử dụng, thì không kết nối được với điện thoại mình đang dùng, có thể do khi build ứng dụng gặp vấn đề, hoặc nó là lỗi của IDE.
Bước ba là tải NDK, ta cũng dùng SDK Manager trong Android Studio để tải về phiên bản phù hợp. Khi mở nó lên, ta chuyển sang tab Build Tools, và check vào tùy chọn “Show obsoletes file”, để nó hiển thị những phiên bản NDK cũ. Do Unity nó hoạt động với một số phiên bản cũ đó. Khi chọn được phiên bản phù hợp thì bấm tải về. Một trong những lý do tôi không thích các nền tảng mobile như Android hay iOS là vì chúng có quá nhiều phiên bản khác nhau. Riêng về Android thì lại đòi hỏi đủ thứ thư viện khác nhau, rồi mỗi một version của chúng lại lệ thuộc vào một version nào đó của các package khác. Đây là điểm cực kỳ phiền toái đối với các lập trình viên phát triển ứng dụng cho điện thoại, bạn sẽ khá đau đầu khi phải tìm kiếm các gói thư viện và phiên bản phù hợp cho project của mình. Cho nên, lâu lâu tôi đổi gió thử làm cho vui, chứ khá ngán mấy thứ linh tinh này.
Bước bốn là tải Gradle theo chỉ dẫn trong tài liệu của Unity. Sau đó bấm buid project và tôi gặp cái lỗi “Gradle failed”. Thông báo lỗi của Unity khá đơn giản, và dò trong một tá dòng lỗi từ Trace Stack cũng chẳng giúp được gì. Tôi thử export project Unity sang project android và mở lên bằng Android Studio. Sau khi build thử thì gặp cái thông báo cụ thể hơn là cái “build-tools 32.0.0 corrupted”, tức là cái lỗi này nằm trong đống tool của Android SDK, thử cài lại tới lui mà không hết, thử các version khác của Gradle cũng không đi tới đâu.
Cuối cùng phải nhờ thánh Google trợ giúp thì biết được thực chất là có một file trong folder build-tools/32.0.0 của Android SDK bị sai tên, cụ thể là file r8.exe và r8.bat, cách khắc phục là sửa tên hai file này thành rx.exe và rx.bat. Theo suy đoán cá nhân của tôi thì có ông dev nào đó trong team SDK của Google trong lúc bị deadline dí đã viết sai tên của tập tin, hoặc nếu không phải vậy thì lỗi là do ông dev của team phát triển engine Unity. Nói chung chỉ một trong hai ông này là người gây ra lỗi. Hy vọng trong tương lai các thứ linh tinh này được sửa, cho các lập trình viên mobile bớt khổ.
Cái bước này quá quen với các lập trình viên mobile, nhưng lại có nhiều điểm mới mẻ đối với tôi. Do tôi đã bỏ một thời gian dài không đụng đến các ứng dụng di động nữa. Sau khi đăng nhập vào lại Play Console thì thấy giao diện hoàn toàn mới, các app cũ ngày xưa làm đã bị Google xóa hết vì lâu rồi không cập nhật cho theo kịp các phiên bản mới của Android. Đây cũng là một điểm tôi ghét khi phải làm việc với các nền tảng di động. Bạn sẽ tốn cả đống thời gian để chạy theo đuôi các hãng lớn khi họ nâng cấp hệ điều hành hay là sửa đổi chính sách, kiểm duyệt các ứng dụng. Nếu bạn có một đội ngũ đông người làm chung, chuyện này không thành vấn đề, nhưng nếu bạn chỉ có một mình thì nó sẽ tốn rất nhiều năng lượng và thời gian của bạn cho những việc linh tinh thay vì dùng khoảng thời gian đó để chăm chút nội dung sản phẩm.
Sau khi dành thời gian để tự than phiền thì tôi cũng vẫn phải làm theo một số bước được hướng dẫn bởi Play Console, bao gồm nhập các thông tin cần thiết về nội dung của ứng dụng, chụp cắt một số hình ảnh để đưa lên, làm đánh giá độ tuổi của người dùng mà ứng dụng hướng tới, rồi phải làm một cái nội dung về chính sách bảo mật đối với các dữ liệu mà ứng dụn sẽ thu thập, mặc dù app của tôi không thu thập dữ liệu nào của người dùng. Nhưng nếu không điền bất cứ loại dữ liệu nào, thì bạn không thể hoàn thành bước này được, nên buộc lòng tôi phải chọn một loại dữ liệu vô hại nhất là địa chỉ email. Đôi khi muốn làm người tốt cũng khá khó, vì cái nền tảng này nó không cho mình lựa chọn khác.
Tiếp theo là upload ứng dụng lên store. Định dạng yêu cầu không còn là APK như xưa nữa, mà thay vào đó là AAB. Tức là khi dùng Unity để build ta phải chọn vô mục Bundle nữa. Nhưng vậy cũng chưa đủ, vì mặc định Scripting Backend trong Project Setting là Mono, nên ứng dụng build ra chỉ hỗ trợ kiến trúc ARMv7 (32 bit). Tôi phải upload lại vài lần mới biết hết được các yêu cầu đối với một ứng dụng Android là phải hỗ trợ các OS 32bit và 64bit, để làm được vậy thì phải chỉnh Scripting Backend sang IL2CPP, rồi chọn thêm ARM64. Lưu ý thêm là nếu lỡ upload lên mà sai, lần upload sau nhớ tăng cái code version lên, nếu không muốn phải tốn thời gian build lại. Nói chung là cũng có quá nhiều thứ linh tinh, lặt vặt không đáng có phải ghi nhớ.
Cuối cùng là chọn kiểu publish (phát hành), nó có vài kiểu như phát hành cho nội bộ kiểm tra, alpha testing dành cho nội bộ hoặc open testing dành cho một số người bên ngoài nào đó thử nghiệm. Cho dù chọn kiểu nào thì cũng phải chờ đội ngũ của Google thẩm định lại trong vòng bảy ngày cho mỗi lần cập nhật, một khoảng thời gian khá lâu. Theo như tôi biết được, Google dành nhiều thời gian để xem xét là do có quá nhiều ứng dụng rác được đưa lên store của họ mỗi ngày, trong đó có nhiều ứng dụng có chứa nguy cơ gây hại cho người dùng.
Đây là những gì tôi trải qua, và viết lại các kinh nghiệm trong lúc chờ đội ngũ Google duyệt cho ứng dụng được thử nghiệm.
22 tháng 2, 2022
Trong nhiều năm làm mọt sách, tôi có đọc được một số sách chịu sự ảnh hưởng từ Đạo Đức Kinh của Lão Tử, ví dụ như phương pháp trồng trọt tự nhiên trong “Cuộc cách mạng một cọng rơm” hay “Gieo mầm trên sa mạc” của tác giả Masanobu Fukuoka. Tôi đã cảm thấy rất hứng thú với phương pháp của tác giả cũng như triết lý của ông. Từ đó tôi tìm hiểu thêm về Lão Tử và biết tới Đạo Đức Kinh. Bản Đạo Đức Kinh đầu tiên tôi được đọc là một bản tiếng Anh trên một website, sau đó tôi mua được ở tiệm sách Barnes & Noble một cuốn Tao-Te-Ching.
Đạo Đức Kinh trong tiếng Anh có tên là “Tao-Te-Ching” hay “Dao-De-Jing” là những điều Lão Tử (Lao Tzu) rút ra được từ việc chiêm nghiệm Kinh Dịch (I-Ching) và để lại cho người đời sau cách suy nghĩ và ứng xử trong đời sống con người sao cho hòa hợp với tự nhiên vũ trụ. Từ những tìm hiểu này khiến tôi tò mò muốn hiểu thêm về Kinh Dịch.
Bên Tây Phương có nhiều học giả đã nghiên cứu triết học phương Đông và những thứ liên quan đến Kinh Dịch từ khá lâu. Ngược lại, triết học trong nước thời hậu giải phóng được dạy cho học sinh, sinh viên rất nghèo nàn và bị xem nhẹ cũng như các môn lịch sử hay văn hóa, nghệ thuật khác. Tuy nhiên gần đây, chúng ta may mắn có thể tìm được nhiều sách hay về các chủ đề triết học, đặc biệt là Kinh Dịch.
Sách về Kinh Dịch trước đây có nhiều, nhưng không phù hợp với những ai muốn học hỏi hay tìm hiểu triết lý của nó, vì đa phần chúng mang hơi hướng mê tín và khó hiểu do các tác giả cố tình sử dụng các thuật ngữ phức tạp. Gần đây có nhiều sách bàn về Kinh Dịch theo hướng khoa học và triết học xuất hiện nhiều, được trình bày với những phần giải thích đơn giản, rõ ràng và dễ hiểu hơn. Phần lớn sách này là của các học giả thời trước năm 1975. Nhờ có những cuốn sách này mà tôi cũng đã học hỏi được phần căn bản của Kinh Dịch. Sự tò mò là động lực lớn khiến tôi tìm hiểu vấn đề này, do cảm thấy chủ đề này gần gũi với bản thân.
Tôi tìm hiểu Kinh Dịch không phải để biết trước tương lai hay quá khứ, mà để rút ra các triết lý và khái niệm để suy ngẫm và áp dụng vào đời sống công việc hiện tại. Kinh Dịch có tổng cộng 64 quẻ, mỗi quẻ có phần luận giải khá dài, ta khó có thể nhớ hết được. Vì vậy sách luận giải Kinh Dịch không phải là sách để đọc hết một lượt như các sách thông thường. Hôm nào muốn đọc, tôi lại gieo một quẻ và tìm phần luận giải trong sách để đọc.
Để gieo một quẻ bạn phải cần một đồng xu, hoặc cái gì đó có 2 mặt, như vậy cũng hơi phiền phức nên tôi làm một ứng dụng đơn giản hỗ trợ gieo quẻ và tra tên quẻ để bản thân sử dụng. Bản nháp của ứng dụng tôi làm cách đây hơn một năm, chỉ chạy được trên máy tính. Sau một thời gian dài bận rộn làm game Hogvalord, tôi có một khoảng thời gian rảnh rỗi hơn nên thử nâng cấp phần hình ảnh và bỏ lên điện thoại cho tiện sử dụng. Trong ứng dụng tôi chỉ làm hai chức năng mình dùng nhiều nhất, chưa biết sau này có thêm gì nữa không. Những phần giải thích ý nghĩa dựa theo sách đã có quá nhiều ứng dụng khác làm rồi, nên tôi không đưa vào trong ứng dụng của mình, bạn có thể mua sách đọc hoặc tìm thầy giải thích nếu muốn biết thêm.
Trong quá trình làm ứng dụng này tôi cũng đã gặp một số vấn đề như đã chia sẻ ở bài phía trên. Sau một khoảng thời gian chờ đợi, Google đã bật chế độ cho thử nghiệm ứng dụng ở giai đoạn Early Access. Các bạn nào muốn thử nghiệm ứng dụng này thì tải về cho điện thoại Android theo liên kết này hoặc bấm vào đây nếu đang dùng trình duyệt web.