44import os
55import sys
66
7- # Đồng bộ kiểu dữ liệu mảng [list] để không bị lỗi rã chữ cái khi dùng join()
8- # Đã điều chỉnh key không có dấu "/" ở đầu để khớp hoàn chỉnh với cấu trúc sinh ra từ scan_dir
7+ # Key không có dấu "/" ở đầu để khớp hoàn chỉnh với cấu trúc sinh ra từ scan_dir
98fix_permission = {
109 "vendor/bin/hw/android.hardware.wifi@1.0" : ["u:object_r:hal_wifi_default_exec:s0" ],
1110 "system/bin/init" : ["u:object_r:init_exec:s0" ],
@@ -41,33 +40,27 @@ def scan_context(file) -> tuple:
4140def scan_dir (folder ) -> list :
4241 """
4342 Quét thư mục thực tế và chuyển đổi sang định dạng path chuẩn của Android.
44- HỖ TRỢ DYNAMIC PARTITIONS: Tự động đưa tên thư mục tạm về tên phân vùng chuẩn .
43+ HỖ TRỢ DYNAMIC PARTITIONS.
4544 """
46- # Lấy tên thư mục gốc (giữ nguyên hoa/thường để tránh lỗi phân vùng tùy biến)
47- folder_name_raw = os .path .basename (os .path .normpath (folder ))
48- folder_name = folder_name_raw .lower ()
49-
50- # Mặc định là tên thư mục gốc ban đầu nếu không nhận diện được phân vùng chuẩn
51- part_name = folder_name_raw
52- for partition in ['vendor' , 'product' , 'system_ext' , 'odm' , 'system' ]:
53- if partition in folder_name :
54- part_name = partition
55- break
45+ folder_abs = os .path .abspath (folder ).replace ('\\ ' , '/' )
46+ part_name = os .path .basename (os .path .normpath (folder ))
5647
57- # Xây dựng các root path chuẩn (SELinux của Android thường viết dạng /vendor hay /vendor/.*)
48+ # Xây dựng các root path chuẩn
5849 allfiles = ['/' , f'/{ part_name } /lost+found' , f'/{ part_name } ' , f'/{ part_name } /' ]
5950
6051 for root , dirs , files in os .walk (folder , topdown = True ):
52+ # Chuẩn hóa root path hiện tại về dạng gạch chéo xuôi
53+ root_clean = os .path .abspath (root ).replace ('\\ ' , '/' )
54+
6155 for dir_ in dirs :
62- if os . name == 'nt' :
63- allfiles . append ( os . path . join ( root , dir_ ). replace (folder , '/' + part_name ). replace ( ' \\ ' , '/' ) )
64- elif os . name == 'posix' :
65- allfiles . append ( os . path . join ( root , dir_ ). replace ( folder , '/' + part_name ))
56+ full_path = f" { root_clean } / { dir_ } "
57+ target_path = full_path . replace (folder_abs , '/' + part_name )
58+ allfiles . append ( target_path )
59+
6660 for file in files :
67- if os .name == 'nt' :
68- allfiles .append (os .path .join (root , file ).replace (folder , '/' + part_name ).replace ('\\ ' , '/' ))
69- elif os .name == 'posix' :
70- allfiles .append (os .path .join (root , file ).replace (folder , '/' + part_name ))
61+ full_path = f"{ root_clean } /{ file } "
62+ target_path = full_path .replace (folder_abs , '/' + part_name )
63+ allfiles .append (target_path )
7164
7265 return sorted (set (allfiles ), key = allfiles .index )
7366
@@ -91,22 +84,23 @@ def context_patch(fs_file, filename) -> tuple:
9184 continue
9285
9386 permission = permission_d
94-
95- # Đồng bộ hóa việc check luật cứng (loại bỏ dấu "/" ở đầu actual_i nếu có để khớp fix_permission)
9687 clean_i = actual_i .lstrip ('/' )
9788
9889 if clean_i in fix_permission :
9990 permission = fix_permission [clean_i ]
10091 elif actual_i in fix_permission :
10192 permission = fix_permission [actual_i ]
10293 else :
103- # Thuật toán tìm ngược lên thư mục cha để lấy quyền kế thừa
94+ # Thuật toán tìm ngược lên thư mục cha có thêm điều kiện chặn lặp vô hạn
10495 tmp_path = os .path .dirname (actual_i )
10596 while tmp_path and tmp_path != "/" :
10697 if tmp_path in fs_file :
10798 permission = fs_file [tmp_path ]
10899 break
100+ prev_path = tmp_path
109101 tmp_path = os .path .dirname (tmp_path )
102+ if tmp_path == prev_path : # Chặn lỗi lặp cấu trúc lạ
103+ break
110104
111105 print (f"ADD [{ actual_i } :{ permission } ]" )
112106 new_fs [actual_i ] = permission
@@ -121,11 +115,13 @@ def main(dir_path, fs_config) -> None:
121115 new_fs , added_keys = context_patch (origin , allfiles )
122116
123117 with open (fs_config , "w" , encoding = 'utf-8' , newline = '\n ' ) as f :
118+ # Ghi lại các key cũ theo đúng thứ tự ban đầu
124119 for key in orig_order :
125120 if key in new_fs :
126121 f .write (f"{ key } { ' ' .join (new_fs [key ])} \n " )
127122 del new_fs [key ]
128123
124+ # Ghi các key mới được thêm vào cuối file
129125 for key in sorted (added_keys ):
130126 if key in new_fs :
131127 f .write (f"{ key } { ' ' .join (new_fs [key ])} \n " )
0 commit comments