diff --git a/tools/Control.dex b/tools/Control.dex new file mode 100644 index 0000000..960b056 Binary files /dev/null and b/tools/Control.dex differ diff --git a/tools/Device_List b/tools/Device_List new file mode 100644 index 0000000..2707044 --- /dev/null +++ b/tools/Device_List @@ -0,0 +1,1568 @@ +"MI-ONE PLUS" "小米 1 聯通版" +"MI-ONE C1" "小米 1 電信版" +"MI-ONE" "小米 1 青春版" +"2012051" "小米 1S 聯通版" +"2012053" "小米 1S 電信版" +"2012052" "小米 1S 青春版" +"2012061" "小米 2 聯通版" +"2012062" "小米 2 電信版" +"2013012" "小米 2S 聯通版" +"2013021" "小米 2S 電信版" +"2012121" "小米 2A 聯通版" +"2013061" "小米 3 移動版" +"2013062" "小米 3 聯通版" +"2013063" "小米 3 電信版" +"2014215" "小米 4 聯通 3G 版" +"2014218" "小米 4 電信 3G 版" +"2014216" "小米 4 移動 4G 版" +"2014719" "小米 4 聯通 4G 版" +"2014716" "小米 4 電信 4G 版" +"2014726" "小米 4 電信 4G 合約版" +"2015015" "小米 4i 國際版" +"2015561" "小米 4c 全網通版" +"2015562" "小米 4c 移動合約版" +"2015911" "小米 4S 全網通版" +"2015201" "小米 5 標準版" +"2015628" "小米 5 高配版 / 尊享版" +"2015105" "小米 5 國際版" +"2015711" "小米 5s 全網通版" +"2016070" "小米 5s Plus 全網通版" +"2016089" "小米 5c 移動版" +"MDE2" "小米 5X 全網通版" +"MDT2" "小米 5X 移動 4G+ 版" +"MCE16" "小米 6 全網通版" +"MCT1" "小米 6 移動 4G+ 版" +"M1804D2SE" "小米 6X 全網通版" +"M1804D2ST" "小米 6X 移動 4G+ 版" +"M1804D2SC" "小米 6X 聯通電信定制版" +"M1803E1A" "小米 8 全網通版" +"M1803E1T" "小米 8 移動 4G+ 版" +"M1803E1C" "小米 8 聯通電信定制版" +"M1807E8S" "小米 8 透明探索版" +"M1807E8A" "小米 8 屏幕指紋版" +"M1805E2A" "小米 8 SE 全網通版" +"M1808D2TE" "小米 8 青春版 全網通版" +"M1808D2TT" "小米 8 青春版 移動 4G+ 版" +"M1808D2TC" "小米 8 青春版 聯通電信定制版" +"M1808D2TG" "小米 8 Lite 國際版" +"M1902F1A" "小米 9 全網通版" +"M1902F1T" "小米 9 移動 4G+ 版" +"M1902F1C" "小米 9 聯通電信定制版" +"M1902F1G" "小米 9 國際版" +"M1908F1XE" "小米 9 Pro 5G 全網通版" +"M1903F2A" "小米 9 SE 全網通版" +"M1903F2G" "小米 9 SE 國際版" +"M1903F10G" "小米 9T 國際版" +"M1903F11G" "小米 9T Pro 國際版" +"M1904F3BG" "小米 9 Lite 國際版" +"M2001J2C" "小米 10 全網通版" +"M2001J2G" "小米 10 國際版" +"M2001J2I" "小米 10 印度版" +"M2001J1C" "小米 10 Pro 全網通版" +"M2001J1G" "小米 10 Pro 國際版" +"M2002J9E" "小米 10 青春版 全網通版" +"M2002J9G" "小米 10 Lite 國際版" +"M2002J9S" "小米 10 Lite 韓國版" +"XIG01" "小米 10 Lite 日本版 (KDDI)" +"M2007J1SC" "小米 10 至尊紀念版 全網通版" +"M2007J3SY" "小米 10T 國際版" +"M2007J3SP" "小米 10T 印度版" +"M2007J3SG" "小米 10T Pro 國際版" +"M2007J3SI" "小米 10T Pro 印度版" +"M2007J17G" "小米 10T Lite 國際版" +"M2007J17I" "小米 10i 印度版" +"M2102J2SC" "小米 10S 全網通版" +"M2011K2C" "小米 11 全網通版" +"M2011K2G" "小米 11 國際版" +"M2102K1AC" "小米 11 Pro 全網通版" +"M2102K1C" "小米 11 Ultra 全網通版" +"M2102K1G" "小米 11 Ultra 國際版" +"M2101K9C" "小米 11 青春版 全網通版" +"M2101K9G" "小米 11 Lite 5G 國際版" +"M2101K9R" "小米 11 Lite 5G 日本版" +"M2101K9AG" "小米 11 Lite 4G 國際版" +"M2101K9AI" "小米 11 Lite 4G 印度版" +"2107119DC" "Xiaomi 11 青春活力版 全網通版" +"2109119DG" "Xiaomi 11 Lite 5G NE 國際版" +"2109119DI" "Xiaomi 11 Lite NE 5G 印度版" +"M2012K11G" "小米 11i 國際版" +"M2012K11AI" "小米 11X 印度版" +"M2012K11I" "小米 11X Pro 印度版" +"21081111RG" "Xiaomi 11T 國際版" +"2107113SG" "Xiaomi 11T Pro 國際版" +"2107113SI" "Xiaomi 11T Pro 印度版" +"2107113SR" "Xiaomi 11T Pro 日本版" +"21091116I" "Xiaomi 11i 印度版" +"21091116UI" "Xiaomi 11i HyperCharge 印度版" +"2201123C" "Xiaomi 12 全網通版" +"2201123G" "Xiaomi 12 國際版" +"2112123AC" "Xiaomi 12X 全網通版" +"2112123AG" "Xiaomi 12X 國際版" +"2201122C" "Xiaomi 12 Pro 全網通版" +"2201122G" "Xiaomi 12 Pro 國際版" +"2207122MC" "Xiaomi 12 Pro 天璣版 全網通版" +"2203129G" "Xiaomi 12 Lite 國際版" +"2203129I" "Xiaomi 12 Lite 印度版" +"2206123SC" "Xiaomi 12S 全網通版" +"2206122SC" "Xiaomi 12S Pro 全網通版" +"2203121C" "Xiaomi 12S Ultra 全網通版" +"22071212AG" "Xiaomi 12T 國際版" +"22081212UG" "Xiaomi 12T Pro 國際版" +"22200414R" "Xiaomi 12T Pro 日本版 (SIM Free)" +"A201XM" "Xiaomi 12T Pro 日本版 (SoftBank)" +"2211133C" "Xiaomi 13 全網通版" +"2211133G" "Xiaomi 13 國際版" +"2210132C" "Xiaomi 13 Pro 全網通版" +"2210132G" "Xiaomi 13 Pro 國際版" +"2304FPN6DC" "Xiaomi 13 Ultra 全網通版" +"2304FPN6DG" "Xiaomi 13 Ultra 國際版" +"2210129SG" "Xiaomi 13 Lite 國際版" +"2306EPN60G" "Xiaomi 13T 國際版" +"2306EPN60R" "Xiaomi 13T 日本版 (SIM Free)" +"XIG04" "Xiaomi 13T 日本版 (KDDI)" +"23078PND5G" "Xiaomi 13T Pro 國際版" +"23088PND5R" "Xiaomi 13T Pro 日本版 (SIM Free)" +"A301XM" "Xiaomi 13T Pro 日本版 (SoftBank)" +"23127PN0CC" "Xiaomi 14 全網通版" +"23127PN0CG" "Xiaomi 14 國際版" +"23116PN5BC" "Xiaomi 14 Pro 全網通版" +"23116PN5BG" "Xiaomi 14 Pro 國際版" +"2014616" "小米 Note 雙網通版" +"2014619" "小米 Note 全網通版" +"2014618" "小米 Note 移動合約版" +"2014617" "小米 Note 聯通合約版" +"2015011" "小米 Note 國際版" +"2015021" "小米 Note 頂配版 雙網通版" +"2015022" "小米 Note 頂配版 全網通版" +"2015501" "小米 Note 頂配版 移動合約版" +"2015211" "小米 Note 2 全網通版" +"2015212" "小米 Note 2 移動 4G+ 版" +"2015213" "小米 Note 2 全網通版 (全球頻段)" +"MCE8" "小米 Note 3 全網通版" +"MCT8" "小米 Note 3 移動 4G+ 版" +"M1910F4G" "小米 Note 10 國際版" +"M1910F4S" "小米 Note 10 Pro 國際版" +"M2002F4LG" "小米 Note 10 Lite 國際版" +"2016080" "小米 MIX 全網通版" +"MDE5" "小米 MIX 2 黑色陶瓷版 全網通版" +"MDT5" "小米 MIX 2 黑色陶瓷版 移動 4G+ 版" +"MDE5S" "小米 MIX 2 全陶瓷尊享版" +"M1803D5XE" "小米 MIX 2S 全網通版" +"M1803D5XA" "小米 MIX 2S 尊享版 (全球頻段)" +"M1803D5XT" "小米 MIX 2S 移動 4G+ 版" +"M1803D5XC" "小米 MIX 2S 聯通電信定制版" +"M1810E5E" "小米 MIX 3 全網通版" +"M1810E5A" "小米 MIX 3 全網通版 (全球頻段)" +"M1810E5GG" "小米 MIX 3 5G" +"M2011J18C" "MIX FOLD 小米折疊屏手機" +"2106118C" "Xiaomi MIX 4" +"22061218C" "Xiaomi MIX Fold 2" +"2308CPXD0C" "Xiaomi MIX Fold 3" +"2016001" "小米 Max 標準版 全網通版" +"2016002" "小米 Max 標準版 國際版" +"2016007" "小米 Max 高配版" +"MDE40" "小米 Max 2 全網通版" +"MDT4" "小米 Max 2 移動 4G+ 版" +"MDI40" "小米 Max 2 印度版" +"M1804E4A" "小米 Max 3 全網通版" +"M1804E4T" "小米 Max 3 移動 4G+ 版" +"M1804E4C" "小米 Max 3 聯通電信定制版" +"M1904F3BC" "小米 CC9 全網通版" +"M1904F3BT" "小米 CC9 美圖定制版" +"M1906F9SC" "小米 CC9e 全網通版" +"M1910F4E" "小米 CC9 Pro 全網通版" +"2109119BC" "Xiaomi Civi 全網通版" +"2109119BC" "Xiaomi Civi 1S 全網通版" +"2209129SC" "Xiaomi Civi 2 全網通版" +"23046PNC9C" "Xiaomi Civi 3 全網通版" +"M1901F9E" "小米 Play 全網通版" +"M1901F9T" "小米 Play 移動 4G+ 版" +"MDG2" "小米 A1 國際版" +"MDI2" "小米 A1 印度版" +"M1804D2SG" "小米 A2 國際版" +"M1804D2SI" "小米 A2 印度版" +"M1805D1SG" "小米 A2 Lite 國際版" +"M1906F9SH" "小米 A3 國際版" +"M1906F9SI" "小米 A3 印度版" +"A0101" "小米平板" +"2015716" "小米平板 2" +"MCE91" "小米平板 3" +"M1806D9W" "小米平板 4 Wi-Fi 版" +"M1806D9E" "小米平板 4 LTE 版" +"M1806D9PE" "小米平板 4 Plus LTE 版" +"21051182C" "小米平板 5 國行版" +"21051182G" "小米平板 5 國際版" +"M2105K81AC" "小米平板 5 Pro Wi-Fi 版" +"M2105K81C" "小米平板 5 Pro 5G" +"22081281AC" "小米平板 5 Pro 12.4 英寸" +"23043RP34C" "Xiaomi Pad 6 國行版" +"23043RP34G" "Xiaomi Pad 6 國際版" +"23043RP34I" "Xiaomi Pad 6 印度版" +"23046RP50C" "Xiaomi Pad 6 Pro" +"2307BRPDCC" "Xiaomi Pad 6 Max 14" +"2013022" "紅米手機 移動版" +"2013023" "紅米手機 聯通版" +"2013029" "紅米 1S 聯通版" +"2013028" "紅米 1S 電信版" +"2014011" "紅米 1S 移動 3G 版" +"2014501" "紅米 1S 移動 4G 版" +"2014813" "紅米 2 移動版" +"2014112" "紅米 2 移動合約版" +"2014811" "紅米 2 聯通版" +"2014812" "紅米 2 電信版" +"2014821" "紅米 2 電信合約版" +"2014817" "紅米 2 國際版" +"2014818" "紅米 2 印度版" +"2014819" "紅米 2 巴西版" +"2014502" "紅米 2A 標準版" +"2014055" "紅米 2A 增強版" +"2014816" "紅米 2A 高配版" +"2015815" "紅米 3 全網通 標準版" +"2015812" "紅米 3 移動合約 標準版" +"2015810" "紅米 3 聯通合約 標準版" +"2015819" "紅米 3 全網通 高配版" +"2015818" "紅米 3 聯通合約 高配版" +"2015816" "紅米 3 國際版" +"2016030" "紅米 3S 全網通版" +"2016031" "紅米 3S 國際版" +"2016032" "紅米 3S Prime 印度版" +"2016037" "紅米 3S 印度版" +"2016036" "紅米 3X 全網通版" +"2016035" "紅米 3X 移動合約版" +"2016033" "紅米 3X 全網通版 (聯通定制)" +"2016090" "紅米 4 標準版" +"2016060" "紅米 4 高配版" +"2016111" "紅米 4A 全網通版" +"2016112" "紅米 4A 移動 4G+ 版" +"2016117" "紅米 4A 國際版" +"2016116" "紅米 4A 印度版" +"MAE136" "紅米 4X 全網通版" +"MAT136" "紅米 4X 移動 4G+ 版" +"MAG138" "紅米 4X 國際版" +"MAI132" "紅米 4 印度版" +"MDE1" "紅米 5 全網通版" +"MDT1" "紅米 5 移動 4G+ 版" +"MDG1" "紅米 5 國際版" +"MDI1" "紅米 5 印度版" +"MEE7" "紅米 5 Plus 全網通版" +"MET7" "紅米 5 Plus 移動 4G+ 版" +"MEG7" "紅米 5 Plus 國際版" +"MCE3B" "紅米 5A 全網通版" +"MCT3B" "紅米 5A 移動 4G+ 版" +"MCG3B" "紅米 5A 國際版" +"MCI3B" "紅米 5A 印度版" +"M1804C3DE" "紅米 6 全網通版" +"M1804C3DT" "紅米 6 移動 4G+ 版" +"M1804C3DC" "紅米 6 聯通電信定制版" +"M1804C3DH" "紅米 6 國際版" +"M1804C3DI" "紅米 6 印度版" +"M1805D1SE" "紅米 6 Pro 全網通版" +"M1805D1ST" "紅米 6 Pro 移動 4G+ 版" +"M1805D1SC" "紅米 6 Pro 聯通電信定制版" +"M1805D1SI" "紅米 6 Pro 印度版" +"M1804C3CE" "紅米 6A 全網通版" +"M1804C3CT" "紅米 6A 移動 4G+ 版" +"M1804C3CC" "紅米 6A 聯通電信定制版" +"M1804C3CH" "紅米 6A 國際版" +"M1804C3CI" "紅米 6A 印度版" +"M1810F6LE" "Redmi 7 全網通版" +"M1810F6LT" "Redmi 7 運營商全網通版" +"M1810F6LH" "Redmi 7 國際版" +"M1810F6LI" "Redmi 7 印度版" +"M1903C3EE" "Redmi 7A 全網通版" +"M1903C3ET" "Redmi 7A 移動 4G+ 版" +"M1903C3EC" "Redmi 7A 聯通電信定制版" +"M1903C3EH" "Redmi 7A 國際版" +"M1903C3EI" "Redmi 7A 印度版" +"M1908C3IE" "Redmi 8 全網通版" +"M1908C3IC" "Redmi 8 運營商全網通版" +"M1908C3IH" "Redmi 8 國際版" +"M1908C3II" "Redmi 8 印度版" +"M1908C3KE" "Redmi 8A 全網通版" +"M1908C3KH" "Redmi 8A 國際版" +"M1908C3KI" "Redmi 8A 印度版" +"M2001C3K3I" "Redmi 8A Dual 印度版 / Redmi 8A Pro 國際版" +"M2004J19C" "Redmi 9 全網通版" +"M2004J19G" "Redmi 9 國際版" +"M2004J19I" "Redmi 9 Prime 印度版" +"M2004J19AG" "Redmi 9 國際版 (NFC)" +"M2006C3LC" "Redmi 9A 全網通版" +"M2006C3LG" "Redmi 9A 國際版" +"M2006C3LVG" "Redmi 9AT 國際版" +"M2006C3LI" "Redmi 9A 印度版 / Redmi 9A Sport 印度版" +"M2006C3LII" "Redmi 9i 印度版 / Redmi 9i Sport 印度版" +"M2006C3MG" "Redmi 9C 國際版" +"M2006C3MT" "Redmi 9C 泰國版" +"M2006C3MNG" "Redmi 9C NFC 國際版" +"M2006C3MII" "Redmi 9 印度版 / Redmi 9 Activ 印度版" +"M2010J19SG" "Redmi 9T 國際版" +"M2010J19SI" "Redmi 9 Power 印度版" +"M2010J19SR" "Redmi 9T 日本版" +"M2010J19ST" "Redmi 9T 泰國版" +"M2010J19SY" "Redmi 9T 國際版 (NFC)" +"M2010J19SL" "Redmi 9T 拉美版" +"21061119AG" "Redmi 10 國際版" +"21061119AL" "Redmi 10 拉美版" +"21061119BI" "Redmi 10 Prime 印度版" +"21061119DG" "Redmi 10 國際版 (NFC)" +"21121119SG" "Redmi 10 2022 國際版" +"21121119VL" "Redmi 10 2022 拉美版" +"22011119TI" "Redmi 10 Prime 2022 印度版" +"22011119UY" "Redmi 10 2022 國際版 (NFC)" +"22041219G" "Redmi 10 5G 國際版" +"22041219I" "Redmi 11 Prime 5G 印度版" +"22041219NY" "Redmi 10 5G 國際版 (NFC)" +"220333QAG" "Redmi 10C 國際版" +"220333QBI" "Redmi 10 印度版 / Redmi 10 Power 印度版" +"220333QNY" "Redmi 10C 國際版 (NFC)" +"220333QL" "Redmi 10C 拉美版" +"220233L2C" "Redmi 10A 全網通版" +"220233L2G" "Redmi 10A 國際版" +"220233L2I" "Redmi 10A 印度版 / Redmi 10A Sport 印度版" +"22071219AI" "Redmi 11 Prime 印度版" +"23053RN02A" "Redmi 12 國際版" +"23053RN02I" "Redmi 12 印度版" +"23053RN02L" "Redmi 12 拉美版" +"23053RN02Y" "Redmi 12 國際版 (NFC)" +"23077RABDC" "Redmi 12 5G 全網通版" +"23076RN8DY" "Redmi 12 5G 國際版 (NFC)" +"23076RA4BR" "Redmi 12 5G 日本版 (SIM Free)" +"XIG03" "Redmi 12 5G 日本版 (KDDI)" +"23076RN4BI" "Redmi 12 5G 印度版" +"23076RA4BC" "Redmi 12R 全網通版" +"22120RN86C" "Redmi 12C 全網通版" +"22120RN86G" "Redmi 12C 國際版" +"22120RN86I" "Redmi 12C 印度版" +"2212ARNC4L" "Redmi 12C 拉美版" +"22126RN91Y" "Redmi 12C 國際版 (NFC)" +"23106RN0DA" "Redmi 13C 國際版" +"2311DRN14I" "Redmi 13C 印度版" +"23100RN82L" "Redmi 13C 拉美版" +"23108RN04Y" "Redmi 13C 國際版 (NFC)" +"23124RN87C" "Redmi 13R 5G 全網通版" +"23124RN87G" "Redmi 13C 5G 國際版" +"23124RN87I" "Redmi 13C 5G 印度版" +"2014018" "紅米 Note 聯通 3G 標準版" +"2013121" "紅米 Note 聯通 3G 增強版" +"2014017" "紅米 Note 移動 3G 標準版" +"2013122" "紅米 Note 移動 3G 增強版" +"2014022" "紅米 Note 移動 4G 增強版" +"2014021" "紅米 Note 聯通 4G 增強版" +"2014715" "紅米 Note 4G 國際版" +"2014712" "紅米 Note 4G 印度版" +"2014915" "紅米 Note 移動 4G 雙卡版" +"2014912" "紅米 Note 聯通 4G 雙卡版" +"2014916" "紅米 Note 電信 4G 雙卡版" +"2014911" "紅米 Note 移動 4G 雙卡合約版" +"2014910" "紅米 Note 電信 4G 雙卡合約版" +"2015052" "紅米 Note 2 移動版" +"2015051" "紅米 Note 2 雙網通版" +"2015712" "紅米 Note 2 雙網通高配版" +"2015055" "紅米 Note 2 移動合約版" +"2015056" "紅米 Note 2 移動合約高配版" +"2015617" "紅米 Note 3 雙網通版" +"2015611" "紅米 Note 3 移動合約版" +"2015115" "紅米 Note 3 全網通版" +"2015116" "紅米 Note 3 國際版" +"2015161" "紅米 Note 3 台灣特制版" +"2016050" "紅米 Note 4 全網通版" +"2016051" "紅米 Note 4 移動版" +"2016101" "紅米 Note 4X 高通 全網通版" +"2016130" "紅米 Note 4X 高通 移動 4G+ 版" +"2016102" "紅米 Note 4 國際版 / 紅米 Note 4X 高通 國際版" +"MBE6A5" "紅米 Note 4X MTK 全網通版" +"MBT6A5" "紅米 Note 4X MTK 移動 4G+ 版" +"MEI7" "紅米 Note 5 印度版" +"MEE7S" "紅米 Note 5 全網通版" +"MET7S" "紅米 Note 5 移動 4G+ 版" +"MEC7S" "紅米 Note 5 聯通電信定制版" +"M1803E7SH" "紅米 Note 5 國際版" +"MEI7S" "紅米 Note 5 Pro 印度版" +"MDE6" "紅米 Note 5A 全網通 標準版" +"MDT6" "紅米 Note 5A 移動 4G+ 標準版" +"MDG6" "紅米 Note 5A 國際版 標準版" +"MDI6" "紅米 Y1 Lite 印度版" +"MDE6S" "紅米 Note 5A 全網通 高配版" +"MDT6S" "紅米 Note 5A 移動 4G+ 高配版" +"MDG6S" "紅米 Note 5A 國際版 高配版" +"MDI6S" "紅米 Y1 印度版" +"M1806E7TH" "紅米 Note 6 Pro 國際版" +"M1806E7TI" "紅米 Note 6 Pro 印度版" +"M1901F7E" "Redmi Note 7 全網通版" +"M1901F7T" "Redmi Note 7 移動 4G+ 版" +"M1901F7C" "Redmi Note 7 聯通電信定制版" +"M1901F7H" "Redmi Note 7 國際版" +"M1901F7I" "Redmi Note 7 印度版 / Redmi Note 7S 印度版" +"M1901F7BE" "Redmi Note 7 Pro 全網通版" +"M1901F7S" "Redmi Note 7 Pro 印度版" +"M1908C3JE" "Redmi Note 8 全網通版" +"M1908C3JC" "Redmi Note 8 運營商全網通版" +"M1908C3JH" "Redmi Note 8 國際版" +"M1908C3JI" "Redmi Note 8 印度版" +"M1908C3XG" "Redmi Note 8T 國際版" +"M1908C3JGG" "Redmi Note 8 (2021) 國際版" +"M1906G7E" "Redmi Note 8 Pro 全網通版" +"M1906G7T" "Redmi Note 8 Pro 運營商全網通版" +"M1906G7G" "Redmi Note 8 Pro 國際版" +"M1906G7I" "Redmi Note 8 Pro 印度版" +"M2010J19SC" "Redmi Note 9 4G 全網通版" +"M2007J22C" "Redmi Note 9 5G 全網通版" +"M2003J15SS" "Redmi Note 9 國際版" +"M2003J15SI" "Redmi Note 9 印度版" +"M2003J15SG" "Redmi Note 9 國際版 (NFC)" +"M2007J22G" "Redmi Note 9T 5G 國際版" +"A001XM" "Redmi Note 9T 5G 日本版 (SoftBank)" +"M2007J17C" "Redmi Note 9 Pro 5G 全網通版" +"M2003J6A1G" "Redmi Note 9S 國際版" +"M2003J6A1R" "Redmi Note 9S 日本版 / Redmi Note 9S 韓國版" +"M2003J6A1I" "Redmi Note 9 Pro 印度版" +"M2003J6B1I" "Redmi Note 9 Pro Max 印度版" +"M2003J6B2G" "Redmi Note 9 Pro 國際版" +"M2101K7AG" "Redmi Note 10 國際版" +"M2101K7AI" "Redmi Note 10 印度版" +"M2101K7BG" "Redmi Note 10S 國際版" +"M2101K7BI" "Redmi Note 10S 印度版" +"M2101K7BNY" "Redmi Note 10S 國際版 (NFC)" +"M2101K7BL" "Redmi Note 10S 拉美版" +"M2103K19C" "Redmi Note 10 5G 全網通版 / Redmi Note 11SE 全網通版" +"M2103K19I" "Redmi Note 10T 5G 印度版" +"M2103K19G" "Redmi Note 10 5G 國際版" +"M2103K19Y" "Redmi Note 10T 國際版" +"XIG02" "Redmi Note 10 JE 日本版 (KDDI)" +"22021119KR" "Redmi Note 10T 日本版 (SIM Free)" +"A101XM" "Redmi Note 10T 日本版 (SoftBank)" +"M2101K6G" "Redmi Note 10 Pro 國際版" +"M2101K6T" "Redmi Note 10 Pro 泰國版" +"M2101K6R" "Redmi Note 10 Pro 日本版" +"M2101K6P" "Redmi Note 10 Pro 印度版" +"M2101K6I" "Redmi Note 10 Pro Max 印度版" +"M2104K10AC" "Redmi Note 10 Pro 5G 全網通版" +"2109106A1I" "Redmi Note 10 Lite 印度版" +"21121119SC" "Redmi Note 11 4G 全網通版" +"2201117TG" "Redmi Note 11 國際版" +"2201117TI" "Redmi Note 11 印度版" +"2201117TL" "Redmi Note 11 拉美版" +"2201117TY" "Redmi Note 11 國際版 (NFC)" +"21091116AC" "Redmi Note 11 5G 全網通版" +"21091116AI" "Redmi Note 11T 5G 印度版" +"22041219C" "Redmi Note 11E 5G 全網通版" +"2201117SG" "Redmi Note 11S 國際版" +"2201117SI" "Redmi Note 11S 印度版" +"2201117SL" "Redmi Note 11S 拉美版" +"2201117SY" "Redmi Note 11S 國際版 (NFC)" +"22087RA4DI" "Redmi Note 11 SE 印度版" +"22031116BG" "Redmi Note 11S 5G 國際版" +"21091116C" "Redmi Note 11 Pro 全網通版" +"2201116TG" "Redmi Note 11 Pro 國際版" +"2201116TI" "Redmi Note 11 Pro 印度版" +"2201116SC" "Redmi Note 11E Pro 全網通版" +"2201116SG" "Redmi Note 11 Pro 5G 國際版" +"2201116SR" "Redmi Note 11 Pro 5G 日本版" +"2201116SI" "Redmi Note 11 Pro+ 5G 印度版" +"21091116UC" "Redmi Note 11 Pro+ 全網通版" +"21091116UG" "Redmi Note 11 Pro+ 5G 國際版" +"22041216C" "Redmi Note 11T Pro 全網通版" +"22041216UC" "Redmi Note 11T Pro+ 全網通版" +"22095RA98C" "Redmi Note 11R 5G 全網通版" +"23021RAAEG" "Redmi Note 12 國際版" +"23027RAD4I" "Redmi Note 12 印度版" +"23028RA60L" "Redmi Note 12 拉美版" +"23021RAA2Y" "Redmi Note 12 國際版 (NFC)" +"22101317C" "Redmi Note 12 5G 全網通版 / Redmi Note 12R Pro 全網通版" +"22111317G" "Redmi Note 12 5G 國際版" +"22111317I" "Redmi Note 12 5G 印度版" +"23076RA4BC" "Redmi Note 12R 全網通版" +"2303CRA44A" "Redmi Note 12S 國際版" +"2303ERA42L" "Redmi Note 12S 拉美版" +"23030RAC7Y" "Redmi Note 12S 國際版 (NFC)" +"2209116AG" "Redmi Note 12 Pro 國際版" +"22101316C" "Redmi Note 12 Pro 全網通版" +"22101316G" "Redmi Note 12 Pro 5G 國際版" +"22101316I" "Redmi Note 12 Pro 5G 印度版" +"22101316UCP" "Redmi Note 12 Pro+ 全網通版" +"22101316UG" "Redmi Note 12 Pro+ 5G 國際版" +"22101316UP" "Redmi Note 12 Pro+ 5G 印度版" +"22101316UC" "Redmi Note 12 探索版 全網通版" +"22101320C" "Redmi Note 12 Pro 極速版 全網通版" +"23054RA19C" "Redmi Note 12T Pro 全網通版" +"23049RAD8C" "Redmi Note 12 Turbo 全網通版" +"2312DRAABC" "Redmi Note 13 5G 全網通版" +"2312DRAABG" "Redmi Note 13 5G 國際版" +"2312DRAABI" "Redmi Note 13 5G 印度版" +"2312CRAD3C" "Redmi Note 13 Pro 全網通版" +"2312DRA50G" "Redmi Note 13 Pro 5G 國際版" +"2312DRA50I" "Redmi Note 13 Pro 5G 印度版" +"23090RA98C" "Redmi Note 13 Pro+ 全網通版" +"23090RA98G" "Redmi Note 13 Pro+ 5G 國際版" +"23090RA98I" "Redmi Note 13 Pro+ 5G 印度版" +"2311FRAFDC" "Redmi Note 13R Pro 全網通版" +"M2004J7AC" "Redmi 10X 5G 全網通版" +"M2004J7BC" "Redmi 10X Pro 5G 全網通版" +"M2003J15SC" "Redmi 10X 4G 全網通版" +"M1903F10A" "Redmi K20 全網通版" +"M1903F10C" "Redmi K20 運營商全網通版" +"M1903F10I" "Redmi K20 印度版" +"M1903F11A" "Redmi K20 Pro 全網通版" +"M1903F11C" "Redmi K20 Pro 運營商全網通版" +"M1903F11I" "Redmi K20 Pro 印度版" +"M1903F11A" "Redmi K20 Pro 尊享版 全網通版" +"M2001G7AE" "Redmi K30 5G 全網通版 / Redmi K30 5G 極速版" +"M2001G7AC" "Redmi K30 5G 全網通版" +"M2001G7AC" "Redmi K30i 5G 全網通版" +"M1912G7BE" "Redmi K30 4G 全網通版" +"M1912G7BC" "Redmi K30 4G 運營商全網通版" +"M2001J11C" "Redmi K30 Pro 全網通版" +"M2001J11E" "Redmi K30 Pro 變焦版 全網通版" +"M2006J10C" "Redmi K30 至尊紀念版 全網通版" +"M2007J3SC" "Redmi K30S 至尊紀念版 全網通版" +"M2012K11AC" "Redmi K40 全網通版" +"M2012K11C" "Redmi K40 Pro 全網通版 / Redmi K40 Pro+ 全網通版" +"M2012K10C" "Redmi K40 遊戲增強版 全網通版" +"22021211RC" "Redmi K40S 全網通版" +"22041211AC" "Redmi K50 全網通版" +"22011211C" "Redmi K50 Pro 全網通版" +"21121210C" "Redmi K50 電競版 全網通版" +"22081212C" "Redmi K50 至尊版 全網通版" +"22041216I" "Redmi K50i 印度版" +"23013RK75C" "Redmi K60 全網通版" +"22127RK46C" "Redmi K60 Pro 全網通版" +"22122RK93C" "Redmi K60E 全網通版" +"23078RKD5C" "Redmi K60 至尊版 全網通版" +"23113RKC6C" "Redmi K70 全網通版" +"23117RK66C" "Redmi K70 Pro 全網通版" +"2311DRK48C" "Redmi K70E 全網通版" +"2016020" "紅米 Pro 標準版" +"2016021" "紅米 Pro 高配版 / 尊享版" +"M1803E6E" "紅米 S2 全網通版" +"M1803E6T" "紅米 S2 移動 4G+ 版" +"M1803E6C" "紅米 S2 聯通電信定制版" +"M1803E6H" "紅米 S2 國際版" +"M1803E6I" "紅米 Y2 印度版" +"M1810F6G" "Redmi Y3 國際版" +"M1810F6I" "Redmi Y3 印度版" +"M1903C3GH" "Redmi Go 國際版" +"M1903C3GI" "Redmi Go 印度版" +"220733SG" "Redmi A1 國際版" +"220733SI" "Redmi A1 印度版" +"220733SL" "Redmi A1 拉美版" +"220733SFG" "Redmi A1+ 國際版" +"220743FI" "Redmi A1+ 印度版" +"23028RN4DG" "Redmi A2 國際版" +"23028RN4DI" "Redmi A2 印度版" +"23028RNCAG" "Redmi A2+ 國際版" +"23028RNCAI" "Redmi A2+ 印度版" +"22081283C" "Redmi Pad 國行版" +"22081283G" "Redmi Pad 國際版" +"23073RPBFC" "Redmi Pad SE 國行版" +"23073RPBFG" "Redmi Pad SE 國際版" +"23073RPBFL" "Redmi Pad SE 拉美版" +"M1805E10A" "POCO F1" +"M2004J11G" "POCO F2 Pro 國際版" +"M2012K11AG" "POCO F3 國際版" +"M2104K10I" "POCO F3 GT 印度版" +"22021211RG" "POCO F4 國際版" +"22021211RI" "POCO F4 印度版" +"21121210G" "POCO F4 GT 國際版" +"21121210I" "POCO F4 GT 印度版" +"23049PCD8G" "POCO F5 國際版" +"23049PCD8I" "POCO F5 印度版" +"23013PC75G" "POCO F5 Pro 國際版" +"M1912G7BI" "POCO X2 印度版" +"M2007J20CI" "POCO X3 印度版" +"M2007J20CG" "POCO X3 NFC 國際版" +"M2007J20CT" "POCO X3 NFC 泰國版" +"M2102J20SG" "POCO X3 Pro 國際版" +"M2102J20SI" "POCO X3 Pro 印度版" +"21061110AG" "POCO X3 GT 國際版" +"2201116PG" "POCO X4 Pro 5G 國際版" +"2201116PI" "POCO X4 Pro 5G 印度版" +"22041216G" "POCO X4 GT 國際版" +"22041216UG" "POCO X4 GT Pro 國際版" +"22111317PG" "POCO X5 5G 國際版" +"22111317PI" "POCO X5 5G 印度版" +"22101320G" "POCO X5 Pro 5G 國際版" +"22101320I" "POCO X5 Pro 5G 印度版" +"23122PCD1G" "POCO X6 5G 國際版" +"23122PCD1I" "POCO X6 5G 印度版" +"2311DRK48G" "POCO X6 Pro 5G 國際版" +"2311DRK48I" "POCO X6 Pro 5G 印度版" +"2312FRAFDI" "POCO X6 Neo 印度版" +"M2004J19PI" "POCO M2 印度版" +"M2003J6CI" "POCO M2 Pro 印度版" +"M2010J19CG" "POCO M3 國際版" +"M2010J19CT" "POCO M3 泰國版" +"M2010J19CI" "POCO M3 印度版" +"M2103K19PY" "POCO M3 Pro 5G 國際版" +"M2103K19PI" "POCO M3 Pro 5G 印度版" +"22041219PG" "POCO M4 5G 國際版" +"22041219PI" "POCO M4 5G 印度版" +"2201117PG" "POCO M4 Pro 國際版" +"2201117PI" "POCO M4 Pro 印度版" +"21091116AG" "POCO M4 Pro 5G 國際版" +"22031116AI" "POCO M4 Pro 5G 印度版" +"22071219CG" "POCO M5 國際版" +"22071219CI" "POCO M5 印度版" +"2207117BPG" "POCO M5s 國際版" +"23076PC4BI" "POCO M6 Pro 5G 印度版" +"M2006C3MI" "POCO C3 印度版" +"211033MI" "POCO C31 印度版" +"220333QPG" "POCO C40 國際版" +"220333QPI" "POCO C40 印度版" +"220733SPI" "POCO C50 印度版" +"2305EPCC4G" "POCO C51 國際版" +"2302EPCC4I" "POCO C51 印度版" +"22127PC95G" "POCO C55 國際版" +"22127PC95I" "POCO C55 印度版" +"2310FPCA4G" "POCO C65 國際版" +"XMWT01" "小米手表" +"FYJ01QP" "小米米家翻譯機" +"21051191C" "CyberDog 仿生四足機器人" +"GT-I9000" "Galaxy S 公開版" +"GT-I9018" "Galaxy S 移動定制版" +"SCH-i909" "Galaxy S 電信定制版" +"GT-I9100" "Galaxy S2 (Exynos)" +"GT-I9100G" "Galaxy S2 (德州儀器)" +"GT-I9108" "Galaxy S2 移動定制版" +"SCH-I919" "Galaxy S Duos 電信定制版" +"GT-I9300" "Galaxy S3 公開版" +"GT-I9308" "Galaxy S3 移動定制版" +"SCH-I939" "Galaxy S3 電信定制版" +"SCH-I939D" "Galaxy S3 電信雙卡定制版" +"GT-I9300I" "Galaxy S3 Neo+ 公開版" +"GT-I9308I" "Galaxy S3 Neo+ 移動定制版" +"SCH-I939I" "Galaxy S3 Neo+ 電信定制版" +"GT-I8190N" "Galaxy S3 Mini" +"GT-I9500" "Galaxy S4 公開版" +"GT-I9502" "Galaxy S4 聯通定制版" +"GT-I9508" "Galaxy S4 移動定制版" +"SCH-I959" "Galaxy S4 電信定制版" +"GT-I9507V" "Galaxy S4 聯通 4G 定制版" +"GT-I9508V" "Galaxy S4 移動 4G 定制版" +"SM-C101" "Galaxy S4 zoom" +"SM-G9009D" "Galaxy S5 電信 3G 雙卡版" +"SM-G9006V" "Galaxy S5 聯通 4G 單卡版" +"SM-G9008V" "Galaxy S5 移動 4G 單卡版" +"SM-G9006W" "Galaxy S5 聯通 4G 雙卡版" +"SM-G9008W" "Galaxy S5 移動 4G 雙卡版" +"SM-G9009W" "Galaxy S5 電信 4G 雙卡版" +"SM-G9200" "Galaxy S6 全網通版" +"SM-G9208" "Galaxy S6 移動定制版" +"SM-G9209" "Galaxy S6 電信定制版" +"SM-G9250" "Galaxy S6 edge" +"SM-G9280" "Galaxy S6 edge+" +"SM-G9300" "Galaxy S7 全網通版" +"SM-G9308" "Galaxy S7 移動定制版" +"SM-G9350" "Galaxy S7 edge" +"SM-G9500" "Galaxy S8 全網通版" +"SM-G9508" "Galaxy S8 4G+" +"SM-G9550" "Galaxy S8+" +"SM-G9600/DS" "Galaxy S9 全網通版" +"SM-G9608/DS" "Galaxy S9 4G+" +"SM-G9650/DS" "Galaxy S9+" +"SM-G8750" "Galaxy S 輕奢版" +"SM-G9700" "Galaxy S10e 全網通版" +"SM-G9708" "Galaxy S10e 4G+" +"SM-G9730" "Galaxy S10 全網通版" +"SM-G9738" "Galaxy S10 4G+" +"SM-G9750" "Galaxy S10+ 全網通版" +"SM-G9758" "Galaxy S10+ 4G+" +"SM-G9810" "Galaxy S20 5G" +"SM-G9860" "Galaxy S20+ 5G" +"SM-G9880" "Galaxy S20 Ultra 5G" +"SM-G7810" "Galaxy S20 FE 5G" +"SM-G9910" "Galaxy S21 5G" +"SM-G9960" "Galaxy S21+ 5G" +"SM-G9980" "Galaxy S21 Ultra 5G" +"SM-G9900" "Galaxy S21 FE 5G" +"SM-S9010" "Galaxy S22 5G" +"SM-S9060" "Galaxy S22+ 5G" +"SM-S9080" "Galaxy S22 Ultra 5G" +"SM-S9110" "Galaxy S23 5G" +"SM-S9160" "Galaxy S23+ 5G" +"SM-S9180" "Galaxy S23 Ultra 5G" +"SM-S7110" "Galaxy S23 FE 5G" +"GT-I9220" "Galaxy Note 公開版" +"GT-I9228" "Galaxy Note 移動定制版" +"SCH-I889" "Galaxy Note 電信定制版" +"GT-N7100" "Galaxy Note2 公開版" +"GT-N7102i" "Galaxy Note2 聯通定制版" +"GT-N7108" "Galaxy Note2 移動定制版" +"GT-N7108D" "Galaxy Note2 移動 4G 定制版" +"SCH-N719" "Galaxy Note2 電信定制版" +"SM-N9002" "Galaxy Note3 聯通定制版" +"SM-N9006" "Galaxy Note3 公開版" +"SM-N9008" "Galaxy Note3 移動定制版" +"SM-N9008V" "Galaxy Note3 移動 4G 定制版" +"SM-N9008S" "Galaxy Note3 4G 公開版" +"SM-N9009" "Galaxy Note3 電信定制版" +"SM-N7506V" "Galaxy Note3 Lite 聯通定制版" +"SM-N7508V" "Galaxy Note3 Lite 移動定制版" +"SM-N7509V" "Galaxy Note3 Lite 電信定制版" +"SM-N9100" "Galaxy Note4 公開版" +"SM-N9106W" "Galaxy Note4 聯通定制版" +"SM-N9108V" "Galaxy Note4 移動定制版" +"SM-N9109W" "Galaxy Note4 電信定制版" +"SM-N9150" "Galaxy Note Edge" +"SM-N9200" "Galaxy Note5 全網通版" +"SM-N9208" "Galaxy Note5 移動定制版" +"SM-N9300" "Galaxy Note7" +"SM-N9500" "Galaxy Note8 全網通版" +"SM-N9508" "Galaxy Note8 4G+" +"SM-N9600" "Galaxy Note9 全網通版" +"SM-N9608" "Galaxy Note9 4G+" +"SM-N9700" "Galaxy Note10" +"SM-N9760" "Galaxy Note10+ 5G" +"SM-N9810" "Galaxy Note20 5G" +"SM-N9860" "Galaxy Note20 Ultra 5G" +"SM-F9000" "Galaxy Fold" +"SM-F9160" "Galaxy Z Fold2 5G" +"SM-F9360" "Galaxy Z Fold4 5G" +"SM-F9460" "Galaxy Z Fold5 5G" +"SM-F7000" "Galaxy Z Flip" +"SM-F7070" "Galaxy Z Flip 5G" +"SM-F7110" "Galaxy Z Flip3 5G" +"SM-F7210" "Galaxy Z Flip4 5G" +"SM-F7310" "Galaxy Z Flip5 5G" +"SM-A3000" "Galaxy A3 公開版" +"SM-A3009" "Galaxy A3 電信定制版" +"SM-A5000" "Galaxy A5 公開版" +"SM-A5009" "Galaxy A5 電信定制版" +"SM-A7000" "Galaxy A7 公開版" +"SM-A7009" "Galaxy A7 電信定制版" +"SM-A8000" "Galaxy A8" +"SM-A5100" "Galaxy A5 (2016) 全網通版" +"SM-A5108" "Galaxy A5 (2016) 移動定制疾速版" +"SM-A7100" "Galaxy A7 (2016) 全網通版" +"SM-A7108" "Galaxy A7 (2016) 移動定制疾速版" +"SM-A9000" "Galaxy A9 (2016)" +"SM-A9100" "Galaxy A9 高配版" +"SM-G8850" "Galaxy A9 Star 全網通版" +"SM-G8858" "Galaxy A9 Star 4G+" +"SM-A6050" "Galaxy A9 Star Lite 全網通版" +"SM-A6058" "Galaxy A9 Star Lite 4G+" +"SM-G6200" "Galaxy A6s" +"SM-G8870" "Galaxy A8s" +"SM-A9200" "Galaxy A9s" +"SM-A2070" "Galaxy A20s" +"SM-A3050" "Galaxy A40s 全網通版" +"SM-A3058" "Galaxy A40s 4G+" +"SM-A5070" "Galaxy A50s" +"SM-A6060" "Galaxy A60" +"SM-A7050" "Galaxy A70" +"SM-A7070" "Galaxy A70s" +"SM-A8050" "Galaxy A80" +"SM-A9080" "Galaxy A90 5G" +"SM-A5160" "Galaxy A51 5G" +"SM-A7160" "Galaxy A71 5G" +"SM-A5260" "Galaxy A52 5G" +"SM-A5360" "Galaxy A53 5G" +"SM-A5460" "Galaxy A54 5G" +"SM-E5260" "Galaxy F52 5G" +"SM-M3070" "Galaxy M30s" +"SM-C5000" "Galaxy C5" +"SM-C5010" "Galaxy C5 Pro 全網通版" +"SM-C5018" "Galaxy C5 Pro 4G+" +"SM-C7000" "Galaxy C7" +"SM-C7010" "Galaxy C7 Pro 全網通版" +"SM-C7018" "Galaxy C7 Pro 4G+" +"SM-C7100" "Galaxy C8 全網通版" +"SM-C7108" "Galaxy C8 4G+" +"SM-C9000" "Galaxy C9 Pro 全網通版" +"SM-C9008" "Galaxy C9 Pro 4G+" +"SM-J3109" "Galaxy J3 電信定制版" +"SM-J5008" "Galaxy J5 移動定制版" +"SM-J7008" "Galaxy J7 移動定制版" +"SM-J3110" "Galaxy J3 Pro 公開版" +"SM-J3119" "Galaxy J3 Pro 電信定制版" +"SM-J3119S" "Galaxy J3 Pro 增強版 電信定制版" +"SM-J5108" "Galaxy J5 (2016) 移動定制版" +"SM-J7108" "Galaxy J7 (2016) 移動定制版" +"SM-J7109" "Galaxy J7 (2016) 電信定制版" +"SM-J3300" "Galaxy J3 (2017) 全網通版" +"SM-J3308" "Galaxy J3 (2017) 4G+" +"SM-G5500" "Galaxy On5" +"SM-G6000" "Galaxy On7" +"SM-G5700" "Galaxy On5 (2016) 全網通版" +"SM-G5510" "Galaxy On5 (2016) 青春版 全網通版" +"SM-G5520" "Galaxy On5 (2016) 時尚版 全網通版" +"SM-G5528" "Galaxy On5 (2016) 時尚版 移動定制版" +"SM-G6100" "Galaxy On7 (2016)" +"SCH-W699" "三星 W699" +"SCH-W799" "三星 W799" +"SCH-W899" "三星 W899" +"SCH-W999" "三星 W999" +"SCH-W2013" "三星 W2013" +"SM-W2014" "三星 W2014" +"SM-W2015" "三星 W2015" +"SM-W2016" "三星 W2016" +"SM-W2017" "三星 W2017" +"SM-W2018" "三星 W2018" +"SM-W2019" "三星 W2019" +"SM-W2020" "三星 W20 5G" +"SM-W2021" "三星 W21 5G" +"SM-W2022" "三星 W22 5G" +"SM-W9023" "三星 W23 5G" +"SM-W7023" "三星 W23 Flip 5G" +"SM-W9024" "三星 W24 5G" +"SM-W7024" "三星 W24 Flip 5G" +"SM-G1600" "Galaxy Folder" +"SM-G1650" "Galaxy Folder 2" +"SM-G8508S" "Galaxy Alpha" +"SM-E7000" "Galaxy E7 公開版" +"SM-E7009" "Galaxy E7 電信定制版" +"SM-T700" "Galaxy Tab S 8.4 WLAN" +"SM-T705C" "Galaxy Tab S 8.4 LTE" +"SM-T800" "Galaxy Tab S 10.5 WLAN" +"SM-T805C" "Galaxy Tab S 10.5 LTE" +"SM-T710" "Galaxy Tab S2 8.0 WLAN (Exynos)" +"SM-T715C" "Galaxy Tab S2 8.0 LTE (Exynos)" +"SM-T713" "Galaxy Tab S2 8.0 WLAN (高通)" +"SM-T719C" "Galaxy Tab S2 8.0 LTE (高通)" +"SM-T810" "Galaxy Tab S2 9.7 WLAN (Exynos)" +"SM-T815C" "Galaxy Tab S2 9.7 LTE (Exynos)" +"SM-T813" "Galaxy Tab S2 9.7 WLAN (高通)" +"SM-T819C" "Galaxy Tab S2 9.7 LTE (高通)" +"SM-T820" "Galaxy Tab S3 WLAN" +"SM-T825C" "Galaxy Tab S3 LTE" +"SM-T830" "Galaxy Tab S4 WLAN" +"SM-T835C" "Galaxy Tab S4 LTE" +"SM-T720" "Galaxy Tab S5e WLAN" +"SM-T725C" "Galaxy Tab S5e LTE" +"SM-T860" "Galaxy Tab S6 WLAN" +"SM-P610" "Galaxy Tab S6 Lite WLAN" +"SM-P615C" "Galaxy Tab S6 Lite LTE" +"SM-T870" "Galaxy Tab S7 WLAN" +"SM-T970" "Galaxy Tab S7+ WLAN" +"SM-T730" "Galaxy Tab S7 FE WLAN (驍龍 750G)" +"SM-T733" "Galaxy Tab S7 FE WLAN (驍龍 778G)" +"SM-T735C" "Galaxy Tab S7 FE LTE" +"SM-X700" "Galaxy Tab S8 WLAN" +"SM-X706C" "Galaxy Tab S8 5G" +"SM-X800" "Galaxy Tab S8+ WLAN" +"SM-X806C" "Galaxy Tab S8+ 5G" +"SM-X900" "Galaxy Tab S8 Ultra WLAN" +"SM-X906C" "Galaxy Tab S8 Ultra 5G" +"SM-X710" "Galaxy Tab S9 WLAN" +"SM-X810" "Galaxy Tab S9+ WLAN" +"SM-X910" "Galaxy Tab S9 Ultra WLAN" +"SM-X916C" "Galaxy Tab S9 Ultra 5G" +"SM-X510" "Galaxy Tab S9 FE WLAN" +"SM-X516C" "Galaxy Tab S9 FE 5G" +"SM-X610" "Galaxy Tab S9 FE WLAN" +"SM-X616C" "Galaxy Tab S9 FE 5G" +"SM-T350" "Galaxy Tab A 8.0 WLAN" +"SM-T355C" "Galaxy Tab A 8.0 LTE" +"SM-T550" "Galaxy Tab A 9.7 WLAN" +"SM-T555C" "Galaxy Tab A 9.7 LTE" +"SM-T580" "Galaxy Tab A (2016) 10.1 WLAN" +"SM-T585C" "Galaxy Tab A (2016) 10.1 LTE" +"SM-P583" "Galaxy Tab A (2016) with S Pen 10.1 WLAN" +"SM-P588C" "Galaxy Tab A (2016) with S Pen 10.1 LTE" +"SM-T380" "Galaxy Tab A (2017) 8.0 WLAN" +"SM-T385C" "Galaxy Tab A (2017) 8.0 LTE" +"SM-T590" "Galaxy Tab A (2018) 10.5 WLAN" +"SM-T595C" "Galaxy Tab A (2018) 10.5 LTE" +"SM-T290" "Galaxy Tab A (2019) 8.0 WLAN" +"SM-T295C" "Galaxy Tab A (2019) 8.0 LTE" +"SM-T510" "Galaxy Tab A (2019) 10.1 WLAN" +"SM-T500" "Galaxy Tab A7 10.4 WLAN" +"SM-T505C" "Galaxy Tab A7 10.4 LTE" +"SM-T220" "Galaxy Tab A7 Lite 8.7 WLAN" +"SM-T225C" "Galaxy Tab A7 Lite 8.7 LTE" +"SM-X200" "Galaxy Tab A8 WLAN" +"SM-X205C" "Galaxy Tab A8 LTE" +"SM-X210" "Galaxy Tab A9+ WLAN" +"SM-X216C" "Galaxy Tab A9+ 5G" +"SM-T230" "Galaxy Tab4 7.0 WLAN" +"SM-T231" "Galaxy Tab4 7.0 3G" +"SM-T239C" "Galaxy Tab4 7.0 VE LTE" +"SM-T330" "Galaxy Tab4 8.0 WLAN" +"SM-T331" "Galaxy Tab4 8.0 3G" +"SM-T530" "Galaxy Tab4 10.1 WLAN" +"SM-T531" "Galaxy Tab4 10.1 3G" +"SM-T320" "Galaxy Tab PRO 8.4 WLAN" +"SM-T321" "Galaxy Tab PRO 8.4 3G" +"SM-T520" "Galaxy Tab PRO 10.1 WLAN" +"SM-W700" "Galaxy TabPro S WLAN" +"SM-R860" "Galaxy Watch4 藍牙版 40mm" +"SM-R870" "Galaxy Watch4 藍牙版 44mm" +"SM-R880" "Galaxy Watch4 Classic 藍牙版 42mm" +"SM-R890" "Galaxy Watch4 Classic 藍牙版 46mm" +"SM-R8950" "Galaxy Watch4 Classic LTE 46mm" +"SM-R900" "Galaxy Watch5 藍牙版 40mm" +"SM-R910" "Galaxy Watch5 藍牙版 44mm" +"SM-R9150" "Galaxy Watch5 LTE 44mm" +"SM-R920" "Galaxy Watch5 Pro 藍牙版 45mm" +"SM-R930" "Galaxy Watch6 藍牙版 40mm" +"SM-R940" "Galaxy Watch6 藍牙版 44mm" +"SM-R9450" "Galaxy Watch6 LTE 44mm" +"SM-R950" "Galaxy Watch6 Classic 藍牙版 43mm" +"SM-R960" "Galaxy Watch6 Classic 藍牙版 47mm" +"SM-R9650" "Galaxy Watch6 Classic LTE 47mm" +"ASUS_Z01QD" "ROG 遊戲手機" +"ASUS_I001DB" "ROG 遊戲手機 2" +"ASUS_I003DD" "ROG 遊戲手機 3" +"ASUS_I005DA" "騰訊 ROG 遊戲手機 5" +"ASUS_I005DB" "騰訊 ROG 遊戲手機 5 Pro" +"ASUS_I005DA" "騰訊 ROG 遊戲手機 5s" +"ASUS_I005DB" "騰訊 ROG 遊戲手機 5s Pro" +"ASUS_AI2201_A" "騰訊 ROG 遊戲手機 6" +"ASUS_AI2201_B" "騰訊 ROG 遊戲手機 6 Pro" +"ASUS_AI2203_A" "騰訊 ROG 遊戲手機 6 天璣版" +"ASUS_AI2203_B" "騰訊 ROG 遊戲手機 6 天璣至尊版" +"ASUS_AI2205_A" "騰訊 ROG 遊戲手機 7" +"ASUS_AI2205_B" "騰訊 ROG 遊戲手機 7 Pro" +"ASUS_I007D" "Smartphone for Snapdragon Insiders" +"SKR-A0" "黑鯊遊戲手機 全網通版" +"SKR-H0" "黑鯊遊戲手機 國際版" +"AWM-A0" "黑鯊遊戲手機 Helo" +"SKW-A0" "黑鯊遊戲手機 2 全網通版" +"SKW-H0" "黑鯊遊戲手機 2 國際版" +"DLT-A0" "黑鯊遊戲手機 2 Pro 全網通版" +"DLT-H0" "黑鯊遊戲手機 2 Pro 國際版" +"SHARK KLE-A0" "騰訊黑鯊遊戲手機 3 全網通版" +"SHARK KLE-H0" "黑鯊遊戲手機 3 國際版" +"SHARK MBU-A0" "騰訊黑鯊遊戲手機 3 Pro 全網通版" +"SHARK MBU-H0" "黑鯊遊戲手機 3 Pro 國際版" +"SHARK KLE-A0" "騰訊黑鯊遊戲手機 3S 全網通版" +"SHARK PRS-A0" "黑鯊 4 全網通版" +"SHARK PRS-H0" "黑鯊 4 國際版" +"SHARK KSR-A0" "黑鯊 4 Pro 全網通版" +"SHARK KSR-H0" "黑鯊 4 Pro 國際版" +"SHARK PRS-A0" "黑鯊 4S 全網通版" +"SHARK KSR-A0" "黑鯊 4S Pro 全網通版" +"SHARK PAR-A0" "黑鯊 5 全網通版 / 黑鯊 5 高能版" +"SHARK PAR-H0" "黑鯊 5 國際版" +"SHARK KSR-A0" "黑鯊 5 RS 全網通版" +"SHARK KTUS-A0" "黑鯊 5 Pro 全網通版" +"SHARK KTUS-H0" "黑鯊 5 Pro 國際版" +"G-2PW4100" "Pixel (North America)" +"G-2PW4200" "Pixel (Rest of the world)" +"G-2PW2100" "Pixel XL (North America)" +"G-2PW2200" "Pixel XL (Rest of the world)" +"G011A" "Pixel 2" +"G011C" "Pixel 2 XL" +"G013A" "Pixel 3" +"G013B" "Pixel 3 (Japan)" +"G013C" "Pixel 3 XL" +"G013D" "Pixel 3 XL (Japan)" +"G020E" "Pixel 3a (Verizon)" +"G020F" "Pixel 3a (UK, Europe, and APAC)" +"G020G" "Pixel 3a (North America)" +"G020H" "Pixel 3a (Japan)" +"G020A" "Pixel 3a XL (Verizon)" +"G020B" "Pixel 3a XL (UK, Europe, and APAC)" +"G020C" "Pixel 3a XL (North America)" +"G020D" "Pixel 3a XL (Japan)" +"G020I" "Pixel 4 (North America, TW)" +"G020M" "Pixel 4 (Rest of the world)" +"G020N" "Pixel 4 (Japan)" +"G020J" "Pixel 4 XL (North America, TW)" +"G020P" "Pixel 4 XL (Rest of the world)" +"G020Q" "Pixel 4 XL (Japan)" +"G025J" "Pixel 4a (North America, TW)" +"G025N" "Pixel 4a (Rest of the world)" +"G025M" "Pixel 4a (Japan)" +"G025E" "Pixel 4a 5G (North America, TW)" +"G6QU3" "Pixel 4a 5G (Verizon)" +"G025I" "Pixel 4a 5G (Rest of the world)" +"G025H" "Pixel 4a 5G (Japan)" +"GD1YQ" "Pixel 5 (US)" +"GTT9Q" "Pixel 5 (Rest of the world)" +"G5NZ6" "Pixel 5 (Japan)" +"G1F8F" "Pixel 5a 5G (US)" +"G4S1M" "Pixel 5a 5G (Japan)" +"G9S9B" "Pixel 6 (US, mmWave)" +"GB7N6" "Pixel 6 (Rest of the world)" +"GR1YH" "Pixel 6 (Japan)" +"G8VOU" "Pixel 6 Pro (US, AU) (mmWave)" +"GLUOG" "Pixel 6 Pro (Rest of the world)" +"GF5KQ" "Pixel 6 Pro (Japan)" +"GB62Z" "Pixel 6a (US, mmWave)" +"GX7AS" "Pixel 6a (North America, TW)" +"G1AZG" "Pixel 6a (Rest of the world)" +"GB17L" "Pixel 6a (Japan)" +"GQML3" "Pixel 7 (US, mmWave)" +"GVU6C" "Pixel 7 (Rest of the world)" +"G03Z5" "Pixel 7 (Japan)" +"GE2AE" "Pixel 7 Pro (US, AU) (mmWave)" +"GP4BC" "Pixel 7 Pro (Rest of the world)" +"GFE4J" "Pixel 7 Pro (Japan)" +"G0DZQ" "Pixel 7a (mmWave)" +"GWKK3" "Pixel 7a (North America, EU)" +"GHL1X" "Pixel 7a (Global)" +"G82U8" "Pixel 7a (Japan)" +"GKWS6" "Pixel 8 (mmWave)" +"G9BQD" "Pixel 8 (US, Sub 6GHz)" +"GPJ41" "Pixel 8 (Global)" +"GZPFO" "Pixel 8 (Japan)" +"G1MNW" "Pixel 8 Pro (mmWave)" +"GC3VE" "Pixel 8 Pro (Global)" +"GE9DP" "Pixel 8 Pro (Japan)" +"G9FPL" "Pixel Fold (US, EU)" +"G0B96" "Pixel Fold (Japan)" +"C1502W" "Pixel C" +"GTU8P" "Pixel Tablet" +"GQF4C" "Pixel Watch Bluetooth & Wi-Fi" +"GWT9R" "Pixel Watch LTE (US)" +"GBZ4S" "Pixel Watch LTE (Global)" +"G4TSL" "Pixel Watch 2 Bluetooth & Wi-Fi" +"GD2WG" "Pixel Watch 2 LTE (US)" +"GC3G8" "Pixel Watch 2 LTE (Global)" +"Lenovo L78012" "聯想 Z5" +"Lenovo L78031" "聯想 Z5 Pro" +"Lenovo L78032" "聯想 Z5 Pro GT" +"Lenovo L78071" "聯想 Z5s" +"Lenovo L78051" "聯想 Z6 Pro" +"Lenovo L79041" "聯想 Z6 Pro 5G" +"Lenovo L78121" "聯想 Z6" +"Lenovo L38111" "聯想 Z6 青春版" +"Lenovo K520" "聯想 S5" +"Lenovo K520t" "聯想 S5 移動版" +"Lenovo L58041" "聯想 S5 Pro" +"Lenovo L58091" "聯想 S5 Pro GT" +"Lenovo K350t" "聯想 K5" +"Lenovo L38012" "聯想 K5 Note" +"Lenovo L38011" "聯想 K5 Play" +"Lenovo L38021" "聯想 K5 Play 移動版" +"Lenovo L38031" "聯想 K5s" +"Lenovo L38041" "聯想 K5 Pro" +"Lenovo L38082" "聯想 K6 暢享版" +"Lenovo L18011" "聯想 A5" +"Lenovo K320t" "聯想 K320t" +"Lenovo L79031" "拯救者電競手機 Pro" +"Lenovo L70081" "拯救者電競手機 2 Pro" +"Lenovo L71091" "聯想拯救者 Y70" +"Lenovo L71061" "聯想拯救者 Y90" +"XT2081-4" "聯想樂檬 K12" +"XT2091-7" "聯想樂檬 K12 Pro" +"Z1221" "ZUK Z1" +"Z2131" "ZUK Z2" +"Z2122" "ZUK Z2 Pro" +"Z2151" "ZUK Edge" +"Lenovo TB-8804F" "聯想小新平板 8 英寸" +"Lenovo TB-X804F" "聯想小新平板 10 英寸" +"Lenovo TB-J606F" "聯想小新 Pad" +"TB128FU" "聯想小新 Pad 2022" +"TB331FC" "聯想小新 Pad 2024" +"Lenovo TB-J607F" "聯想小新 Pad Plus" +"Lenovo TB-J607Z" "聯想小新 Pad Plus 5G" +"TB350FU" "聯想小新 Pad Plus 2023" +"Lenovo TB-J706F" "聯想小新 Pad Pro 2020" +"Lenovo TB-J716F" "聯想小新 Pad Pro 2021" +"Lenovo TB-Q706F" "聯想小新 Pad Pro 12.6" +"TB138FC" "聯想小新 Pad Pro 2022 驍龍版" +"TB132FU" "聯想小新 Pad Pro 2022 迅鯤版" +"TB371FC" "聯想小新 Pad Pro 12.7 驍龍版" +"TB370FU" "聯想小新 Pad Pro 12.7 天璣版" +"TB372FC" "聯想小新學習平板 12.7" +"Lenovo YT3-850F" "聯想 YOGA Tab 3 8」 Wi-Fi 版" +"Lenovo YT3-850L" "聯想 YOGA Tab 3 8」 LTE 版" +"Lenovo YT3-X50F" "聯想 YOGA Tab 3 10」 Wi-Fi 版" +"Lenovo YT3-X50L" "聯想 YOGA Tab 3 10」 LTE 版" +"Lenovo YT-X703F" "聯想 YOGA Tab 3 Plus Wi-Fi 版" +"Lenovo YT-X703L" "聯想 YOGA Tab 3 Plus LTE 版" +"Lenovo YT3-X90F" "聯想 YOGA Tab 3 PRO 10」 Wi-Fi 版" +"Lenovo YT3-X90L" "聯想 YOGA Tab 3 PRO 10」 LTE 版" +"Lenovo YT-K606F" "聯想 YOGA Pad Pro" +"SP101FU" "聯想 YOGA Paper 墨水平板" +"Lenovo TB-9707F" "聯想拯救者 Y700 (2022)" +"TB320FC" "聯想拯救者 Y700 (2023)" +"TB570FU" "聯想拯救者 Y900" +"Lenovo TB-J616F" "聯想天驕平板電腦" +"Lenovo TB-8504F" "聯想 TAB4 8 英寸 Wi-Fi 版" +"Lenovo TB-8504N" "聯想 TAB4 8 英寸 LTE 版" +"Lenovo TB-8X04F" "聯想 TAB4 8 英寸 REL" +"Lenovo TB-X304F" "聯想 TAB4 10.1 英寸 Wi-Fi 版" +"Lenovo TB-X304N" "聯想 TAB4 10.1 英寸 LTE 版" +"Lenovo TB-X504F" "聯想 TAB4 10.1 英寸 REL" +"Lenovo TB-8704F" "聯想 TAB4 Plus 8 英寸 Wi-Fi 版" +"Lenovo TB-8704N" "聯想 TAB4 Plus 8 英寸 LTE 版" +"Lenovo TB-X704F" "聯想 TAB4 Plus 10.1 英寸 Wi-Fi 版" +"Lenovo TB-X704N" "聯想 TAB4 Plus 10.1 英寸 LTE 版" +"Lenovo TB-8705F" "聯想 M8 8 英寸 Wi-Fi 版" +"Lenovo TB-8705N" "聯想 M8 8 英寸 LTE 版" +"Lenovo TB-8505F" "聯想 M8 8 英寸 Wi-Fi 版 (商用)" +"Lenovo TB-8505N" "聯想 M8 8 英寸 LTE 版 (商用)" +"Lenovo TB-X306FC" "聯想 M10 HD 10.1 英寸 Wi-Fi 版" +"Lenovo TB-X306NC" "聯想 M10 HD 10.1 英寸 LTE 版" +"Lenovo TB-X605FC" "聯想 M10 FHD-REL 10.1 英寸 Wi-Fi 版" +"Lenovo TB-X605LC" "聯想 M10 FHD-REL 10.1 英寸 LTE 版" +"Lenovo TB-X606F" "聯想 M10 PLUS 10.3 英寸 Wi-Fi 版" +"Lenovo TB-X616F" "聯想平板 TB-X616F 10.3 英寸 Wi-Fi 版" +"TB310FU" "聯想啟天 K9 9 英寸 Wi-Fi 版" +"TB310XC" "聯想啟天 K9 9 英寸 LTE 版" +"Lenovo TB-X6C6F" "聯想啟天 K10 10.3 英寸 Wi-Fi 版" +"Lenovo TB-X6C6X" "聯想啟天 K10 10.3 英寸 LTE 版" +"TB223FC" "聯想啟天 K10 Pro 10.61 英寸 Wi-Fi 版" +"TB226XC" "聯想啟天 K10 Pro 10.61 英寸 LTE 版" +"TB360ZU" "聯想啟天 K10 Pro 10.61 英寸 5G 版" +"Lenovo TB-J6C6F" "聯想啟天 K11 11 英寸 Wi-Fi 版" +"Lenovo TB-J6C6X" "聯想啟天 K11 11 英寸 LTE 版" +"Lenovo TB-J607Z" "聯想啟天 K11 Pro 5G" +"TB230FC" "聯想啟天 K11 Gen2 11.5 英寸 Wi-Fi 版" +"TB230XC" "聯想啟天 K11 Gen2 11.5 英寸 LTE 版" +"TB240FC" "聯想啟天 K12 12.7 英寸 Wi-Fi 版" +"SP523FC" "聯想啟天 SmartPaper 10.3 英寸 Wi-Fi 版" +"Lenovo TB-X6E6F" "Lenovo Tab K10 10.3 英寸 Wi-Fi 版" +"Lenovo TB-X6E6X" "Lenovo Tab K10 10.3 英寸 LTE 版" +"Lenovo TB-J606F" "Lenovo Tab K11 11 英寸 Wi-Fi 版" +"Lenovo TB-J606N" "Lenovo Tab K11 11 英寸 LTE 版" +"M8" "魅族 M8" +"M8SE" "魅族 M8 SE" +"M9" "魅族 M9" +"M030" "魅族 MX 雙核" +"M031" "魅族 MX 雙核新版" +"M032" "魅族 MX 四核" +"M040" "魅族 MX2 聯通版" +"M045" "魅族 MX2 移動版" +"M351" "魅族 MX3 聯通版 (16GB)" +"M353" "魅族 MX3 聯通版 (32GB/64GB)" +"M355" "魅族 MX3 移動版 (16GB)" +"M356" "魅族 MX3 移動版 (32GB/64GB)" +"M460" "魅族 MX4 移動版" +"M460A" "魅族 MX4 YunOS 版" +"M461" "魅族 MX4 聯通版" +"M460H" "魅族 MX4 國際版" +"M462" "魅族 MX4 Pro 移動版" +"M462U" "魅族 MX4 Pro 聯通版" +"M462H" "魅族 MX4 Pro 國際版" +"M575" "魅族 MX5 公開版" +"M575M" "魅族 MX5 移動版" +"M575U" "魅族 MX5 聯通版" +"M575H" "魅族 MX5 國際版" +"M685Q" "魅族 MX6 公開版" +"M685M" "魅族 MX6 移動版" +"M685U" "魅族 MX6 聯通版" +"M685C" "魅族 MX6 電信版" +"M685H" "魅族 MX6 國際版" +"M576" "魅族 PRO 5 公開版" +"M576U" "魅族 PRO 5 聯通版" +"M576H" "魅族 PRO 5 國際版" +"M570Q" "魅族 PRO 6 公開版" +"M570M" "魅族 PRO 6 移動版" +"M570C" "魅族 PRO 6 電信版" +"M570H" "魅族 PRO 6 國際版" +"M570Q-S" "魅族 PRO 6s" +"M686" "魅族 PRO 6 Plus (64GB)" +"M686G" "魅族 PRO 6 Plus (128GB)" +"M686H" "魅族 PRO 6 Plus 國際版" +"M792Q-L" "魅族 PRO 7 公開版 (64GB)" +"M792M-L" "魅族 PRO 7 移動版 (64GB)" +"M792C-L" "魅族 PRO 7 電信版 (64GB)" +"M792H" "魅族 PRO 7 國際版" +"M792Q" "魅族 PRO 7 公開版 (128GB)" +"M792C" "魅族 PRO 7 電信版 (128GB)" +"M793Q" "魅族 PRO 7 Plus 公開版" +"M793H" "魅族 PRO 7 Plus 國際版" +"M881Q" "魅族 15 公開版" +"M881M" "魅族 15 移動版" +"M881H" "魅族 15 國際版" +"M891Q" "魅族 15 Plus 公開版" +"M891H" "魅族 15 Plus 國際版" +"M871Q" "魅族 M15 公開版" +"M871H" "魅族 15 Lite 國際版" +"M882Q" "魅族 16th 公開版" +"M882H" "魅族 16th 國際版" +"M892Q" "魅族 16th Plus 公開版" +"M872Q" "魅族 16 X 公開版" +"M872H" "魅族 16 國際版" +"M971Q" "魅族 16s 公開版" +"M971H" "魅族 16s 國際版" +"M926Q" "魅族 16Xs 公開版" +"M926H" "魅族 16Xs 國際版" +"M973Q" "魅族 16s Pro 公開版" +"M928Q" "魅族 16T 公開版" +"M081Q" "魅族 17 公開版" +"M081M" "魅族 17 運營商定制版" +"M091Q" "魅族 17 Pro 公開版" +"M091M" "魅族 17 Pro 運營商定制版" +"M181Q" "魅族 18" +"M191Q" "魅族 18 Pro" +"M172Q" "魅族 18X" +"M182Q" "魅族 18s" +"M192Q" "魅族 18s" +"M381Q" "魅族 20 / 魅族 20 Classic" +"M391Q" "魅族 20 PRO" +"M392Q" "魅族 20 INFINITY 無界版" +"M461Q" "魅族 21" +"M852Q" "魅族 X8 公開版" +"M852H" "魅族 X8 國際版" +"M813Q" "魅族 V8 高配版" +"M813H" "魅族 M8 國際版" +"M816Q" "魅族 V8 標配版" +"M816H" "魅族 M8 Lite 國際版" +"M822Q" "魅族 Note8 公開版" +"M822H" "魅族 Note8 國際版" +"M923Q" "魅族 Note9 公開版" +"M923H" "魅族 Note9 國際版" +"M810H" "魅族 M8c 國際版" +"M818H" "魅族 C9 國際版" +"M819H" "魅族 C9 Pro 國際版" +"M918H" "魅族 M10 國際版" +"M463M" "魅藍 note 移動版" +"M463U" "魅藍 note 聯通版" +"M463C" "魅藍 note 電信版" +"M463H" "魅族 m1 note 國際版" +"M571" "魅藍 note2 公開版" +"M571M" "魅藍 note2 移動版" +"M571U" "魅藍 note2 聯通版" +"M571C" "魅藍 note2 電信版" +"M571H" "魅族 m2 note 國際版" +"L681Q" "魅藍 Note3 公開版" +"L681M" "魅藍 Note3 移動版" +"L681C" "魅藍 Note3 電信版" +"L681H" "魅族 M3 note 國際版" +"M621Q" "魅藍 Note5 公開版" +"M621M" "魅藍 Note5 移動版" +"M621C-S" "魅藍 Note5 電信版" +"M621H" "魅族 M5 Note 國際版" +"M721Q" "魅藍 Note6 公開版" +"M721M" "魅藍 Note6 移動版" +"M721C" "魅藍 Note6 電信版" +"M721H" "魅族 M6 Note 國際版" +"A680Q" "魅藍 E 公開版" +"A680M" "魅藍 E 移動版" +"A680H" "魅族 M3E 國際版" +"M741A" "魅藍 E2 公開版" +"M741Y" "魅藍 E2 移動版" +"M851Q" "魅藍 E3 公開版" +"M851M" "魅藍 E3 移動版" +"M682Q" "魅藍 X" +"M465M" "魅藍 移動版" +"M465A" "魅藍 YunOS 版" +"M578" "魅藍 2 公開版" +"M578A" "魅藍 2 YunOS 公開版" +"M578M" "魅藍 2 移動版" +"M578MA" "魅藍 2 YunOS 移動版" +"M578U" "魅藍 2 聯通版" +"M578C" "魅藍 2 電信版" +"M578CA" "魅藍 2 YunOS 電信版" +"M578CE" "魅藍 2 電信定制版" +"M578H" "魅族 m2 國際版" +"M688Q" "魅藍 3 公開版" +"M688M" "魅藍 3 移動定制版" +"M688U" "魅藍 3 聯通版" +"M688C" "魅藍 3 電信版" +"Y685Q" "魅藍 3s 公開版" +"Y685M" "魅藍 3s 移動版" +"Y685C" "魅藍 3s 電信版" +"Y685H" "魅族 M3s 國際版" +"M611A" "魅藍 5 公開版" +"M611Y" "魅藍 5 移動版" +"M611D" "魅藍 5 電信版" +"M611H" "魅族 M5 國際版" +"M612Q" "魅藍 5s 公開版" +"M612M" "魅藍 5s 移動版" +"M612C" "魅藍 5s 電信版" +"M612H" "魅族 M5s 國際版" +"M711Q" "魅藍 6 公開版" +"M711M" "魅藍 6 移動版" +"M711C" "魅藍 6 電信版" +"M711H" "魅族 M6 國際版" +"M712Q-B" "魅藍 S6 公開版" +"M712M" "魅藍 S6 移動版" +"M712C" "魅藍 S6 電信版" +"M712H" "魅族 M6s 國際版" +"M811Q" "魅藍 6T 公開版" +"M811H" "魅族 M6T 國際版" +"M2110" "魅藍 10" +"M2111" "魅藍 10s" +"S685Q" "魅藍 Max 公開版" +"S685M" "魅藍 Max 移動版" +"S685C" "魅藍 Max 電信版" +"S685H" "魅族 M3 Max 國際版" +"U680A" "魅藍 U10 公開版" +"U680Y" "魅藍 U10 移動版" +"U680D" "魅藍 U10 電信版" +"U680H" "魅藍 U10 國際版" +"U685Q" "魅藍 U20 公開版" +"U685M" "魅藍 U20 移動版" +"U685C" "魅藍 U20 電信版" +"U685H" "魅藍 U20 國際版" +"M57A" "魅藍 metal 公開版" +"M57AM" "魅藍 metal 移動版" +"M57AU" "魅藍 metal 聯通版" +"M57AC" "魅藍 metal 電信版" +"M710M" "魅藍 A5 移動定制版" +"M710H" "魅族 M5c 國際版" +"XT1085" "Moto X" +"XT1079" "Moto G LTE 移動/聯通版" +"XT1077" "Moto G LTE 電信/聯通版" +"XT1115" "Moto X Pro" +"XT1570" "Moto X Style" +"XT1561" "Moto X Play" +"XT1581" "Moto X 極" +"XT1635-03" "Moto Z Play" +"XT1662" "Moto M" +"XT1650-05" "Moto Z" +"XT1710-08" "Moto Z2 Play" +"XT1710-11" "Moto Z2 Play 移動定制版" +"XT1799-2" "moto 青柚" +"XT1789-05" "moto Z 2018" +"XT1925-10" "moto 青柚 1s" +"XT1929-15" "motorola Z3" +"XT1924-9" "motorola e5 plus" +"XT1943-1" "motorola p30" +"XT1942-1" "motorola p30 note" +"XT1941-2" "motorola p30 play" +"XT1965-6" "motorola g7 plus" +"XT1970-5" "motorola p50" +"XT2071-4" "motorola razr 5G" +"XT2125-4" "motorola edge s" +"XT2143-1" "motorola edge 輕奢版" +"XT2153-1" "motorola edge s pro" +"XT2137-2" "motorola g50" +"XT2171-3" "moto g51" +"XT2169-2" "moto g71" +"XT2225-2" "moto g71s" +"XT2175-2" "moto edge S30" +"XT2201-2" "moto edge X30" +"XT2201-6" "moto edge X30 屏下攝像版" +"XT2241-1" "moto X30 Pro" +"XT2243-2" "moto S30 Pro" +"XT2251-1" "moto razr 2022" +"XT2301-5" "moto X40" +"XT2335-3" "moto g53" +"XT2323-3" "moto razr 40" +"XT2321-2" "moto razr 40 Ultra" +"XT2343-3" "moto g54" +"TA-1000" "Nokia 6" +"TA-1054" "Nokia 6 (第二代)" +"TA-1041" "Nokia 7" +"TA-1062" "Nokia 7 Plus" +"TA-1042" "Nokia 8 Sirocco" +"TA-1094" "Nokia 9 PureView" +"TA-1109" "Nokia X5" +"TA-1099" "Nokia X6" +"TA-1131" "Nokia X7" +"TA-1172" "Nokia X71" +"TA-1117" "Nokia 3.1 Plus" +"TA-1335" "Nokia C1 Plus" +"TA-1258" "Nokia C3" +"TA-1388" "Nokia C20 Plus" +"TA-1361" "Nokia G50" +"TA-1392" "Nokia T20" +"TA-1511" "Nokia C31" +"A063" "Nothing Phone (1)" +"A065" "Nothing Phone (2) Global" +"AIN065" "Nothing Phone (2) India" +"NX501" "nubia Z5" +"NX402" "nubia Z5 mini" +"NX503J" "nubia Z5S" +"NX403A" "nubia Z5S mini" +"NX506J" "nubia Z7" +"NX507J" "nubia Z7 mini 全網通版" +"NX507H" "nubia Z7 mini 雙 4G 版" +"NX505J" "nubia Z7 Max 全網通版" +"NX505H" "nubia Z7 Max 雙 4G 版" +"NX508J" "nubia Z9 全網通版" +"NX508H" "nubia Z9 雙 4G 版" +"NX511J" "nubia Z9 mini 全網通版" +"NX511H" "nubia Z9 mini 雙 4G 版" +"NX510J" "nubia Z9 Max 全網通版" +"NX512H" "nubia Z9 Max 雙 4G 版" +"NX512J" "nubia Z9 Max 極速版" +"NX518J" "nubia Z9 Max 精英版" +"NX531J" "nubia Z11" +"NX529J" "nubia Z11 mini" +"NX523J" "nubia Z11 Max" +"NX535J" "nubia Z11 Max 經典版" +"NX549J" "nubia Z11 miniS" +"NX563J" "nubia Z17" +"NX591J" "nubia Z17 暢享版" +"NX569J" "nubia Z17 mini 標準版" +"NX569H" "nubia Z17 mini 高配版" +"NX595J" "nubia Z17S" +"NX589J" "nubia Z17 miniS" +"NX606J" "nubia Z18" +"NX611J" "nubia Z18 mini" +"NX627J" "nubia Z20" +"NX667J" "nubia Z30 Pro" +"NX701J" "nubia Z40 Pro" +"NX702J" "nubia Z40S Pro" +"NX711J" "nubia Z50 / nubia Z50S" +"NX712J" "nubia Z50 Ultra" +"NX713J" "nubia Z50S Pro" +"NX601J" "nubia X6" +"NX616J" "nubia X" +"NX612J" "nubia V18" +"NX651J" "nubia Play" +"NX513J" "nubia My 布拉格 全網通版" +"NX513H" "nubia My 布拉格 雙 4G 版" +"NX551J" "nubia M2" +"NX573J" "nubia M2 青春版" +"NX907J" "nubia M2 暢玩版" +"NX541J" "nubia N1" +"NX575J" "nubia N2" +"NX617J" "nubia N3" +"NX301J" "nubia N5" +"LPD-20W" "nubia Pad 3D" +"NX609J" "紅魔電競遊戲手機" +"NX619J" "紅魔 Mars 電競手機" +"NX629J" "紅魔 3" +"NX629J" "紅魔 3S" +"NX659J" "紅魔 5G" +"NX659J" "紅魔 5S" +"NX669J" "騰訊紅魔遊戲手機 6" +"NX669J-P" "騰訊紅魔遊戲手機 6 Pro" +"NX666J" "騰訊紅魔遊戲手機 6R" +"NX669J-S" "騰訊紅魔遊戲手機 6S Pro" +"NX679J" "紅魔 7" +"NX709J" "紅魔 7 Pro" +"NX679S" "紅魔 7S" +"NX709S" "紅魔 7S Pro" +"NX729J" "紅魔 8 Pro / 紅魔 8 Pro+" +"NX729S" "紅魔 8S Pro / 紅魔 8S Pro+" +"NX769J" "紅魔 9 Pro / 紅魔 9 Pro+" +"NP01J" "紅魔電競平板 5G" +"ONE A0001" "OnePlus One 移動版" +"ONE A1001" "OnePlus One 聯通版" +"ONE A2001" "OnePlus 2" +"ONE A2003" "OnePlus 2 國際版" +"ONE A2005" "OnePlus 2 北美版" +"ONE E1001" "OnePlus X 移動/聯通版" +"ONE E1000" "OnePlus X 全網通版" +"ONE E1003" "OnePlus X 國際版" +"ONE E1005" "OnePlus X 北美版" +"ONEPLUS A3000" "OnePlus 3 全網通版" +"ONEPLUS A3003" "OnePlus 3 國際版" +"ONEPLUS A3010" "OnePlus 3T 全網通版" +"ONEPLUS A3013" "OnePlus 3T 國際版" +"ONEPLUS A5000" "OnePlus 5 全網通版" +"ONEPLUS A5010" "OnePlus 5T 全網通版" +"ONEPLUS A6000" "OnePlus 6 全網通版" +"ONEPLUS A6003" "OnePlus 6 國際版" +"ONEPLUS A6010" "OnePlus 6T 全網通版" +"ONEPLUS A6013" "OnePlus 6T 國際版" +"GM1900" "OnePlus 7 全網通版" +"GM1901" "OnePlus 7 印度版" +"GM1903" "OnePlus 7 歐洲版" +"GM1905" "OnePlus 7 北美版/國際版" +"GM1910" "OnePlus 7 Pro 全網通版" +"GM1911" "OnePlus 7 Pro 印度版" +"GM1913" "OnePlus 7 Pro 歐洲版" +"GM1915" "OnePlus 7 Pro 北美版/國際版" +"GM1917" "OnePlus 7 Pro T-Mobile 版" +"GM1920" "OnePlus 7 Pro 5G 歐洲版" +"GM1925" "OnePlus 7 Pro 5G Sprint 版" +"HD1900" "OnePlus 7T 全網通版" +"HD1901" "OnePlus 7T 印度版" +"HD1903" "OnePlus 7T 歐洲版" +"HD1905" "OnePlus 7T 北美版/國際版" +"HD1907" "OnePlus 7T T-Mobile 版" +"HD1910" "OnePlus 7T Pro 全網通版" +"HD1911" "OnePlus 7T Pro 印度版" +"HD1913" "OnePlus 7T Pro 歐洲版/國際版" +"HD1925" "OnePlus 7T Pro 5G T-Mobile 版 / OnePlus Concept One" +"IN2010" "OnePlus 8 全網通版" +"IN2011" "OnePlus 8 印度版" +"IN2013" "OnePlus 8 歐洲版" +"IN2015" "OnePlus 8 北美版/國際版" +"IN2017" "OnePlus 8 T-Mobile 版" +"IN2019" "OnePlus 8 Visible 版/Verizon 版" +"IN2020" "OnePlus 8 Pro 全網通版" +"IN2021" "OnePlus 8 Pro 印度版" +"IN2023" "OnePlus 8 Pro 歐洲版" +"IN2025" "OnePlus 8 Pro 北美版/國際版" +"KB2000" "OnePlus 8T 全網通版" +"KB2001" "OnePlus 8T 印度版" +"KB2003" "OnePlus 8T 歐洲版" +"KB2005" "OnePlus 8T 北美版/國際版" +"KB2007" "OnePlus 8T+ T-Mobile 版" +"LE2100" "OnePlus 9R 全網通版" +"LE2101" "OnePlus 9R 印度版" +"LE2110" "OnePlus 9 全網通版" +"LE2111" "OnePlus 9 印度版" +"LE2113" "OnePlus 9 歐洲版" +"LE2115" "OnePlus 9 北美版/國際版" +"LE2117" "OnePlus 9 T-Mobile 版" +"LE2119" "OnePlus 9 Verzion 版" +"LE2120" "OnePlus 9 Pro 全網通版" +"LE2121" "OnePlus 9 Pro 印度版" +"LE2123" "OnePlus 9 Pro 歐洲版" +"LE2125" "OnePlus 9 Pro 北美版/國際版" +"LE2127" "OnePlus 9 Pro T-Mobile 版" +"MT2110" "OnePlus 9RT 全網通版" +"MT2111" "OnePlus 9RT 印度版" +"NE2210" "OnePlus 10 Pro 全網通版" +"NE2211" "OnePlus 10 Pro 印度版" +"NE2213" "OnePlus 10 Pro 歐洲版/國際版" +"NE2215" "OnePlus 10 Pro 北美版" +"NE2217" "OnePlus 10 Pro T-Mobile 版" +"PGKM10" "OnePlus Ace 全網通版" +"CPH2423" "OnePlus 10R 印度版" +"CPH2411" "OnePlus 10R Endurance 印度版" +"PGZ110" "OnePlus Ace 競速版 全網通版" +"PGP110" "OnePlus Ace Pro 全網通版" +"CPH2413" "OnePlus 10T 印度版" +"CPH2415" "OnePlus 10T 歐洲版/國際版" +"CPH2417" "OnePlus 10T 北美版" +"CPH2419" "OnePlus 10T T-Mobile 版" +"PHB110" "OnePlus 11 全網通版" +"CPH2447" "OnePlus 11 印度版" +"CPH2449" "OnePlus 11 歐洲版/國際版" +"CPH2451" "OnePlus 11 北美版" +"PHK110" "OnePlus Ace 2 全網通版" +"CPH2487" "OnePlus 11R 印度版" +"PHP110" "OnePlus Ace 2V 全網通版" +"PJA110" "OnePlus Ace 2 Pro 全網通版" +"PJD110" "OnePlus 12 全網通版" +"PJE110" "OnePlus Ace 3 全網通版" +"AC2001" "OnePlus Nord 印度版" +"AC2003" "OnePlus Nord 歐洲版/國際版" +"DN2101" "OnePlus Nord 2 印度版" +"DN2103" "OnePlus Nord 2 歐洲版" +"CPH2399" "OnePlus Nord 2T 國際版" +"CPH2401" "OnePlus Nord 2T 印度版" +"CPH2491" "OnePlus Nord 3 印度版" +"CPH2493" "OnePlus Nord 3 歐洲版" +"EB2101" "OnePlus Nord CE 印度版" +"EB2103" "OnePlus Nord CE 歐洲版/國際版" +"IV2201" "OnePlus Nord CE 2 印度版" +"CPH2381" "OnePlus Nord CE 2 Lite 印度版" +"CPH2409" "OnePlus Nord CE 2 Lite 歐洲版/國際版" +"CPH2569" "OnePlus Nord CE 3 印度版" +"CPH2465" "OnePlus Nord CE 3 Lite 國際版" +"CPH2467" "OnePlus Nord CE 3 Lite 印度版" +"BE2025" "OnePlus Nord N10 Metro 版" +"BE2026" "OnePlus Nord N10 北美版" +"BE2029" "OnePlus Nord N10 歐洲版/國際版" +"BE2028" "OnePlus Nord N10 T-Mobile 版" +"BE2011" "OnePlus Nord N100 北美版" +"BE2012" "OnePlus Nord N100 T-Mobile 版" +"BE2013" "OnePlus Nord N100 國際版" +"BE2015" "OnePlus Nord N100 Metro 版" +"CPH2459" "OnePlus Nord N20" +"CPH2469" "OnePlus Nord 20 SE" +"CPH2515" "OnePlus Nord N30" +"DE2117" "OnePlus Nord N200 北美版" +"DE2118" "OnePlus Nord N200 T-Mobile 版" +"CPH2389" "OnePlus Nord N300" +"CPH2551" "OnePlus Open" +"OPD2203" "OnePlus Pad" +"OPD2304" "OnePlus Pad Go LTE" +"OPD2305" "OnePlus Pad Go Wi-Fi" +"E6683" "Xperia Z5 dual" +"E6883" "Xperia Z5 Premium" +"F8332" "Xperia XZ" +"G8142" "Xperia XZ Premium" +"G8232" "Xperia XZs" +"G8342" "Xperia XZ1" +"H4233" "Xperia XA2 Ultra" +"H8296" "Xperia XZ2" +"H8166" "Xperia XZ2 Premium" +"H9493" "Xperia XZ3" +"J9110" "Xperia 1" +"J9180" "Xperia 1 Professional Editon" +"J9210" "Xperia 5" +"I4293" "Xperia 10 Plus" +"XQ-AT72" "Xperia 1 II" +"XQ-AS72" "Xperia 5 II" +"XQ-BC72" "Xperia 1 III" +"XQ-BQ72" "Xperia 5 III" +"XQ-BE72" "Xperia PRO-I" +"XQ-CT72" "Xperia 1 IV" +"XQ-CQ72" "Xperia 5 IV" +"XQ-DQ72" "Xperia 1 V" +"XQ-DE72" "Xperia 5 V" diff --git a/tools/busybox b/tools/busybox new file mode 100644 index 0000000..9a8246d Binary files /dev/null and b/tools/busybox differ diff --git a/tools/classes.dex b/tools/classes.dex new file mode 100644 index 0000000..404af79 Binary files /dev/null and b/tools/classes.dex differ diff --git a/tools/keycheck b/tools/keycheck new file mode 100644 index 0000000..1972b71 Binary files /dev/null and b/tools/keycheck differ diff --git a/tools/tar b/tools/tar new file mode 100644 index 0000000..5da25b7 Binary files /dev/null and b/tools/tar differ diff --git a/tools/tools.sh b/tools/tools.sh new file mode 100644 index 0000000..92012a1 --- /dev/null +++ b/tools/tools.sh @@ -0,0 +1,1892 @@ +#!/system/bin/sh +shell_language="zh-TW" +MODDIR="$MODDIR" +MODDIR_NAME="${MODDIR##*/}" +tools_path="$MODDIR/tools" +Compression_rate=3 +script="${0##*/}" +if [[ ! -d $tools_path ]]; then + tools_path="${MODDIR%/*}/tools" + [[ ! -d $tools_path ]] && echo "$tools_path二進制目錄遺失" && EXIT="true" +fi +[[ ! -f $tools_path/zstd ]] && echo "$tools_path/zstd遺失" +[[ ! -f $tools_path/tar ]] && echo "$tools_path/tar遺失" +[[ ! -f $tools_path/classes.dex ]] && echo "$tools_path/classes.dex遺失" +[[ $conf_path != "" ]] && conf_path="$conf_path" || conf_path="$MODDIR/backup_settings.conf" +[[ ! -f $conf_path ]] && echo "$conf_path配置遺失" && exit 1 +echo "$(sed 's/true/1/g ; s/false/0/g' "$conf_path")">"$conf_path" +. "$conf_path" &>/dev/null +echoRgb() { + #轉換echo顏色提高可讀性 + if [[ $2 = 0 ]]; then + echo -e "\e[38;5;197m -$1\e[0m" + elif [[ $2 = 1 ]]; then + echo -e "\e[38;5;121m -$1\e[0m" + elif [[ $2 = 2 ]]; then + echo -e "\e[38;5;${rgb_c}m -$1\e[0m" + elif [[ $2 = 3 ]]; then + echo -e "\e[38;5;${rgb_b}m -$1\e[0m" + else + echo -e "\e[38;5;${rgb_a}m -$1\e[0m" + fi +} +[ "$rgb_a" = "" ] && rgb_a=214 +if [ "$(whoami)" != root ]; then + echoRgb "你是憨批?不給Root用你媽 爬" "0" + exit 1 +fi +abi="$(getprop ro.product.cpu.abi)" +case $abi in +arm64*) + if [[ $(getprop ro.build.version.sdk) -lt 24 ]]; then + echoRgb "設備Android $(getprop ro.build.version.release)版本過低 請升級至Android 8+" "0" + exit 1 + else + case $(getprop ro.build.version.sdk) in + 26|27|28) + echoRgb "設備Android $(getprop ro.build.version.release)版本偏低,無法確定腳本能正確的使用" "0" + ;; + esac + fi + ;; +*) + echoRgb "未知的架構: $abi" "0" + exit 1 + ;; +esac +id= +if [[ $id != "" && -d /data/user/0/com.tencent.mobileqq/files/aladdin_configs/$id ]]; then + exit 2 +fi +PATH="/sbin/.magisk/busybox:/system_ext/bin:/system/bin:/system/xbin:/vendor/bin:/vendor/xbin:/data/data/com.omarea.vtools/files/toolkit:/data/user/0/com.termux/files/usr/bin:/data/data/Han.GJK/files/usr/busybox" +if [[ -d $(magisk --path 2>/dev/null) ]]; then + PATH="$(magisk --path 2>/dev/null)/.magisk/busybox:$PATH" +else + echo "Magisk busybox Path does not exist" +fi +export PATH="$PATH" +backup_version="V15.7.8" +#tools_path="${tools_path/'/storage/emulated/'/'/data/media/'}" +filepath="/data/backup_tools" +busybox="$filepath/busybox" +busybox2="$tools_path/busybox" +#排除自身 +exclude=" +update +busybox_path +Device_List" +if [[ ! -d $filepath ]]; then + mkdir -p "$filepath" + [[ $? = 0 ]] && echoRgb "設置busybox環境中" +fi +[[ ! -f $tools_path/busybox_path ]] && touch "$tools_path/busybox_path" +if [[ $filepath != $(cat "$tools_path/busybox_path") ]]; then + [[ -d $(cat "$tools_path/busybox_path") ]] && rm -rf "$(cat "$tools_path/busybox_path")" + echoRgb "$filepath" >"$tools_path/busybox_path" +fi +#刪除無效軟連結 +find -L "$filepath" -maxdepth 1 -type l -exec rm -rf {} \; +if [[ -f $busybox && -f $busybox2 ]]; then + filesha256="$(sha256sum "$busybox" | cut -d" " -f1)" + filesha256_1="$(sha256sum "$busybox2" | cut -d" " -f1)" + if [[ $filesha256 != $filesha256_1 ]]; then + echoRgb "busybox sha256不一致 重新創立環境中" + rm -rf "$filepath"/* + fi +fi +find "$tools_path" -maxdepth 1 ! -path "$tools_path/tools.sh" -type f | egrep -v "$(echo $exclude | sed 's/ /\|/g')" | while read; do + File_name="${REPLY##*/}" + if [[ ! -f $filepath/$File_name ]]; then + cp -r "$REPLY" "$filepath" + chmod 0777 "$filepath/$File_name" + echoRgb "$File_name > $filepath/$File_name" + else + filesha256="$(sha256sum "$filepath/$File_name" | cut -d" " -f1)" + filesha256_1="$(sha256sum "$tools_path/$File_name" | cut -d" " -f1)" + if [[ $filesha256 != $filesha256_1 ]]; then + echoRgb "$File_name sha256不一致 重新創建" + cp -r "$REPLY" "$filepath" + chmod 0777 "$filepath/$File_name" + echoRgb "$File_name > $filepath/$File_name" + fi + fi +done +if [[ -f $busybox ]]; then + "$busybox" --list | while read; do + if [[ $REPLY != tar && ! -f $filepath/$REPLY ]]; then + ln -fs "$busybox" "$filepath/$REPLY" + fi + done +fi +export PATH="$filepath:$PATH" +export TZ=Asia/Taipei +export CLASSPATH="$tools_path/classes.dex:$tools_path/Control.dex" +zstd_sha256sum="6fb924c51e0d00ada3a65e44ae9dccff908911b6181bd3262ce669e599f2a025" +tar_sha256sum="3c605b1e9eb8283555225dcad4a3bf1777ae39c5f19a2c8b8943140fd7555814" +classesdex_sha256sum="c4f5e6155c6b927d5f002dbb21a975a716655bc5011ae7cf450563fb1ae0ca4f" +[[ $(sha256sum "$tools_path/zstd" | cut -d" " -f1) != $zstd_sha256sum ]] && echoRgb "zstd效驗失敗" "0" && exit 2 +[[ $(sha256sum "$tools_path/tar" | cut -d" " -f1) != $tar_sha256sum ]] && echoRgb "tar效驗失敗" "0" && exit 2 +[[ $(sha256sum "$tools_path/classes.dex" | cut -d" " -f1) != $classesdex_sha256sum ]] && echoRgb "classes.dex效驗失敗" "0" && exit 2 +TMPDIR="/data/local/tmp" +[[ ! -d $TMPDIR ]] && mkdir "$TMPDIR" +if [[ $(which busybox) = "" ]]; then + echoRgb "環境變量中沒有找到busybox 請在tools內添加一個\narm64可用的busybox\n或是安裝搞機助手 scene或是Magisk busybox模塊...." "0" + exit 1 +fi +if [[ $(which toybox | egrep -o "system") != system ]]; then + echoRgb "系統變量中沒有找到toybox" "0" + exit 1 +fi +LANG="$(getprop "persist.sys.locale")" +#下列為自定義函數 +alias appinfo="app_process /system/bin --nice-name=appinfo han.core.order.AppInfo $@" +alias down="app_process /system/bin --nice-name=down han.core.order.Down $@" +alias PayloadDumper="app_process /system/bin --nice-name=payload-dumper han.core.order.payload.PayloadDumper $@" +alias Operation_screen="app_process /system/bin screenoff.only.Control $@" +case $LANG in +*-CN | *-cn) + alias ts="app_process /system/bin --nice-name=appinfo han.core.order.ChineseConverter -s $@" ;; +*) + alias ts="app_process /system/bin --nice-name=appinfo han.core.order.ChineseConverter -t $@" ;; +esac +alias zstd="zstd --ultra -$Compression_rate -T0 -q --priority=rt" +alias LS="toybox ls -Zd" +alias lz4="zstd --ultra -$Compression_rate -T0 -q --priority=rt --format=lz4" +#[[ $1 = --help ]] && appinfo --help +#appinfo -o pn -u | while read; do +# cmd package install-existing "$REPLY" +#done +Set_back() { + return 1 +} +endtime() { + #計算總體切換時長耗費 + case $1 in + 1) starttime="$starttime1" ;; + 2) starttime="$starttime2" ;; + esac + endtime="$(date -u "+%s")" + duration="$(echo $((endtime - starttime)) | awk '{t=split("60 秒 60 分 24 時 999 天",a);for(n=1;n$a<|>$b<|>bs" >/dev/null 2>&1 +} +longToast() { + content query --uri content://ice.message/long/"$*" >/dev/null 2>&1 +} +get_version() { + while :; do + keycheck + case $? in + 42) + [[ $Select_user = true ]] && branch="$1" || branch=true + echoRgb "$1" "1" + ;; + 41) + [[ $Select_user = true ]] && branch="$2" || branch=false + echoRgb "$2" "0" + ;; + *) + echoRgb "keycheck錯誤" "0" + continue + ;; + esac + sleep 0.5 + break + done +} +isBoolean() { + nsx="$1" + if [[ $1 = 1 ]]; then + nsx=true + elif [[ $1 = 0 ]]; then + nsx=false + else + echoRgb "$MODDIR_NAME/backup_settings.conf $2=$1填寫錯誤,正確值1or0" "0" + exit 2 + fi +} +echo_log() { + if [[ $? = 0 ]]; then + echoRgb "$1成功" "1" + result=0 + else + echoRgb "$1失敗,過世了" "0" + Print "$1失敗,過世了" + result=1 + fi +} +process_name() { + pgrep -f "$1" | while read; do + kill -KILL "$REPLY" 2>/dev/null + done +} +kill_Serve() { + { + #process_name Tar + #process_name pv + #process_name Zstd + if [[ -e $TMPDIR/scriptTMP ]]; then + scriptname="$(cat "$TMPDIR/scriptTMP")" + echoRgb "腳本殘留進程,將殺死後退出腳本,請重新執行一次\n -殺死$scriptname" "0" + rm -rf "$TMPDIR/scriptTMP" + process_name "$scriptname" + exit + fi + } & + wait +} +Show_boottime() { + awk -F '.' '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("%d天%d時%d分%d秒",run_days,run_hour,run_minute,run_second)}' /proc/uptime 2>/dev/null +} +[[ -f /sys/block/sda/size ]] && ROM_TYPE="UFS" || ROM_TYPE="eMMC" +if [[ -f /proc/scsi/scsi ]]; then + UFS_MODEL="$(sed -n 3p /proc/scsi/scsi | awk '/Vendor/{print $2,$4}')" +else + if [[ $(cat "/sys/class/block/sda/device/inquiry" 2>/dev/null) != "" ]]; then + UFS_MODEL="$(cat "/sys/class/block/sda/device/inquiry")" + else + UFS_MODEL="unknown" + fi +fi +Open_apps="$(appinfo -d "(" -ed ")" -o anwb,pn -ta c 2>/dev/null)" +Open_apps2="$(echo "$Open_apps" | cut -f2 -d '(' | sed 's/)//g')" +[[ $(cat "$tools_path/Device_List" 2>/dev/null | egrep -w "$(getprop ro.product.model 2>/dev/null)" | awk -F'"' '{print $4}') != "" ]] && Device_name="$(cat "$tools_path/Device_List" | egrep -w "$(getprop ro.product.model 2>/dev/null)" | awk -F'"' '{print $4}')" || Device_name="$(getprop ro.product.model 2>/dev/null)" +Manager_version="$(su -v || echo 'null')" +echoRgb "---------------------SpeedBackup---------------------" +echoRgb "腳本路徑:$MODDIR\n -已開機:$(Show_boottime)\n -busybox路徑:$(which busybox)\n -busybox版本:$(busybox | head -1 | awk '{print $2}')\n -appinfo版本:$(appinfo --version)\n -腳本版本:$backup_version\n -管理器:$Manager_version\n -設備架構:$abi\n -品牌:$(getprop ro.product.brand 2>/dev/null)\n -型號:$Device_name($(getprop ro.product.device 2>/dev/null))\n -閃存顆粒:$UFS_MODEL($ROM_TYPE)\n -Android版本:$(getprop ro.build.version.release 2>/dev/null) SDK:$(getprop ro.build.version.sdk 2>/dev/null)\n -終端:$Open_apps\n -By@YAWAsau\n -Support: https://jq.qq.com/?_wv=1027&k=f5clPNC3" +Rename_script () { + Replace_file_name () { + find "$1" -maxdepth 1 -name "*.sh" -type f | while read ; do + MODDIR_NAME="${REPLY%/*}" + FILE_NAME="${REPLY##*/}" + echo "$MODDIR_NAME/$FILE_NAME" + mv "$REPLY" "$MODDIR_NAME/$(ts "$FILE_NAME")" + done + } + find "$1" -maxdepth 1 -name "*.sh" -type f -not -name "終止腳本.sh" -not -name "tools.sh" | while read ; do + Script_type="$(grep -o 'operate="[^"]*"' "$REPLY" 2>/dev/null | awk -F'=' '{print $2}' | tr -d '"' | head -1)" + case $Script_type in + backup|Getlist|backup_media|Restore|dumpname|check_file|convert|Restore3) touch_shell "$Script_type" "$REPLY" ;; + esac + done + case $LANG in + *-CN | *-cn) + [[ $shell_language = zh-TW ]] && Replace_file_name "$1" ;; + *) + [[ $shell_language != zh-TW ]] && Replace_file_name "$1" ;; + esac +} +touch_shell () { + if [[ $1 = Restore2 ]]; then + MODDIR_Path='${0%/*/*}' + conf_path='${0%/*/*}/backup_settings.conf' + elif [[ $1 = backup ]]; then + MODDIR_Path='${0%/*/*/*}' + else + MODDIR_Path='${0%/*}' + fi + echo "if [ -f \"$MODDIR_Path/tools/tools.sh\" ]; then\n MODDIR=\"\${0%/*}\"\n operate=\"$1\"\n conf_path=\"$conf_path\"\n . \"$MODDIR_Path/tools/tools.sh\" | tee \"\$MODDIR/log.txt\"\nelse\n echo \"$MODDIR_Path/tools/tools.sh遺失\"\nfi" >"$2" +} +update_script() { + [[ $zipFile = "" ]] && zipFile="$(find "$MODDIR" -maxdepth 1 -name "*.zip" -type f 2>/dev/null)" + if [[ $zipFile != "" ]]; then + case $(echo "$zipFile" | wc -l) in + 1) + if [[ $(unzip -l "$zipFile" | awk '{print $4}' | egrep -o "^backup_settings.conf$") != "" ]]; then + unzip -o "$zipFile" -j "tools/tools.sh" -d "$MODDIR" &>/dev/null + shell_language="$(grep -o 'shell_language="[^"]*"' "$MODDIR/tools.sh" 2>/dev/null | awk -F'=' '{print $2}' | tr -d '"' | head -1)" + if [[ $(expr "$(echo "$backup_version" | tr -d "a-zA-Z")" \> "$(awk '/backup_version/{print $1}' "$MODDIR/tools.sh" | cut -f2 -d '=' | head -1 | sed 's/\"//g' | tr -d "a-zA-Z")") -eq 0 ]]; then + case $MODDIR in + *Backup_*) + if [[ -f $MODDIR/app_details ]]; then + echoRgb "請在${MODDIR%/*}更新腳本" "0" + rm -rf "$MODDIR/tools.sh" + exit 2 + fi ;; + esac + echoRgb "從$zipFile更新" + cp -r "$tools_path" "$TMPDIR" && rm -rf "$tools_path" + unzip -o "$zipFile" tools/* -d "$MODDIR" | sed 's/inflating/釋放/g ; s/creating/創建/g ; s/Archive/解壓縮/g' + echo_log "解壓縮${zipFile##*/}" + if [[ $result = 0 ]]; then + ts -f "$MODDIR/backup_settings.conf" -o "$MODDIR/backup_settings.conf" + case $LANG in + *-CN | *-cn) + if [[ $shell_language = zh-TW ]]; then + ts -f "$MODDIR/tools/Device_List" -o "$MODDIR/tools/Device_List" + ts -f "$MODDIR/tools/tools.sh" -o "$MODDIR/tools/tools.sh" && sed -i 's/shell_language=\"zh-TW\"/shell_language=\"zh-CN\"/g' "$MODDIR/tools/tools.sh" + [[ $? = 0 ]] && echoRgb "轉換簡體中文腳本完成" + fi ;; + *) + if [[ $shell_language != zh-TW ]]; then + ts -f "$MODDIR/tools/Device_List" -o "$MODDIR/tools/Device_List" + ts -f "$MODDIR/tools/tools.sh" -o "$MODDIR/tools/tools.sh" && sed -i 's/shell_language=\"zh-CN\"/shell_language=\"zh-TW\"/g' "$MODDIR/tools/tools.sh" + [[ $? = 0 ]] && echoRgb "轉換繁體中文腳本完成" + fi ;; + esac + case $MODDIR in + *Backup_*) + if [[ ! -f $MODDIR/app_details ]]; then + echoRgb "更新當前${MODDIR##*/}/tools" + Rename_script "$MODDIR" + if [[ -d ${MODDIR%/*}/tools ]]; then + echoRgb "更新${MODDIR%/*}/tools" + rm -rf "${MODDIR%/*}/tools" + cp -r "$tools_path" "${MODDIR%/*}" + Rename_script "${MODDIR%/*}" + ts -f "${MODDIR%/*}/backup_settings.conf" -o "${MODDIR%/*}/backup_settings.conf" + fi + find "$MODDIR" -maxdepth 1 -name "app_details" -type f 2>/dev/null | sort | while read; do + MODDIR_NAME="${REPLY%/*}" + [[ -f $MODDIR_NAME/recover.sh ]] && touch_shell "Restore2" "$MODDIR_NAME/recover.sh" + [[ $MODDIR_NAME/backup.sh ]] && echo 'if [ -f "${0%/*/*/*}/tools/tools.sh" ]; then\n MODDIR="${0%/*/*/*}"\n operate="backup"\n conf_path="${0%/*/*/*}/backup_settings.conf"\n [[ ! -f $conf_path ]] && echo "$conf_path遺失"\n backup_mode=1\n . "${0%/*}/app_details" &>/dev/null\n . "${0%/*/*/*}/tools/tools.sh" | tee "$MODDIR/log.txt"\nelse\n echo "${0%/*/*}/tools/tools.sh遺失"\nfi' >"$MODDIR_NAME/backup.sh" + done + fi + ;; + *) + Rename_script "$MODDIR" + if [[ $(find "$MODDIR" -maxdepth 1 -name "Backup_*" -type d) != "" ]]; then + find "$MODDIR" -maxdepth 1 -name "Backup_*" -type d | while read backup_path; do + if [[ -d $backup_path && $backup_path != $MODDIR ]]; then + echoRgb "更新當前tools目錄+${backup_path##*/}/tools" + rm -rf "$backup_path/tools" + cp -r "$tools_path" "$backup_path" + cp -r "$MODDIR/終止腳本.sh" "$backup_path" + Rename_script "$backup_path" + ts -f "$backup_path/backup_settings.conf" -o "$backup_path/backup_settings.conf" + find "$backup_path" -maxdepth 2 -name "app_details" -type f 2>/dev/null | sort | while read; do + MODDIR_NAME="${REPLY%/*}" + [[ -f $MODDIR_NAME/recover.sh ]] && touch_shell "Restore2" "$MODDIR_NAME/recover.sh" + [[ $MODDIR_NAME/backup.sh ]] && echo 'if [ -f "${0%/*/*/*}/tools/tools.sh" ]; then\n MODDIR="${0%/*/*/*}"\n operate="backup"\n conf_path="${0%/*/*/*}/backup_settings.conf"\n [[ ! -f $conf_path ]] && echo "$conf_path遺失"\n backup_mode=1\n . "${0%/*}/app_details" &>/dev/null\n . "${0%/*/*/*}/tools/tools.sh" | tee "$MODDIR/log.txt"\nelse\n echo "${0%/*/*}/tools/tools.sh遺失"\nfi' >"$MODDIR_NAME/backup.sh" + done + fi + done + else + echoRgb "更新當前${MODDIR##*/}/tools" + fi + ;; + esac + else + cp -r "$TMPDIR/tools" "$MODDIR" + fi + rm -rf "$TMPDIR"/* "$zipFile" "$MODDIR/tools.sh" + echoRgb "更新完成 請重新執行腳本" "2" + exit + else + echoRgb "${zipFile##*/}版本低於當前版本,自動刪除" "0" + rm -rf "$zipFile" "$MODDIR/tools.sh" + fi + fi + ;; + *) + echoRgb "錯誤 請刪除當前目錄多餘zip\n -保留一個最新的數據備份.zip\n -下列為當前目錄zip\n$zipFile" "0" + exit 1 + ;; + esac + fi + unset NAME +} +update_script +zipFile="$(ls -t /storage/emulated/0/Download/*.zip 2>/dev/null | head -1)" +zipFile2="$(ls -t "$MODDIR"/*.zip 2>/dev/null | head -1)" +if [[ $zipFile2 != "" ]]; then + PayloadDumper -o "$MODDIR/ROM" "$zipFile2" + exit +fi + +if [[ $(unzip -l "$zipFile" 2>/dev/null | awk '{print $4}' | egrep -wo "^backup_settings.conf$") != "" ]]; then + update_script +else + zipFile="$(ls -t /storage/emulated/0/Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/*.zip 2>/dev/null | head -1)" + [[ $(unzip -l "$zipFile" 2>/dev/null | awk '{print $4}' | egrep -wo "^backup_settings.conf$") != "" ]] && update_script +fi +case $operate in +backup|Restore|Restore2|Getlist|backup_media) + if [[ $user = "" ]]; then + user_id="$(appinfo -listUsers)" + if [[ $user_id != "" && $(appinfo -listUsers | wc -l) -gt 1 ]]; then + echo "$user_id" | while read ; do + [[ $REPLY = 0 ]] && echoRgb "主用戶:$REPLY" "2" || echoRgb "分身用戶:$REPLY" "2" + done + echoRgb "設備存在多用戶,選擇操作目標用戶" + if [[ $(echo "$user_id" | wc -l) = 2 ]]; then + user1="$(echo "$user_id" | sed -n '1p')" + user2="$(echo "$user_id" | sed -n '2p')" + echoRgb "音量上選擇用戶:$user1,音量下選擇用戶:$user2" "2" + Select_user="true" + get_version "$user1" "$user2" && user="$branch" + unset Select_user + else + while true ;do + if [[ $option != "" ]]; then + user="$option" + break + else + echoRgb "請輸入需要操作目標分區" "1" + read option + fi + done + fi + echoRgb "當前操作為用戶$user" + else + user="0" + fi + fi + path="/data/media/$user/Android" + path2="/data/user/$user" + [[ ! -d $path2 ]] && echoRgb "$user分區不存在,請將上方提示的用戶id按照需求填入\n -$MODDIR_NAME/backup_settings.conf配置項user=,一次只能填寫一個" "0" && exit 2 + export USER_ID="$user" ;; +esac +if [[ $(getprop ro.build.version.sdk) -lt 30 ]]; then + alias INSTALL="pm install --user $user -r -t &>/dev/null" + alias create="pm install-create --user $user -t 2>/dev/null" +else + if [[ $(getprop ro.build.version.sdk) -gt 33 ]]; then + alias INSTALL="pm install -r --bypass-low-target-sdk-block -i com.android.vending --user $user -t &>/dev/null" + alias create="pm install-create -i com.android.vending --bypass-low-target-sdk-block --user $user -t 2>/dev/null" + else + alias INSTALL="pm install -r -i com.android.vending --user $user -t &>/dev/null" + alias create="pm install-create -i com.android.vending --user $user -t 2>/dev/null" + fi +fi +case $operate in +Getlist|Restore2|Restore3|dumpname|check_file|backup_media|convert|Device_List) ;; +*) + isBoolean "$Lo" "Lo" && Lo="$nsx" + if [[ $Lo = false ]]; then + isBoolean "$toast_info" "toast_info" && toast_info="$nsx" + else + echoRgb "備份完成或是遭遇異常發送toast與狀態欄通知?\n -音量上提示,音量下靜默備份" "2" + get_version "提示" "靜默備份" && toast_info="$branch" + fi + ;; +esac +cdn=2 +#settings get system system_locales +Language="https://api.github.com/repos/YAWAsau/backup_script/releases/latest" +if [[ $LANG != "" ]]; then + Set_script_language() { + echoRgb "腳本語系為$shell_language....轉換為$LANG中...." + case $MODDIR in + *Backup_*) + if [[ -f $MODDIR/app_details ]]; then + Rename_script "${MODDIR%/*}" + ts -f "${MODDIR%/*}/backup_settings.conf" -o "${MODDIR%/*}/backup_settings.conf" + [[ -d ${MODDIR%/*/*}/tools ]] && ts -f "${MODDIR%/*/*}/backup_settings.conf" -o "${MODDIR%/*/*}/backup_settings.conf" && Rename_script "${MODDIR%/*/*}" + else + Rename_script "$MODDIR" + ts -f "$MODDIR/backup_settings.conf" -o "$MODDIR/backup_settings.conf" + [[ -d ${MODDIR%/*}/tools ]] && ts -f "${MODDIR%/*}/backup_settings.conf" -o "${MODDIR%/*}/backup_settings.conf" && Rename_script "${MODDIR%/*}" + fi ;; + *) + Rename_script "$MODDIR" + ts -f "$MODDIR/backup_settings.conf" -o "$MODDIR/backup_settings.conf" + if [[ $(find "$MODDIR" -maxdepth 1 -name "Backup_*" -type d) != "" ]]; then + find "$MODDIR" -maxdepth 1 -name "Backup_*" -type d | while read backup_path; do + [[ -d $backup_path && $backup_path != $MODDIR ]] && ts -f "$backup_path/backup_settings.conf" -o "$backup_path/backup_settings.conf" && Rename_script "$backup_path" + done + else + Rename_script "${MODDIR%/*}" + ts -f "${MODDIR%/*}/backup_settings.conf" -o "${MODDIR%/*}/backup_settings.conf" + fi ;; + esac + [[ $? = 0 ]] && echoRgb "轉換腳本完成,退出腳本重新執行即可使用$1" && exit 0 + } + case $LANG in + *-TW | *-tw | *-HK) + echoRgb "系統語系:繁體中文" + ts -f "$tools_path/Device_List" -o "$tools_path/Device_List" + case $MODDIR in + *Backup_*) + if [[ -f $MODDIR/app_details ]]; then + find "${0%/*/*/*}" -maxdepth 3 -name "tools.sh" -type f | while read ; do + ts -f "$REPLY" -o "$REPLY" && sed -i 's/shell_language=\"zh-CN\"/shell_language=\"zh-TW\"/g' "$REPLY" + done + else + find "${0%/*/*}" -maxdepth 3 -name "tools.sh" -type f | while read ; do + ts -f "$REPLY" -o "$REPLY" && sed -i 's/shell_language=\"zh-CN\"/shell_language=\"zh-TW\"/g' "$REPLY" + done + fi ;; + *) + find "${0%/*}" -maxdepth 3 -name "tools.sh" -type f | while read ; do + ts -f "$REPLY" -o "$REPLY" && sed -i 's/shell_language=\"zh-CN\"/shell_language=\"zh-TW\"/g' "$REPLY" + done ;; + esac + [[ $shell_language != zh-TW ]] && Set_script_language "繁體中文" + ;; + *-CN | *-cn) + echoRgb "系統語系:簡體中文" + ts -f "$tools_path/Device_List" -o "$tools_path/Device_List" + case $MODDIR in + *Backup_*) + if [[ -f $MODDIR/app_details ]]; then + find "${0%/*/*/*}" -maxdepth 3 -name "tools.sh" -type f | while read ; do + ts -f "$REPLY" -o "$REPLY" && sed -i 's/shell_language=\"zh-TW\"/shell_language=\"zh-CN\"/g' "$REPLY" + done + else + find "${0%/*/*}" -maxdepth 3 -name "tools.sh" -type f | while read ; do + ts -f "$REPLY" -o "$REPLY" && sed -i 's/shell_language=\"zh-TW\"/shell_language=\"zh-CN\"/g' "$REPLY" + done + fi ;; + *) + find "${0%/*}" -maxdepth 3 -name "tools.sh" -type f | while read ; do + ts -f "$REPLY" -o "$REPLY" && sed -i 's/shell_language=\"zh-TW\"/shell_language=\"zh-CN\"/g' "$REPLY" + done ;; + esac + [[ $shell_language = zh-TW ]] && Set_script_language "簡體中文" + ;; + esac +else + echoRgb "獲取系統語系失敗" "0" +fi +echo "${0%/*}"/*/tools/tools.sh +#效驗選填是否正確 +Lo="$(echo "$Lo" | sed 's/true/1/g ; s/false/0/g')" +isBoolean "$Lo" "Lo" && Lo="$nsx" +if [[ $Lo = false ]]; then + isBoolean "$update" "update" && update="$nsx" +else + echoRgb "自動更新腳本?\n -音量上更新,下不更新" + get_version "更新" "不更新" && update="$branch" +fi +[[ $update = true ]] && json="$(down -s -L "$Language" 2>/dev/null)" || echoRgb "自動更新被關閉" "0" +if [[ $json != "" ]]; then + tag="$(echo "$json" | sed -r -n 's/.*"tag_name": *"(.*)".*/\1/p')" + if [[ $tag != "" && $backup_version != $tag ]]; then + if [[ $(expr "$(echo "$backup_version" | tr -d "a-zA-Z")" \> "$(echo "$tag" | tr -d "a-zA-Z")") -eq 0 ]]; then + download="$(echo "$json" | sed -r -n 's/.*"browser_download_url": *"(.*.zip)".*/\1/p')" + case $cdn in + 1) zip_url="http://huge.cf/download/?huge-url=$download" ;; + 2) zip_url="https://gh-proxy.com/$download" ;; + 3) zip_url="https://gh.api.99988866.xyz/$download" ;; + 4) zip_url="https://github.lx164.workers.dev/$download" ;; + 5) zip_url="https://shrill-pond-3e81.hunsh.workers.dev/$download" ;; + 6) zip_url="https://github.moeyy.xyz/$download" ;; + esac + if [[ $(expr "$(echo "$backup_version" | tr -d "a-zA-Z")" \> "$(echo "$download" | tr -d "a-zA-Z")") -eq 0 ]]; then + echoRgb "發現新版本:$tag" + if [[ $update = true ]]; then + body="$(echo "$json" | sed 's/\"body\": \"/body=\"/g' | grep -o 'body="[^"]*"' | tr -d '"' | cut -f2 -d '=')" && [[ $body != "" ]] && echoRgb "更新日誌:\n$body" + echoRgb "是否更新腳本?\n -音量上更新,音量下不更新" "2" + get_version "更新" "不更新" && choose="$branch" + if [[ $choose = true ]]; then + echoRgb "下載中.....耐心等待 如果下載失敗請掛飛機" + starttime1="$(date -u "+%s")" + down -s -L -o "$MODDIR/update.zip" "$zip_url" & + wait + endtime 1 + [[ ! -f $MODDIR/update.zip ]] && echoRgb "下載失敗" && exit 2 + zipFile="$MODDIR/update.zip" + fi + else + echoRgb "$MODDIR_NAME/backup_settings.conf內update選項為0忽略更新僅提示更新" "0" + fi + fi + fi + fi +else + [[ $update = true ]] && echoRgb "更新獲取失敗" "0" +fi +update_script +Lo="$(echo "$Lo" | sed 's/true/1/g ; s/false/0/g')" +backup_path() { + if [[ $Output_path != "" ]]; then + [[ ${Output_path: -1} = / ]] && Output_path="${Output_path%?}" + Backup="$Output_path/Backup_${Compression_method}_$user" + outshow="使用自定義目錄" + else + Backup="$MODDIR/Backup_${Compression_method}_$user" + if [[ $backup_mode = "" ]]; then + outshow="使用當前路徑作為備份目錄" + else + [[ -d $Backup ]] && outshow="使用上層路徑作為備份目錄" || echoRgb "$Backup目錄不存在" "0" + fi + fi + PU="$(mount | egrep -v "rannki|0000-1" | grep -w "/mnt/media_rw" | awk '{print $3,$5}')" + OTGPATH="$(echo "$PU" | awk '{print $1}')" + OTGFormat="$(echo "$PU" | awk '{print $2}')" + if [[ -d $OTGPATH ]]; then + if [[ $(echo "$MODDIR" | egrep -o "^${OTGPATH}") != "" || $USBdefault = true ]]; then + hx="true" + Backup="$MODDIR/Backup_${Compression_method}_$user" + else + echoRgb "檢測到隨身碟 是否在隨身碟備份\n -音量上是,音量下不是" "2" + get_version "選擇了隨身碟備份" "選擇了本地備份" + [[ $branch = true ]] && hx="$branch" + [[ $hx = true ]] && Backup="$OTGPATH/Backup_${Compression_method}_$user" + fi + if [[ $hx = true ]]; then + case $OTGFormat in + texfat | sdfat | fuseblk | exfat | NTFS | ext4 | f2fs) + outshow="於隨身碟備份" && hx=usb + ;; + *) + echoRgb "隨身碟檔案系統$OTGFormat不支持超過單檔4GB\n -請格式化為exfat" "0" + exit 1 + ;; + esac + fi + fi + #分區詳細 + if [[ $(echo "$Backup" | egrep -o "^/storage/emulated") != "" ]]; then + Backup_path="/data" + else + Backup_path="${Backup%/*}" + fi + echoRgb "$hx備份資料夾所使用分區統計如下↓\n -$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-3),$(NF-2),$(NF-1),$(NF)}' | awk 'END{print "總共:"$1"已用:"$2"剩餘:"$3"使用率:"$4}')檔案系統:$(df -T "$Backup_path" | sed -n 's|% /.*|%|p' | awk '{print $(NF-4)}')\n -備份目錄輸出位置↓\n -$Backup" + echoRgb "$outshow" "2" +} +Calculate_size() { + #計算出備份大小跟差異性 + filesizee="$(du -s "$1" | awk '{print $1}')" + if [[ $(expr "$filesize" \> "$filesizee") -eq 0 ]]; then + NJK="增加" + dsize="$(($((filesizee -filesize)) / 1024))" + else + NJK="減少" + dsize="$(($((filesize-filesizee)) / 1024))" + fi + echoRgb "備份資料夾路徑↓↓↓\n -$1" + echoRgb "備份資料夾總體大小$(du -ksh "$1" | awk '{print $1}')" + if [[ $dsize -gt 0 ]]; then + if [[ $((dsize / 1000)) -gt 0 ]]; then + NJL="本次備份$NJK: $((dsize / 1000))gb" + else + NJL="本次備份$NJK: ${dsize}mb" + fi + else + NJL="本次備份$NJK: $(($((filesizee - filesize)) * 1000 / 1024))kb" + fi + echoRgb "$NJL" +} +size () { + varr="$(echo "$1" | bc 2>/dev/null)" + if [[ $varr != $1 ]]; then + b_size="$(ls -l "$1" | awk '{print $5}')" + else + b_size="$1" + fi + k_size="$(awk 'BEGIN{printf "%.2f\n", "'$b_size'"/'1024'}')" + m_size="$(awk 'BEGIN{printf "%.2f\n", "'$k_size'"/'1024'}')" + if [[ $(expr "$m_size" \> 1) -eq 0 ]]; then + echo "${k_size}KB" + else + [[ $(echo "$m_size" | cut -d '.' -f1) -lt 1024 ]] && echo "${m_size}MB" || echo "$(awk 'BEGIN{printf "%.2f\n", "'$m_size'"/'1024'}')GB" + fi +} +#分區佔用信息 +partition_info() { + Occupation_status="$(df -h "${1%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-1),$(NF)}')" + lxj="$(echo "$Occupation_status" | awk '{print $2}' | sed 's/%//g')" + [[ $lxj -ge 97 ]] && echoRgb "$hx空間不足,達到$lxj%" "0" && exit 2 +} +kill_app() { + [[ $Pause_Freeze = "" ]] && Pause_Freeze="0" + if [[ $name2 != $Open_apps2 ]]; then + if [[ $Pause_Freeze = 0 ]]; then + if [[ $(dumpsys activity processes | grep "packageList" | cut -d '{' -f2 | cut -d '}' -f1 | egrep -w "^$name2$" | sed -n '1p') = $name2 ]]; then + killall -9 "$name2" &>/dev/null + am force-stop --user "$user" "$name2" &>/dev/null + am kill "$name2" &>/dev/null + echoRgb "殺死$name1進程" + fi + pm suspend --user "$user" "$name2" 2>/dev/null | sed "s/Package $name2/ -應用:$name1/g ; s/new suspended state: true/暫停狀態:凍結/g" + fi + Pause_Freeze="1" + fi +} +Set_service() { + if [[ $Pause_Freeze = 1 ]]; then + pm unsuspend --user "$user" "$name2" 2>/dev/null | sed "s/Package $name2/ -應用:$name1/g ; s/new suspended state: false/暫停狀態:解凍/g" + Pause_Freeze="0" + fi +} +restore_freeze() { + appinfo -o pn -p | while read ; do + pm unsuspend --user "$user" "$REPLY" 2>/dev/null | sed "s/Package $name2/ -應用:$name1/g ; s/new suspended state: false/暫停狀態:解凍/g" + done +} +get_variables() { + awk "/$1/"'{print $1}' "$2" | cut -f2 -d '=' | tail -n1 | sed 's/\"//g' +} +Backup_apk() { + #檢測apk狀態進行備份 + #創建APP備份文件夾 + [[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder" + apk_version2="$(pm list packages --show-versioncode --user "$user" "$name2" 2>/dev/null | cut -f3 -d ':' | head -n 1)" + apk_version3="$(dumpsys package "$name2" 2>/dev/null | awk '/versionName=/{print $1}' | cut -f2 -d '=' | head -1)" + if [[ $apk_version = $apk_version2 ]]; then + [[ $(sed -e '/^$/d' "$txt2" | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2" + unset xb + let osj++ + result=0 + echoRgb "Apk版本無更新 跳過備份" "2" + else + case $name2 in + com.google.android.youtube) + [[ -d /data/adb/Vanced ]] && nobackup="true" + ;; + com.google.android.apps.youtube.music) + [[ -d /data/adb/Music ]] && nobackup="true" + ;; + esac + if [[ $nobackup != true ]]; then + if [[ $apk_version != "" ]]; then + let osn++ + update_apk="$(echo "$name1 \"$name2\"")" + update_apk2="$(echo "$update_apk\n$update_apk2")" + echoRgb "版本:$apk_version>$apk_version2" + else + let osk++ + add_app="$(echo "$name1 \"$name2\"")" + add_app2="$(echo "$add_app\n$add_app2")" + echoRgb "版本:$apk_version2" + fi + partition_info "$Backup" + #備份apk + echoRgb "$1" + echo "$apk_path" | sed -e '/^$/d' | while read; do + echoRgb "${REPLY##*/} $(size "$REPLY")" + done + ( + cd "$apk_path2" + case $Compression_method in + tar | TAR | Tar) tar --checkpoint-action="ttyout=%T\r" -cf "$Backup_folder/apk.tar" *.apk ;; + lz4 | LZ4 | Lz4) tar --checkpoint-action="ttyout=%T\r" -cf - *.apk | lz4>"$Backup_folder/apk.tar.lz4" ;; + zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" -cf - *.apk | zstd>"$Backup_folder/apk.tar.zst" ;; + esac + ) + echo_log "備份$apk_number個Apk" + if [[ $result = 0 ]]; then + Validation_file "$Backup_folder/apk.tar"* + if [[ $result = 0 ]]; then + [[ $(sed -e '/^$/d' "$txt2" | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2" + if [[ $apk_version = "" ]]; then + echo "apk_version=\"$apk_version2\"" >>"$app_details" + else + echo "$(sed "s/${apk_version}/${apk_version2}/g" "$app_details")">"$app_details" + fi + if [[ $versionName = "" ]]; then + echo "versionName=\"$apk_version3\"" >>"$app_details" + else + echo "$(sed "s/${versionName}/${apk_version3}/g" "$app_details")">"$app_details" + fi + [[ $PackageName = "" ]] && echo "PackageName=\"$name2\"" >>"$app_details" + [[ $ChineseName = "" ]] && echo "ChineseName=\"$name1\"" >>"$app_details" + else + rm -rf "$Backup_folder" + fi + if [[ $name2 = com.android.chrome ]]; then + #刪除所有舊apk ,保留一個最新apk進行備份 + ReservedNum=1 + FileNum="$(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | wc -l)" + while [[ $FileNum -gt $ReservedNum ]]; do + OldFile="$(ls -rt /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | head -1)" + rm -rf "${OldFile%/*/*}" && echoRgb "刪除文件:${OldFile%/*/*}" + let "FileNum--" + done + [[ -f $(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null) && $(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | wc -l) = 1 ]] && cp -r "$(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null)" "$Backup_folder/nmsl.apk" + fi + else + rm -rf "$Backup_folder" + fi + else + let osj++ + echoRgb "$name1不支持備份 需要使用vanced安裝" "0" && rm -rf "$Backup_folder" + fi + fi + [[ $name2 = bin.mt.plus && ! -f $Backup/$name1.apk ]] && cp -r "$apk_path" "$Backup/$name1.apk" +} +#檢測數據位置進行備份 +Backup_data() { + data_path="$path/$1/$name2" + MODDIR_NAME="${data_path%/*}" + MODDIR_NAME="${MODDIR_NAME##*/}" + case $1 in + user) Size="$userSize" && data_path="$path2/$name2" ;; + data) Size="$dataSize" ;; + obb) Size="$obbSize" ;; + *) + if [[ -f $app_details ]]; then + Size="$(get_variables "$1Size" "$app_details")" + mediapath="$(get_variables "$1mediapath" "$app_details")" + fi + data_path="$2" + if [[ $1 != storage-isolation && $1 != thanox && $1 != adb ]]; then + Compression_method1="$Compression_method" + Compression_method=tar + fi + zsize=1 + zmediapath=1 + ;; + esac + if [[ -d $data_path ]]; then + unset Filesize m_size k_size + Filesize="$(du -s "$data_path" | awk '{print $1}')" + k_size="$(awk 'BEGIN{printf "%.2f\n", "'$Filesize'"'*1024'/'1024'}')" + m_size="$(awk 'BEGIN{printf "%.2f\n", "'$k_size'"/'1024'}')" + if [[ $(expr "$m_size" \> 1) -eq 0 ]]; then + get_size="$(awk 'BEGIN{printf "%.2f\n", "'$k_size'"/'1024'}')KB" + else + [[ $(echo "$m_size" | cut -d '.' -f1) -lt 1000 ]] && get_size="${m_size}MB" || get_size="$(awk 'BEGIN{printf "%.2f\n", "'$m_size'"/'1024'}')GB" + fi + if [[ $Size != $Filesize ]]; then + #停止應用 + case $1 in + user|data|obb) kill_app ;; + esac + partition_info "$Backup" + echoRgb "備份$1數據($get_size)" + case $1 in + user) + case $Compression_method in + tar | Tar | TAR) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" 2>/dev/null ;; + zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | zstd>"$Backup_folder/$1.tar.zst" 2>/dev/null ;; + lz4 | Lz4 | LZ4) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | lz4>"$Backup_folder/$1.tar.lz4" 2>/dev/null ;; + esac + ;; + *) + case $Compression_method in + tar | Tar | TAR) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" ;; + zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | zstd>"$Backup_folder/$1.tar.zst" ;; + lz4 | Lz4 | LZ4) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | lz4>"$Backup_folder/$1.tar.lz4" 2>/dev/null ;; + esac + ;; + esac + echo_log "備份$1數據" + if [[ $result = 0 ]]; then + Validation_file "$Backup_folder/$1.tar"* + if [[ $result = 0 ]]; then + [[ ${Backup_folder##*/} = Media ]] && [[ $(sed -e '/^$/d' "$mediatxt" | grep -w "${REPLY##*/}.tar$" | head -1) = "" ]] && echo "$FILE_NAME" >> "$mediatxt" + if [[ $zsize != "" ]]; then + if [[ $Size != "" ]]; then + echo "$(sed "s/$Size/$Filesize/g" "$app_details")">"$app_details" + else + echo "#$1Size=\"$Filesize\"" >>"$app_details" + fi + else + if [[ $Size != "" ]]; then + echo "$(sed "s/$Size/$Filesize/g" "$app_details")">"$app_details" + else + echo "$1Size=\"$Filesize\"" >>"$app_details" + fi + fi + if [[ $zmediapath != "" ]]; then + if [[ $mediapath = "" ]]; then + echo "#$1mediapath=\"$2\"" >>"$app_details" + fi + fi + else + rm -rf "$Backup_folder/$1".tar.* + fi + fi + [[ $Compression_method1 != "" ]] && Compression_method="$Compression_method1" + unset Compression_method1 + else + echoRgb "$1數據無發生變化 跳過備份" "2" + fi + else + [[ -f $data_path ]] && echoRgb "$1是一個文件 不支持備份" "0" || echoRgb "$1數據不存在跳過備份" "2" + fi + partition_info "$Backup" +} +Release_data() { + tar_path="$1" + X="$path2/$name2" + MODDIR_NAME="${tar_path%/*}" + MODDIR_NAME="${MODDIR_NAME##*/}" + FILE_NAME="${tar_path##*/}" + FILE_NAME2="${FILE_NAME%%.*}" + case ${FILE_NAME##*.} in + lz4 | zst | tar) + unset FILE_PATH Size Selinux_state + case $FILE_NAME2 in + user) + if [[ -d $X ]]; then + FILE_PATH="$path2" + Size="$userSize" + Selinux_state="$(LS "$X" | awk 'NF>1{print $1}' | sed -e "s/system_data_file/app_data_file/g" 2>/dev/null)" + else + echoRgb "$X不存在 無法恢復$FILE_NAME2數據" "0" + fi;; + data) FILE_PATH="$path/data" Size="$dataSize" Selinux_state="$(LS "$FILE_PATH" | awk 'NF>1{print $1}' | sed -e "s/system_data_file/app_data_file/g" 2>/dev/null)";; + obb) FILE_PATH="$path/obb" Size="$obbSize" Selinux_state="$(LS "$FILE_PATH" | awk 'NF>1{print $1}' | sed -e "s/system_data_file/app_data_file/g" 2>/dev/null)";; + thanox) FILE_PATH="/data/system" Size="$(get_variables "${FILE_NAME2}Size" "$app_details")" && find "/data/system" -name "thanos*" -maxdepth 1 -type d -exec rm -rf {} \; 2>/dev/null ;; + storage-isolation) FILE_PATH="/data/adb" Size="$(get_variables "${FILE_NAME2}Size" "$app_details")" ;; + *) + if [[ $A != "" ]]; then + if [[ ${MODDIR_NAME##*/} = Media ]]; then + FILE_PATH="$(get_variables "${FILE_NAME2}mediapath" "$app_details")" + if [[ $FILE_PATH = "" ]]; then + echoRgb "路徑獲取失敗" "0" + else + echoRgb "解壓路徑↓\n -$FILE_PATH" "2" + FILE_PATH="${FILE_PATH%/*}" + Size="$(get_variables "${FILE_NAME2}Size" "$app_details")" + [[ ! -d $FILE_PATH ]] && mkdir -p "$FILE_PATH" + fi + fi + fi ;; + esac + echoRgb "恢復$FILE_NAME2數據 釋放$(size "$(awk 'BEGIN{printf "%.2f\n", "'$Size'"*'1024'}')")" "3" + if [[ $FILE_PATH != "" ]]; then + [[ ${MODDIR_NAME##*/} != Media ]] && rm -rf "$FILE_PATH/$name2" + case ${FILE_NAME##*.} in + lz4 | zst) tar --checkpoint-action="ttyout=%T\r" -I zstd -xmpf "$tar_path" -C "$FILE_PATH" ;; + tar) [[ ${MODDIR_NAME##*/} = Media ]] && tar --checkpoint-action="ttyout=%T\r" -axf "$tar_path" -C "$FILE_PATH" || tar --checkpoint-action="ttyout=%T\r" -amxf "$tar_path" -C "$FILE_PATH" ;; + esac + else + Set_back + fi + echo_log "解壓縮${FILE_NAME##*.}" + if [[ $result = 0 ]]; then + case $FILE_NAME2 in + user|data|obb) + if [[ -f /config/sdcardfs/$name2/appid ]]; then + G="$(cat "/config/sdcardfs/$name2/appid")" + else + G="$(dumpsys package "$name2" 2>/dev/null | awk -F'=' '/userId/ && !/userId=0/{print $2}' | head -1)" + [[ $G = "" ]] && G="$(pm list packages -U --user "$user" | egrep -w "$name2" | awk -F'uid:' '{print $2}' | awk '{print $1}' | head -n 1)" + fi + G="$(echo "$G" | egrep -o '[0-9]+')" + if [[ $G != "" ]]; then + if [[ -d $X ]]; then + [[ $user = 0 ]] && uid="$G:$G" || uid="$user$G:$user$G" + if [[ $FILE_NAME2 = user ]]; then + echoRgb "路徑:$X" + chown -hR "$uid" "$X/" + echo_log "設置用戶組:$(ls -ld "$X" | awk '{print $3,$4}'),shell in :$uid" + chcon -hR "$Selinux_state" "$X/" 2>/dev/null + echo_log "selinux上下文設置" + elif [[ $FILE_NAME2 = data || $FILE_NAME2 = obb ]]; then + chown -hR "$uid" "$FILE_PATH/$name2/" + chcon -hR "$Selinux_state" "$FILE_PATH/$name2/" 2>/dev/null + fi + else + echoRgb "路徑$X不存在" "0" + fi + else + echoRgb "uid獲取失敗" "0" + fi + ;; + thanox) + restorecon -RF "$(find "/data/system" -name "thanos*" -maxdepth 1 -type d 2>/dev/null)/" 2>/dev/null + echo_log "selinux上下文設置" && echoRgb "警告 thanox配置恢復後務必重啟\n -否則不生效" "0" + ;; + storage-isolation) + restorecon -RF "/data/adb/storage-isolation/" 2>/dev/null + echo_log "selinux上下文設置" + ;; + esac + fi + ;; + *) + echoRgb "$FILE_NAME 壓縮包不支持解壓縮" "0" + Set_back + ;; + esac + rm -rf "$TMPDIR"/* +} +installapk() { + apkfile="$(find "$Backup_folder" -maxdepth 1 -name "apk.*" -type f 2>/dev/null)" + if [[ $apkfile != "" ]]; then + rm -rf "$TMPDIR"/* + case ${apkfile##*.} in + lz4 | zst) tar --checkpoint-action="ttyout=%T\r" -I zstd -xmpf "$apkfile" -C "$TMPDIR" ;; + tar) tar --checkpoint-action="ttyout=%T\r" -xmpf "$apkfile" -C "$TMPDIR" ;; + *) + echoRgb "${apkfile##*/} 壓縮包不支持解壓縮" "0" + Set_back + ;; + esac + echo_log "${apkfile##*/}解壓縮" && [[ -f $Backup_folder/nmsl.apk ]] && cp -r "$Backup_folder/nmsl.apk" "$TMPDIR" + else + echoRgb "你的Apk壓縮包離家出走了,可能備份後移動過程遺失了\n -解決辦法手動安裝Apk後再執行恢復腳本" "0" + fi + if [[ $result = 0 ]]; then + case $(find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | wc -l) in + 1) + echoRgb "恢復普通apk" "2" + INSTALL "$TMPDIR"/*.apk + echo_log "Apk安裝" + ;; + 0) + echoRgb "$TMPDIR中沒有apk" "0" + ;; + *) + echoRgb "恢復split apk" "2" + b="$(create 2>/dev/null | egrep -o '[0-9]+')" + if [[ -f $TMPDIR/nmsl.apk ]]; then + INSTALL "$TMPDIR/nmsl.apk" + echo_log "nmsl.apk安裝" + fi + find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | grep -v 'nmsl.apk' | while read; do + pm install-write "$b" "${REPLY##*/}" "$REPLY" &>/dev/null + echo_log "${REPLY##*/}安裝" + done + pm install-commit "$b" &>/dev/null + echo_log "split Apk安裝" + ;; + esac + fi +} +disable_verify() { + #禁用apk驗證 + settings put global verifier_verify_adb_installs 0 2>/dev/null + #禁用安裝包驗證 + settings put global package_verifier_enable 0 2>/dev/null + #未知來源 + settings put secure install_non_market_apps 1 2>/dev/null + #關閉play安全效驗 + if [[ $(settings get global package_verifier_user_consent 2>/dev/null) != -1 ]]; then + settings put global package_verifier_user_consent -1 2>/dev/null + settings put global upload_apk_enable 0 2>/dev/null + echoRgb "PLAY安全驗證為開啟狀態已被腳本關閉防止apk安裝失敗" "3" + fi +} +get_name(){ + txt="$MODDIR/appList.txt" + txt2="$MODDIR/mediaList.txt" + txt="${txt/'/storage/emulated/'/'/data/media/'}" + if [[ $1 = Apkname ]]; then + rm -rf "$txt" "$txt2" + echoRgb "列出全部資料夾內應用名與自定義目錄壓縮包名稱" "3" + fi + rgb_a=118 + find "$MODDIR" -maxdepth 2 -name "apk.*" -type f 2>/dev/null | sort | while read; do + Folder="${REPLY%/*}" + [[ $rgb_a -ge 229 ]] && rgb_a=118 + unset PackageName NAME DUMPAPK ChineseName + [[ -f $Folder/app_details ]] && . "$Folder/app_details" &>/dev/null + [[ ! -f $txt ]] && echo "#不需要恢復還原的應用請在開頭注釋# 比如#xxxxxxxx 酷安" >"$txt" + if [[ $PackageName = "" || $ChineseName = "" ]]; then + echoRgb "${Folder##*/}包名獲取失敗,解壓縮獲取包名中..." "0" + rm -rf "$TMPDIR"/* + case ${REPLY##*.} in + lz4 | zst) tar -I zstd -xmpf "$REPLY" -C "$TMPDIR" --wildcards --no-anchored 'base.apk' ;; + tar) tar -xmpf "$REPLY" -C "$TMPDIR" --wildcards --no-anchored 'base.apk' ;; + *) + echoRgb "${REPLY##*/} 壓縮包不支持解壓縮" "0" + Set_back + ;; + esac + echo_log "${REPLY##*/}解壓縮" + if [[ $result = 0 ]]; then + if [[ -f $TMPDIR/base.apk ]]; then + DUMPAPK="$(appinfo -d " " -o anwb,pn -f "$TMPDIR/base.apk")" + if [[ $DUMPAPK != "" ]]; then + app=($DUMPAPK $DUMPAPK) + PackageName="${app[1]}" + ChineseName="${app[2]}" + rm -rf "$TMPDIR"/* + else + echoRgb "appinfo輸出失敗" "0" + fi + fi + fi + fi + if [[ $PackageName != "" && $ChineseName != "" ]]; then + case $1 in + Apkname) + [[ -f $Folder/${PackageName}.sh ]] && rm -rf "$Folder/${PackageName}.sh" + [[ ! -f $Folder/recover.sh ]] && touch_shell "Restore2" "$Folder/recover.sh" + [[ ! -f $Folder/backup.sh ]] && echo 'if [ -f "${0%/*/*/*}/tools/tools.sh" ]; then\n MODDIR="${0%/*/*/*}"\n operate="backup"\n conf_path="${0%/*/*/*}/backup_settings.conf"\n [[ ! -f $conf_path ]] && echo "$conf_path遺失"\n backup_mode=1\n . "${0%/*}/app_details" &>/dev/null\n . "${0%/*/*/*}/tools/tools.sh" | tee "$MODDIR/log.txt"\nelse\n echo "${0%/*/*}/tools/tools.sh遺失"\nfi' >"$Folder/backup.sh" + echoRgb "$ChineseName $PackageName" && echo "$ChineseName $PackageName" >>"$txt" ;; + convert) + if [[ ${Folder##*/} = $PackageName ]]; then + mv "$Folder" "${Folder%/*}/$ChineseName" && echoRgb "${Folder##*/} > $ChineseName" + else + mv "$Folder" "${Folder%/*}/$PackageName" && echoRgb "${Folder##*/} > $PackageName" + fi ;; + esac + fi + let rgb_a++ + done + if [[ -d $MODDIR/Media ]]; then + echoRgb "存在媒體資料夾" "2" + [[ ! -f $txt2 ]] && echo "#不需要恢復的資料夾請在開頭注釋# 比如#媒體" > "$txt2" + find "$MODDIR/Media" -maxdepth 1 -name "*.tar*" -type f 2>/dev/null | while read; do + echoRgb "${REPLY##*/}" && echo "${REPLY##*/}" >> "$txt2" + done + echoRgb "$txt2重新生成" "1" + fi + exit 0 +} +self_test() { + if [[ $(dumpsys deviceidle get charging) = false && $(dumpsys battery | awk '/level/{print $2}' | egrep -o '[0-9]+') -le 15 ]]; then + echoRgb "電量$(dumpsys battery | awk '/level/{print $2}' | egrep -o '[0-9]+')%太低且未充電\n -為防止備份檔案或是恢復因低電量強制關機導致檔案損毀\n -請連接充電器後備份" "0" && exit 2 + fi +} +Validation_file() { + MODDIR_NAME="${1%/*}" + MODDIR_NAME="${MODDIR_NAME##*/}" + FILE_NAME="${1##*/}" + echoRgb "效驗$FILE_NAME" + case ${FILE_NAME##*.} in + lz4 | zst) zstd -t "$1" 2>/dev/null ;; + tar) tar -tf "$1" &>/dev/null ;; + esac + echo_log "效驗" +} +Check_archive() { + starttime1="$(date -u "+%s")" + error_log="$TMPDIR/error_log" + rm -rf "$error_log" + FIND_PATH="$(find "$1" -maxdepth 3 -name "*.tar*" -type f 2>/dev/null | sort)" + i=1 + r="$(find "$MODDIR" -maxdepth 2 -name "app_details" -type f 2>/dev/null | wc -l)" + find "$MODDIR" -maxdepth 2 -name "app_details" -type f 2>/dev/null | sort | while read; do + REPLY="${REPLY%/*}" + echoRgb "效驗第$i/$r個資料夾 剩下$((r - i))個" "3" + echoRgb "效驗:${REPLY##*/}" + find "$REPLY" -maxdepth 1 -name "*.tar*" -type f 2>/dev/null | sort | while read; do + Validation_file "$REPLY" + [[ $result != 0 ]] && echo "$REPLY">>"$error_log" + done + echoRgb "$((i * 100 / r))%" + let i++ nskg++ + done + endtime 1 + [[ -f $error_log ]] && echoRgb "以下為失敗的檔案\n $(cat "$error_log")" || echoRgb "恭喜~~全數效驗通過" + rm -rf "$error_log" +} +Set_screen_pause_seconds () { + if [[ $1 = on ]]; then + #獲取系統設置的無操作息屏秒數 + Get_dark_screen_seconds="$(settings get system screen_off_timeout)" + #設置30分鐘後息屏 + settings put system screen_off_timeout 1800000 + echo_log "設置無操作息屏時間30分鐘" + elif [[ $1 = off ]]; then + if [[ $Get_dark_screen_seconds != "" ]]; then + settings put system screen_off_timeout "$Get_dark_screen_seconds" + echo_log "設置無操作息屏時間為$Get_dark_screen_seconds" + fi + fi +} +case $operate in +backup) + kill_Serve + self_test + case $MODDIR in + /storage/emulated/0/Android/* | /data/media/0/Android/* | /sdcard/Android/*) echoRgb "請勿在$MODDIR內備份" "0" && exit 2 ;; + esac + case $Compression_method in + zstd | Zstd | ZSTD | tar | Tar | TAR | lz4 | Lz4 | LZ4) ;; + *) echoRgb "$Compression_method為不支持的壓縮算法" "0" && exit 2 ;; + esac + #效驗選填是否正確 + isBoolean "$Lo" "Lo" && Lo="$nsx" + if [[ $Lo = false ]]; then + isBoolean "$default_behavior" "default_behavior" && default_behavior="$nsx" + isBoolean "$delete_folder" "delete_folder" && delete_folder="$nsx" + isBoolean "$USBdefault" "USBdefault" && USBdefault="$nsx" + isBoolean "$Backup_obb_data" "Backup_obb_data" && Backup_obb_data="$nsx" + isBoolean "$Backup_user_data" "Backup_user_data" && Backup_user_data="$nsx" + isBoolean "$blacklist_mode" "blacklist_mode" && blacklist_mode="$nsx" + isBoolean "$backup_media" "backup_media" && backup_media="$nsx" + else + echoRgb "檢查目錄是否存在已卸載應用?\n -音量上檢查,下不檢查" + get_version "檢查" "不檢查" && delete_folder="$branch" + echoRgb "檢查到已卸載應用\n -音量上刪除資料夾,下移動到其他處" + get_version "刪除" "移動到其他處" && default_behavior="$branch" + echoRgb "存在usb隨身碟是否默認使用隨身碟?\n -音量上默認,下進行詢問" + get_version "默認" "詢問" && USBdefault="$branch" + if [[ $(echo "$blacklist" | grep -v "#" | wc -l) -gt 0 ]]; then + echoRgb "選擇黑名單模式\n -音量上不備份,音量下僅備份安裝檔" "2" + get_version "不備份" "備份安裝檔" && blacklist_mode="$branch" + fi + echoRgb "是否備份外部數據 即比如原神的數據包\n -音量上備份,音量下不備份" "2" + get_version "備份" "不備份" && Backup_obb_data="$branch" + echoRgb "是否備份使用者數據\n -音量上備份,音量下不備份" "2" + get_version "備份" "不備份" && Backup_user_data="$branch" + echoRgb "全部應用備份結束後是否備份自定義目錄\n -音量上備份,音量下不備份" "2" + get_version "備份" "不備份" && backup_media="$branch" + fi + i=1 + #數據目錄 + txt="$MODDIR/appList.txt" + #txt="${txt/'/storage/emulated/'/'/data/media/'}" + [[ ! -f $txt ]] && echoRgb "請執行\"生成應用列表.sh\"獲取應用列表再來備份" "0" && exit 1 + sort -u "$txt" -o "$txt" 2>/dev/null + data="$MODDIR" + hx="本地" + echoRgb "腳本受到內核機制影響 息屏後io性能嚴重影響\n -請勿關閉終端或是息屏備份 如需終止腳本\n -請執行終止腳本.sh即可停止\n -備份結束將發送toast提示語" "3" + backup_path + echoRgb "配置詳細:\n -壓縮方式:$Compression_method\n -音量鍵確認:$Lo\n -Toast:$toast_info\n -更新:$update\n -已卸載應用檢查:$delete_folder\n -卸載應用默認操作(true刪除false移動):$default_behavior\n -默認使用usb:$USBdefault\n -備份外部數據:$Backup_obb_data\n -備份user數據:$Backup_user_data\n -自定義目錄備份:$backup_media\n -黑名單模式:$blacklist_mode" + D="1" + C="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')" + [[ $user = 0 ]] && Apk_info="$(appinfo -sort-i -o pn -pn $system -3 | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)" || Apk_info="$(appinfo -sort-i -o pn -pn $system $(pm list packages -3 --user "$user" | cut -f2 -d ':') | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)" + [[ $Apk_info = "" ]] && echoRgb "appinfo輸出失敗" "0" && exit 2 + if [[ -d $Backup ]]; then + if [[ $delete_folder = true ]]; then + find "$Backup" -maxdepth 1 -type d 2>/dev/null | sort | while read; do + if [[ -f $REPLY/app_details ]]; then + unset PackageName + . "$REPLY/app_details" &>/dev/null + if [[ $PackageName != "" && $(echo "$Apk_info" | egrep -w "^$PackageName$") = "" ]]; then + if [[ $default_behavior = true ]]; then + rm -rf "$REPLY" + echoRgb "${REPLY##*/}不存在系統 刪除資料夾" "0" + else + if [[ ! -d $Backup/被卸載的應用 ]]; then + mkdir -p "$Backup/被卸載的應用" && mv "$REPLY" "$Backup/被卸載的應用/" + else + mv "$REPLY" "$Backup/被卸載的應用/" + fi + [[ ! -d $Backup/被卸載的應用/tools ]] && cp -r "$tools_path" "$Backup/被卸載的應用" + [[ ! -f $Backup/被卸載的應用/恢復備份.sh ]] && touch_shell "Restore" "$Backup/被卸載的應用/恢復備份.sh" + [[ ! -f $Backup/被卸載的應用/重新生成應用列表.sh ]] && touch_shell "dumpname" "$Backup/被卸載的應用/重新生成應用列表.sh" + [[ ! -f $Backup/被卸載的應用/轉換資料夾名稱.sh ]] && touch_shell "convert" "$Backup/被卸載的應用/轉換資料夾名稱.sh" + [[ ! -f $Backup/被卸載的應用/壓縮檔完整性檢查.sh ]] && touch_shell "check_file" "$Backup/被卸載的應用/壓縮檔完整性檢查.sh" + [[ ! -f $Backup/被卸載的應用/終止腳本.sh ]] && cp -r "$MODDIR/終止腳本.sh" "$Backup/被卸載的應用/終止腳本.sh" + [[ ! -f $Backup/被卸載的應用/backup_settings.conf ]] && echo "#1開啟0關閉\n\n#是否在每次執行恢復腳本時使用音量鍵詢問如下需求\n#如果是那下面兩項項設置就被忽略,改為音量鍵選擇\nLo=$Lo\n\n#備份與恢復遭遇異常或是結束後發送通知(toast與狀態欄提示)\ntoast_info=$toast_info\n\n#腳本檢測更新後進行更新?\nupdate=$update\n\n#主色\nrgb_a=$rgb_a\n#輔色\nrgb_b=$rgb_b\nrgb_c=$rgb_c">"$Backup/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/被卸載的應用/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/被卸載的應用/backup_settings.conf" + txt2="$Backup/被卸載的應用/appList.txt" + [[ ! -f $txt2 ]] && echo "#不需要恢復還原的應用請在開頭注釋# 比如#xxxxxxxx 酷安">"$txt2" + echo "${REPLY##*/} $PackageName">>"$txt2" + echo "$(sed -e "s/${REPLY##*/} $PackageName//g ; /^$/d" "$Backup/appList.txt")" >"$Backup/appList.txt" + echoRgb "${REPLY##*/}不存在系統 已移動到$Backup/被卸載的應用" "0" + fi + fi + fi + done + fi + fi + echoRgb "檢查備份列表中是否存在已經卸載應用" "3" + while [[ $D -le $C ]]; do + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${D}p" | awk '{print $1}')" + name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${D}p" | awk '{print $2}')" + if [[ $(echo "$Apk_info" | egrep -w "^$name2$") != "" ]]; then + [[ $Tmplist = "" ]] && Tmplist='#不需要備份的應用請在開頭注釋# 比如#酷安 xxxxxxxx\n#不需要備份數據比如!酷安 xxxxxxxx應用名前方方加一個驚嘆號即可 注意是應用名不是包名' + Tmplist="$Tmplist\n$name1 $name2" + else + echoRgb "$name1 $name2不存在系統,從列表中刪除" "0" + fi + let D++ + done + [[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$txt" + r="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')" + [[ $backup_mode != "" ]] && r=1 + [[ $r = "" ]] && echoRgb "$MODDIR_NAME/appList.txt是空的或是包名被注釋備份個鬼\n -檢查是否注釋亦或者執行$MODDIR_NAME/生成應用列表.sh" "0" && exit 1 + [[ $Backup_user_data = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -Backup_user_data=0將不備份user數據" "0" + [[ $Backup_obb_data = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -Backup_obb_data=0將不備份外部數據" "0" + [[ $backup_media = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -backup_media=0將不備份自定義資料夾" "0" + [[ ! -d $Backup ]] && mkdir -p "$Backup" + txt2="$Backup/appList.txt" + [[ ! -f $txt2 ]] && echo "#不需要恢復還原的應用請在開頭注釋# 比如#xxxxxxxx 酷安">"$txt2" + [[ ! -d $Backup/tools ]] && cp -r "$tools_path" "$Backup" + [[ ! -f $Backup/恢復備份.sh ]] && touch_shell "Restore" "$Backup/恢復備份.sh" + [[ ! -f $Backup/終止腳本.sh ]] && cp -r "$MODDIR/終止腳本.sh" "$Backup/終止腳本.sh" + [[ ! -f $Backup/重新生成應用列表.sh ]] && touch_shell "dumpname" "$Backup/重新生成應用列表.sh" + [[ ! -f $Backup/轉換資料夾名稱.sh ]] && touch_shell "convert" "$Backup/轉換資料夾名稱.sh" + [[ ! -f $Backup/壓縮檔完整性檢查.sh ]] && touch_shell "check_file" "$Backup/壓縮檔完整性檢查.sh" + [[ ! -d $Backup/modules ]] && mkdir -p "$Backup/modules" && echoRgb "$Backup/modules已創建成功\n -請按需要自行放置需要恢復時刷入的模塊在內將自動批量刷入" "1" + [[ -d $Backup/Media ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh" + [[ ! -f $Backup/backup_settings.conf ]] && echo "#1開啟0關閉\n\n#是否在每次執行恢復腳本時使用音量鍵詢問如下需求\n#如果是那下面兩項項設置就被忽略,改為音量鍵選擇\nLo=$Lo\n\n#備份與恢復遭遇異常或是結束後發送通知(toast與狀態欄提示)\ntoast_info=$toast_info\n\n#使用者\nuser=\n\n#腳本檢測更新後進行更新?\nupdate=$update\n\n#主色\nrgb_a=$rgb_a\n#輔色\nrgb_b=$rgb_b\nrgb_c=$rgb_c">"$Backup/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/backup_settings.conf" + filesha256="$(sha256sum "$tools_path/tools.sh" | cut -d" " -f1)" + filesha256_1="$(sha256sum "$Backup/tools/tools.sh" | cut -d" " -f1)" + [[ $filesha256 != $filesha256_1 ]] && cp -r "$tools_path/tools.sh" "$Backup/tools/tools.sh" + filesize="$(du -s "$Backup" | awk '{print $1}')" + Quantity=0 + restore_freeze + #開始循環$txt內的資料進行備份 + #記錄開始時間 + starttime1="$(date -u "+%s")" + TIME="$starttime1" + en=118 + echo "$script">"$TMPDIR/scriptTMP" && echo "$script">"$TMPDIR/scriptTMP" + osn=0; osj=0; osk=0 + #獲取已經開啟的無障礙 + var="$(settings get secure enabled_accessibility_services 2>/dev/null)" + #獲取預設鍵盤 + keyboard="$(settings get secure default_input_method 2>/dev/null)" + Set_screen_pause_seconds on + #假裝息屏 + #Operation_screen off + [[ $(grep -v "#" "$txt" | sed -e '/^$/d' | awk '{print $2}' | grep -w "^${keyboard%/*}$") != ${keyboard%/*} ]] && unset keyboard + { + while [[ $i -le $r ]]; do + [[ $en -ge 229 ]] && en=118 + unset name1 name2 apk_path apk_path2 + if [[ $backup_mode = "" ]]; then + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" + name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + else + name1="$ChineseName" + name2="$PackageName" + fi + [[ $name2 = "" || $name1 = "" ]] && echoRgb "警告! appList.txt應用包名獲取失敗,可能修改有問題" "0" && exit 1 + apk_path="$(pm path --user "$user" "$name2" 2>/dev/null | cut -f2 -d ':')" + apk_path2="$(echo "$apk_path" | head -1)" + apk_path2="${apk_path2%/*}" + if [[ -d $apk_path2 ]]; then + echoRgb "備份第$i/$r個應用 剩下$((r - i))個" "3" + echoRgb "備份 $name1 \"$name2\"" "2" + unset Backup_folder ChineseName PackageName nobackup No_backupdata result apk_version versionName apk_version2 apk_version3 zsize zmediapath Size data_path userSize dataSize obbSize + if [[ $name1 = !* || $name1 = !* ]]; then + name1="$(echo "$name1" | sed 's/!//g ; s/!//g')" + echoRgb "跳過備份所有數據" "0" + No_backupdata=1 + fi + if [[ $(echo "$blacklist" | grep -w "$name2") = $name2 ]]; then + echoRgb "黑名單應用跳過備份所有數據" "0" + No_backupdata=1 + fi + Backup_folder="$Backup/$name1" + app_details="$Backup_folder/app_details" + if [[ -f $app_details ]]; then + . "$app_details" &>/dev/null + if [[ $PackageName != $name2 ]]; then + unset Backup_folder ChineseName PackageName nobackup No_backupdata result apk_version versionName apk_version2 apk_version3 zsize zmediapath Size data_path userSize dataSize obbSize + Backup_folder="$Backup/${name1}[${name2}]" + app_details="$Backup_folder/app_details" + [[ -f $app_details ]] && . "$app_details" &>/dev/null + fi + fi + [[ $hx = USB && $PT = "" ]] && echoRgb "隨身碟意外斷開 請檢查穩定性" "0" && exit 1 + starttime2="$(date -u "+%s")" + [[ $name2 = com.tencent.mobileqq ]] && echoRgb "QQ可能恢復備份失敗或是丟失聊天記錄,請自行用你信賴的應用備份" "0" + [[ $name2 = com.tencent.mm ]] && echoRgb "WX可能恢復備份失敗或是丟失聊天記錄,請自行用你信賴的應用備份" "0" + apk_number="$(echo "$apk_path" | wc -l)" + if [[ $apk_number = 1 ]]; then + Backup_apk "非Split Apk" "3" + else + Backup_apk "Split Apk支持備份" "3" + fi + if [[ $result = 0 && $No_backupdata = "" && $nobackup != true ]]; then + if [[ $Backup_obb_data = true ]]; then + #備份data數據 + Backup_data "data" + #備份obb數據 + Backup_data "obb" + fi + #備份user數據 + [[ $Backup_user_data = true ]] && Backup_data "user" + [[ $name2 = github.tornaco.android.thanos ]] && Backup_data "thanox" "$(find "/data/system" -name "thanos*" -maxdepth 1 -type d 2>/dev/null)" + [[ $name2 = moe.shizuku.redirectstorage ]] && Backup_data "storage-isolation" "/data/adb/storage-isolation" + Set_service + fi + [[ -f $Backup_folder/${name2}.sh ]] && rm -rf "$Backup_folder/${name2}.sh" + [[ ! -f $Backup_folder/recover.sh ]] && touch_shell "Restore2" "$Backup_folder/recover.sh" + [[ ! -f $Backup_folder/backup.sh ]] && echo 'if [ -f "${0%/*/*/*}/tools/tools.sh" ]; then\n MODDIR="${0%/*/*/*}"\n operate="backup"\n conf_path="${0%/*/*/*}/backup_settings.conf"\n [[ ! -f $conf_path ]] && echo "$conf_path遺失"\n backup_mode=1\n . "${0%/*}/app_details" &>/dev/null\n . "${0%/*/*/*}/tools/tools.sh" | tee "$MODDIR/log.txt"\nelse\n echo "${0%/*/*}/tools/tools.sh遺失"\nfi' >"$Backup_folder/backup.sh" + endtime 2 "$name1 備份" "3" + Occupation_status="$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-1),$(NF)}')" + lxj="$(echo "$Occupation_status" | awk '{print $3}' | sed 's/%//g')" + echoRgb "完成$((i * 100 / r))% $hx$(echo "$Occupation_status" | awk 'END{print "剩餘:"$1"使用率:"$2}')" "3" + rgb_d="$rgb_a" + rgb_a=188 + echoRgb "_________________$(endtime 1 "已經")___________________" + rgb_a="$rgb_d" + else + echoRgb "$name1[$name2] 不在安裝列表,備份個寂寞?" "0" + fi + if [[ $i = $r ]]; then + endtime 1 "應用備份" "3" + #設置無障礙開關 + if [[ $var != "" ]]; then + if [[ $var != null ]]; then + settings put secure enabled_accessibility_services "$var" &>/dev/null + echo_log "設置無障礙" + settings put secure accessibility_enabled 1 &>/dev/null + echo_log "打開無障礙開關" + fi + fi + #設置鍵盤 + if [[ $keyboard != "" ]]; then + ime enable "$keyboard" &>/dev/null + ime set "$keyboard" &>/dev/null + settings put secure default_input_method "$keyboard" &>/dev/null + echo_log "設置鍵盤$(appinfo -d "(" -ed ")" -o anwb,pn -pn "${keyboard%/*}" 2>/dev/null)" + fi + [[ $update_apk2 = "" ]] && update_apk2="暫無更新" + [[ $add_app2 = "" ]] && add_app2="暫無更新" + echoRgb "\n -已更新的apk=\"$osn\"\n -已新增的備份=\"$osk\"\n -apk版本號無變化=\"$osj\"\n -下列為版本號已變更的應用\n$update_apk2\n -新增的備份....\n$add_app2" "3" + echo "$(sort "$txt2" | sed -e '/^$/d')" >"$txt2" + + if [[ $backup_media = true ]]; then + A=1 + B="$(echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" + if [[ $B != "" ]]; then + echoRgb "備份結束,備份多媒體" "1" + starttime1="$(date -u "+%s")" + Backup_folder="$Backup/Media" + [[ ! -f $Backup/恢復自定義資料夾.sh ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh" + [[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder" + app_details="$Backup_folder/app_details" + [[ -f $app_details ]] && . "$app_details" &>/dev/null || touch "$app_details" + mediatxt="$Backup/mediaList.txt" + [[ ! -f $mediatxt ]] && echo "#不需要恢復的資料夾請在開頭注釋# 比如#媒體" > "$mediatxt" + echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | while read; do + echoRgb "備份第$A/$B個資料夾 剩下$((B - A))個" "3" + starttime2="$(date -u "+%s")" + Backup_data "${REPLY##*/}" "$REPLY" + endtime 2 "${REPLY##*/}備份" "1" + echoRgb "完成$((A * 100 / B))% $hx$(echo "$Occupation_status" | awk 'END{print "剩餘:"$1"使用率:"$2}')" "2" + rgb_d="$rgb_a" + rgb_a=188 + echoRgb "_________________$(endtime 1 "已經")___________________" + rgb_a="$rgb_d" && let A++ + done + echoRgb "目錄↓↓↓\n -$Backup_folder" + endtime 1 "自定義備份" + else + echoRgb "自定義路徑為空 無法備份" "0" + fi + fi + fi + let i++ en++ nskg++ + done + #打開應用 + i=1 + am_start="$(echo "$am_start" | head -n 4 | xargs | sed 's/ /\|/g')" + while [[ $i -le $r ]]; do + unset pkg name1 + pkg="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" + if [[ $(echo "$pkg" | egrep -wo "^$am_start$") = $pkg ]]; then + am start -n "$(appinfo -o sa -pn "$pkg" 2>/dev/null)" &>/dev/null + echo_log "啟動$name1" + fi + let i++ + done + Set_screen_pause_seconds off + #Operation_screen on + restore_freeze + rm -rf "$TMPDIR/scriptTMP" + Calculate_size "$Backup" + echoRgb "批量備份完成" + starttime1="$TIME" + endtime 1 "批量備份開始到結束" + longToast "批量備份完成" + Print "批量備份完成 執行過程請查看$Status_log" + } & + wait && exit + ;; +dumpname) + get_name "Apkname" + ;; +convert) + get_name "convert" + ;; +check_file) + Check_archive "$MODDIR" + ;; +Restore|Restore2) + kill_Serve + self_test + disable_verify + [[ ! -d $path2 ]] && echoRgb "設備不存在user目錄" "0" && exit 1 + if [[ $operate = Restore ]]; then + echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊$MODDIR_NAME/終止腳本.sh\n -否則腳本將繼續執行直到結束" "0" + echoRgb "如果大量提示找不到資料夾請執行$MODDIR_NAME/轉換資料夾名稱.sh" + txt="$MODDIR/appList.txt" + [[ ! -f $txt ]] && echoRgb "請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 2 + sort -u "$txt" -o "$txt" 2>/dev/null + i=1 + r="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')" + [[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 1 + Backup_folder2="$MODDIR/Media" + Backup_folder3="$MODDIR/modules" + #效驗選填是否正確 + isBoolean "$Lo" "Lo" && Lo="$nsx" + echoRgb "選擇應用恢復模式\n -音量上僅恢復未安裝,下全恢復" + get_version "恢復未安裝" "全恢復" && recovery_mode="$branch" + Get_user="$(echo "$MODDIR" | rev | cut -d '/' -f1 | cut -d '_' -f1 | rev | egrep -o '[0-9]+')" + if [[ $Get_user != $user ]]; then + echoRgb "檢測當前用戶$user與恢復資料夾用戶:$Get_user不同\n -音量上繼續恢復,下不恢復並離開腳本" + get_version "恢復安裝" "不恢復安裝" && recovery_mode2="$branch" + fi + if [[ -d $Backup_folder2 ]]; then + Print "是否恢復多媒體數據 音量上恢復,音量下不恢復" + echoRgb "是否恢復多媒體數據\n -音量上恢復,音量下不恢復" "2" + get_version "恢復媒體數據" "跳過恢復媒體數據" + media_recovery="$branch" + A=1 + B="$(find "$Backup_folder2" -maxdepth 1 -name "*.tar*" -type f 2>/dev/null | wc -l)" + fi + if [[ -d $Backup_folder3 && $(find "$Backup_folder3" -maxdepth 1 -name "*.zip*" -type f 2>/dev/null | wc -l) != 0 ]]; then + Print "是否刷入Magisk模塊 音量上刷入,音量下不刷入" + echoRgb "是否刷入Magisk模塊\n -音量上刷入,音量下不刷入" "2" + get_version "刷入模塊" "跳過刷入模塊" + modules_recovery="$branch" + fi + [[ $recovery_mode2 = false ]] && exit 2 + if [[ $recovery_mode = true ]]; then + echoRgb "獲取未安裝應用中" + TXT="$MODDIR/TEMP.txt" + while [[ $i -le $r ]]; do + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" + name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + if [[ $(pm list packages --user "$user" "$name2" 2>/dev/null | cut -f2 -d ':') = "" ]]; then + echo "$name1 $name2">>"$TXT" + fi + let i++ + done + i=1 + sort -u "$TXT" -o "$TXT" 2>/dev/null + r="$(grep -v "#" "$TXT" 2>/dev/null | sed -e '/^$/d' | sed -n '$=')" + if [[ $r != "" ]]; then + echoRgb "獲取完成 預計安裝$r個應用" + txt="$TXT" + else + echoRgb "獲取完成 但備份內應用都已安裝....正在退出腳本" "0" && exit 0 + fi + fi + DX="批量恢復" + else + i=1 + r=1 + Backup_folder="$MODDIR" + app_details="$Backup_folder/app_details" + if [[ ! -f $app_details ]]; then + echoRgb "$app_details遺失,無法獲取包名" "0" && exit 1 + else + . "$app_details" &>/dev/null + fi + name1="$ChineseName" + [[ $name1 = "" ]] && name1="${Backup_folder##*/}" + [[ $name1 = "" ]] && echoRgb "應用名獲取失敗" "0" && exit 2 + name2="$PackageName" + [[ $name2 = "" ]] && echoRgb "包名獲取失敗" "0" && exit 2 + DX="單獨恢復" + fi + #開始循環$txt內的資料進行恢復 + #記錄開始時間 + starttime1="$(date -u "+%s")" + TIME="$starttime1" + Set_screen_pause_seconds on + en=118 + echo "$script">"$TMPDIR/scriptTMP" + { + while [[ $i -le $r ]]; do + [[ $en -ge 229 ]] && en=118 + if [[ $operate = Restore ]]; then + echoRgb "恢復第$i/$r個應用 剩下$((r - i))個" "3" + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" + name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + unset No_backupdata apk_version + if [[ $name1 = *! || $name1 = *! ]]; then + name1="$(echo "$name1" | sed 's/!//g ; s/!//g')" + echoRgb "跳過恢復$name1 所有數據" "0" + No_backupdata=1 + fi + Backup_folder="$MODDIR/$name1" + [[ -f "$Backup_folder/app_details" ]] && app_details="$Backup_folder/app_details" . "$Backup_folder/app_details" &>/dev/null + [[ $name2 = "" ]] && echoRgb "應用包名獲取失敗" "0" && exit 1 + fi + if [[ -d $Backup_folder ]]; then + echoRgb "恢復$name1 ($name2)" "2" + starttime2="$(date -u "+%s")" + if [[ $(pm path --user "$user" "$name2" 2>/dev/null) = "" ]]; then + installapk + else + if [[ $apk_version -gt $(pm list packages --show-versioncode --user "$user" "$name2" 2>/dev/null | cut -f3 -d ':' | head -n 1) ]]; then + installapk + [[ $? = 0 ]] && echoRgb "版本提升$(pm list packages --show-versioncode --user "$user" "$name2" 2>/dev/null | cut -f3 -d ':' | head -n 1)>$apk_version" "1" + elif [[ $apk_version -lt $(pm list packages --show-versioncode --user "$user" "$name2" 2>/dev/null | cut -f3 -d ':' | head -n 1) ]]; then + pm uninstall --user "$user" -k "$name2" &>/dev/null + if [[ $? = 0 ]]; then + installapk + echoRgb "版本降低$(pm list packages --show-versioncode --user "$user" "$name2" 2>/dev/null | cut -f3 -d ':' | head -n 1)>$apk_version" "1" + fi + fi + fi + if [[ $(pm path --user "$user" "$name2" 2>/dev/null) != "" ]]; then + if [[ $No_backupdata = "" ]]; then + kill_app + find "$Backup_folder" -maxdepth 1 ! -name "apk.*" -name "*.tar*" -type f 2>/dev/null | sort | while read; do + Release_data "$REPLY" + done + Set_service + fi + else + [[ $No_backupdata = "" ]]&& echoRgb "$name1沒有安裝無法恢復數據" "0" + fi + endtime 2 "$name1恢復" "2" && echoRgb "完成$((i * 100 / r))%" "3" + rgb_d="$rgb_a" + rgb_a=188 + echoRgb "_________________$(endtime 1 "已經")___________________" + rgb_a="$rgb_d" + else + echoRgb "$Backup_folder資料夾遺失,無法恢復" "0" + fi + if [[ $i = $r && $operate != Restore2 ]]; then + endtime 1 "應用恢復" "2" + if [[ $media_recovery = true ]]; then + starttime1="$(date -u "+%s")" + app_details="$Backup_folder2/app_details" + txt="$MODDIR/mediaList.txt" + sort -u "$txt" -o "$txt" 2>/dev/null + A=1 + B="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n '$=')" + [[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && B=0 + while [[ $A -le $B ]]; do + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')" + starttime2="$(date -u "+%s")" + echoRgb "恢復第$A/$B個壓縮包 剩下$((B - A))個" "3" + Release_data "$Backup_folder2/$name1" + endtime 2 "$FILE_NAME2恢復" "2" && echoRgb "完成$((A * 100 / B))%" "3" && echoRgb "____________________________________" && let A++ + done + endtime 1 "自定義恢復" "2" + fi + if [[ $modules_recovery = true ]]; then + A=1 + B="$(find "$Backup_folder3" -maxdepth 1 -name "*.zip*" -type f 2>/dev/null | wc -l)" + starttime1="$(date -u "+%s")" + find "$Backup_folder3" -maxdepth 1 -name "*.zip*" -type f 2>/dev/null | while read; do + starttime2="$(date -u "+%s")" + echoRgb "刷入第$A/$B個模塊 剩下$((B - A))個" "3" + echoRgb "刷入${REPLY##*/}" "2" + magisk --install-module "$REPLY" + endtime 2 "${REPLY##*/}刷入" "2" && echoRgb "完成$((A * 100 / B))%" "3" && echoRgb "____________________________________" && let A++ + done + endtime 1 "刷入模塊" "2" + fi + fi + let i++ en++ nskg++ + done + restore_freeze + rm -rf "$TMPDIR/scriptTMP" "$TXT" + Set_screen_pause_seconds off + starttime1="$TIME" + echoRgb "$DX完成" && endtime 1 "$DX開始到結束" && echoRgb "如發現應用閃退請重新開機" + longToast "$DX完成" + Print "$DX完成 執行過程請查看$Status_log" && rm -rf "$TMPDIR"/* + } & + wait && exit + ;; +Restore3) + kill_Serve + self_test + echoRgb "點錯了?這是恢復自定義資料夾腳本 如果你是要恢復應用那你就點錯了\n -音量上繼續恢復自定義資料夾,音量下離開腳本" "2" + echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊終止腳本.sh,否則腳本將繼續執行直到結束" "0" + get_version "恢復自定義資料夾" "離開腳本" && [[ "$branch" = false ]] && exit 0 + mediaDir="$MODDIR/Media" + [[ -f "$mediaDir/app_details" ]] && app_details="$mediaDir/app_details" &>/dev/null + Backup_folder2="$mediaDir" + [[ ! -d $mediaDir ]] && echoRgb "媒體資料夾不存在" "0" && exit 2 + txt="$MODDIR/mediaList.txt" + [[ ! -f $txt ]] && echoRgb "請執行\"重新生成應用列表.sh\"獲取媒體列表再來恢復" "0" && exit 2 + sort -u "$txt" -o "$txt" 2>/dev/null + #記錄開始時間 + starttime1="$(date -u "+%s")" + echo_log() { + if [[ $? = 0 ]]; then + echoRgb "$1成功" "1" && result=0 + else + echoRgb "$1恢復失敗,過世了" "0" && result=1 + fi + } + starttime1="$(date -u "+%s")" + A=1 + B="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')" + Set_screen_pause_seconds off + [[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && exit 1 + echo "$script">"$TMPDIR/scriptTMP" + { + while [[ $A -le $B ]]; do + name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')" + starttime2="$(date -u "+%s")" + echoRgb "恢復第$A/$B個壓縮包 剩下$((B - A))個" "3" + Release_data "$mediaDir/$name1" + endtime 2 "$FILE_NAME2恢復" "2" && echoRgb "完成$((A * 100 / B))%" "3" && echoRgb "____________________________________" && let A++ + done + Set_screen_pause_seconds off + endtime 1 "恢復結束" + rm -rf "$TMPDIR/scriptTMP" + } & + ;; +Getlist) + case $MODDIR in + /storage/emulated/0/Android/* | /data/media/0/Android/* | /sdcard/Android/*) echoRgb "請勿在$MODDIR內生成列表" "0" && exit 2 ;; + esac + #效驗選填是否正確 + isBoolean "$debug_list" "debug_list" && debug_list="$nsx" + isBoolean "$Lo" "Lo" && Lo="$nsx" + if [[ $Lo = false ]]; then + isBoolean "$blacklist_mode" "blacklist_mode" && blacklist_mode="$nsx" + else + if [[ $(echo "$blacklist" | grep -v "#" | wc -l) -gt 0 ]]; then + echoRgb "選擇黑名單模式\n -音量上不備份,音量下僅備份安裝檔" "2" + get_version "不備份" "備份安裝檔" && blacklist_mode="$branch" + fi + fi + txtpath="$MODDIR" + [[ $debug_list = true ]] && txtpath="${txtpath/'/storage/emulated/'/'/data/media/'}" + nametxt="$txtpath/appList.txt" + [[ ! -e $nametxt ]] && echo '#不需要備份的應用請在開頭注釋# 比如#酷安 xxxxxxxx\n#不需要備份數據比如!酷安 xxxxxxxx應用名前方方加一個驚嘆號即可 注意是應用名不是包名' >"$nametxt" + echoRgb "請勿關閉腳本,等待提示結束" + rgb_a=118 + starttime1="$(date -u "+%s")" + echoRgb "提示! 腳本會屏蔽預裝應用" "0" + xposed_name="$(appinfo -o pn -xm)" + Apk_info="$(appinfo -sort-i -d " " -o addXpTag:'Xposed: ',anwb,pn -pn $system -3 | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)" + [[ $Apk_info = "" ]] && { + echoRgb "appinfo輸出失敗,請截圖畫面回報作者" "0" + appinfo -sort-i -d " " -o addXpTag:'Xposed: ',anwb,pn -pn $system -3 | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u + exit 2 ; } || Apk_info="$(echo "$Apk_info" | sed 's/Xposed: //g')" && Apk_info2="$(echo "$Apk_info" | awk '{print $2}')" + Apk_Quantity="$(echo "$Apk_info" | wc -l)" + LR="1" + echoRgb "列出第三方應用......." "2" + i="0" + rc="0" + rd="0" + Q="0" + Output_list() { + if [[ $(cat "$nametxt" | cut -f2 -d ' ' | egrep -w "^${app_1[1]}$") != ${app_1[1]} ]]; then + case ${app_1[1]} in + *oneplus* | *miui* | *xiaomi* | *oppo* | *flyme* | *meizu* | com.android.soundrecorder | com.mfashiongallery.emag | com.mi.health | *coloros*) + if [[ $(echo "$xposed_name" | egrep -w "${app_1[1]}$") = ${app_1[1]} ]]; then + echoRgb "${app_1[2]}為Xposed模塊 進行添加" "0" + echo "$REPLY" >>"$nametxt" && [[ $tmp = "" ]] && tmp="1" + let i++ rd++ + else + if [[ $(echo "$whitelist" | egrep -w "^${app_1[1]}$") = ${app_1[1]} ]]; then + echo "$REPLY" >>"$nametxt" && [[ $tmp = "" ]] && tmp="1" + echoRgb "$REPLY($rgb_a)" + let i++ + else + echoRgb "${app_1[2]}非Xposed模塊 忽略輸出" "0" + let rc++ + fi + fi + ;; + *) + if [[ $(echo "$xposed_name" | egrep -w "${app_1[1]}$") = ${app_1[1]} ]]; then + echoRgb "Xposed: $REPLY($rgb_a)" + let rd++ + else + echoRgb "$REPLY($rgb_a)" + fi + echo "$REPLY" >>"$nametxt" && [[ $tmp = "" ]] && tmp="1" + let i++ + ;; + esac + else + let Q++ + fi + } + echo "$Apk_info" | sed 's/\///g ; s/\://g ; s/(//g ; s/)//g ; s/\[//g ; s/\]//g ; s/\-//g ; s/!//g' | while read; do + [[ $rgb_a -ge 229 ]] && rgb_a=118 + app_1=($REPLY $REPLY) + if [[ $blacklist_mode = true ]]; then + if [[ $(echo "$blacklist" | egrep -w "^${app_1[1]}$") != ${app_1[1]} ]]; then + Output_list + else + echoRgb "${app_1[2]}黑名單應用 不輸出" "0" + fi + else + Output_list + fi + if [[ $LR = $Apk_Quantity ]]; then + if [[ $(cat "$nametxt" | wc -l | awk '{print $1-2}') -lt $i ]]; then + rm -rf "$nametxt" + echoRgb "\n -輸出異常 請將$MODDIR_NAME/backup_settings.conf中的debug_list=\"0\"改為1或是重新執行本腳本" "0" + exit + fi + [[ $tmp != "" ]] && echoRgb "\n -第三方apk數量=\"$Apk_Quantity\"\n -已過濾=\"$rc\"\n -xposed=\"$rd\"\n -存在列表中=\"$Q\"\n -輸出=\"$i\"" + fi + let rgb_a++ LR++ + done + if [[ -f $nametxt ]]; then + D="1" + C="$(grep -v "#" "$nametxt" | sed -e '/^$/d' | sed -n '$=')" + while [[ $D -le $C ]]; do + name1="$(grep -v "#" "$nametxt" | sed -e '/^$/d' | sed -n "${D}p" | awk '{print $1}')" + name2="$(grep -v "#" "$nametxt" | sed -e '/^$/d' | sed -n "${D}p" | awk '{print $2}')" + if [[ $(echo "$Apk_info2" | egrep -w "^$name2$") != "" ]]; then + [[ $Tmplist = "" ]] && Tmplist='#不需要備份的應用請在開頭注釋# 比如#酷安 xxxxxxxx\n#不需要備份數據比如!酷安 xxxxxxxx應用名前方方加一個驚嘆號即可 注意是應用名不是包名' + Tmplist="$Tmplist\n$name1 $name2" + else + echoRgb "$name1 $name2不存在系統,從列表中刪除" "0" + fi + let D++ + done + [[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$nametxt" + fi + wait + endtime 1 + echoRgb "輸出包名結束 請查看$nametxt" + ;; +backup_media) + kill_Serve + self_test + backup_path + echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊終止腳本.sh,否則腳本將繼續執行直到結束" "0" + A=1 + B="$(echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" + if [[ $B != "" ]]; then + starttime1="$(date -u "+%s")" + Backup_folder="$Backup/Media" + [[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder" + [[ ! -f $Backup/恢復自定義資料夾.sh ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh" + [[ ! -f $Backup/重新生成應用列表.sh ]] && touch_shell "dumpname" "$Backup/重新生成應用列表.sh" + [[ ! -f $Backup/轉換資料夾名稱.sh ]] && touch_shell "convert" "$Backup/轉換資料夾名稱.sh" + [[ ! -f $Backup/壓縮檔完整性檢查.sh ]] && touch_shell "check_file" "$Backup/壓縮檔完整性檢查.sh" + [[ ! -d $Backup/tools ]] && cp -r "$tools_path" "$Backup" + [[ ! -f $Backup/backup_settings.conf ]] && echo "#1開啟0關閉\n\n#是否在每次執行恢復腳本時使用音量鍵詢問如下需求\n#如果是那下面兩項項設置就被忽略,改為音量鍵選擇\nLo=$Lo\n\n#備份與恢復遭遇異常或是結束後發送通知(toast與狀態欄提示)\ntoast_info=$toast_info\n\n#使用者\nuser=\n\n#腳本檢測更新後進行更新?\nupdate=$update\n\n#主色\nrgb_a=$rgb_a\n#輔色\nrgb_b=$rgb_b\nrgb_c=$rgb_c">"$Backup/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/backup_settings.conf" + app_details="$Backup_folder/app_details" + filesize="$(du -s "$Backup_folder" | awk '{print $1}')" + [[ -f $app_details ]] && . "$app_details" &>/dev/null || touch "$app_details" + mediatxt="$Backup/mediaList.txt" + [[ ! -f $mediatxt ]] && echo "#不需要恢復的資料夾請在開頭注釋# 比如#媒體" > "$mediatxt" + echo "$script">"$TMPDIR/scriptTMP" + Set_screen_pause_seconds on + { + echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | while read; do + echoRgb "備份第$A/$B個資料夾 剩下$((B - A))個" "3" + starttime2="$(date -u "+%s")" + [[ ${REPLY: -1} = / ]] && REPLY="${REPLY%?}" + Backup_data "${REPLY##*/}" "$REPLY" + endtime 2 "${REPLY##*/}備份" "1" + echoRgb "完成$((A * 100 / B))% $hx$(echo "$Occupation_status" | awk 'END{print "剩餘:"$1"使用率:"$2}')" "2" && echoRgb "____________________________________" && let A++ + done + } & + wait + Calculate_size "$Backup_folder" + Set_screen_pause_seconds off + endtime 1 "自定義備份" + rm -rf "$TMPDIR/scriptTMP" + else + echoRgb "自定義路徑為空 無法備份" "0" + fi + ;; +Device_List) + URL="https://khwang9883.github.io/MobileModels/brands" + rm -rf "$tools_path/Device_List" + for i in $(echo "xiaomi\nsamsung\nasus\nBlack_Shark\ngoogle\nLenovo\nMEIZU\nMotorola\nNokia\nnothing\nnubia\nOnePlus\nSony"); do + echoRgb "獲取品牌$i" + case $i in + xiaomi) Brand_URL="$URL/xiaomi.html" ;; + samsung) Brand_URL="$URL/samsung_cn.html" ;; + asus) Brand_URL="$URL/asus.html" ;; + Black_Shark) Brand_URL="$URL/blackshark.html" ;; + google) Brand_URL="$URL/google.html" ;; + Lenovo) Brand_URL="$URL/lenovo.html" ;; + MEIZU) Brand_URL="$URL/meizu.html" ;; + Motorola) Brand_URL="$URL/motorola.html" ;; + Nokia) Brand_URL="$URL/nokia.html" ;; + nothing) Brand_URL="$URL/nothing.html" ;; + nubia) Brand_URL="$URL/nubia.html" ;; + OnePlus) Brand_URL="$URL/oneplus.html" ;; + Sony) Brand_URL="$URL/sony_cn.html" ;; + esac + Brand_URL="$URL/xiaomi.html" + down -s -L "$Brand_URL" | sed -n 's/.*\([^<]*\)<\/code>: \(.*\)<\/p>.*/\1\n\2/p' | sed 's/\(.*\)/"\1"/' | sed 'N;s/\n/ /'>>"$tools_path/Device_List" + done + if [[ -e $tools_path/Device_List ]]; then + if [[ $(ls -l "$tools_path/Device_List" | awk '{print $5}') -gt 1 ]]; then + [[ $shell_language = zh-TW ]] && ts -f "$tools_path/Device_List" -o "$tools_path/Device_List" + echoRgb "已下載機型列表在$tools_path/Device_List" + else + echoRgb "下載機型失敗" + fi + else + echoRgb "下載機型失敗" + fi ;; +esac diff --git a/tools/zstd b/tools/zstd new file mode 100644 index 0000000..6b08378 Binary files /dev/null and b/tools/zstd differ diff --git a/備份應用.sh b/備份應用.sh index 43b2abc..30aa6ab 100644 --- a/備份應用.sh +++ b/備份應用.sh @@ -1,8 +1,8 @@ -if [ -f "${0%/*}/tools/bin/tools.sh" ]; then +if [ -f "${0%/*}/tools/tools.sh" ]; then MODDIR="${0%/*}" operate="backup" - . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" + . "${0%/*}/tools/tools.sh" | tee "$MODDIR/log.txt" else [[ $(echo "${0%/*}" | grep -o 'bin.mt.plus/temp') != "" ]] && echo "你媽沒告訴你腳本要解壓縮嗎?傻逼玩兒" && exit 2 - echo "${0%/*}/tools/bin/tools.sh遺失" + echo "${0%/*}/tools/tools.sh遺失" fi \ No newline at end of file diff --git a/備份自定義資料夾.sh b/備份自定義資料夾.sh index 891920d..990dded 100644 --- a/備份自定義資料夾.sh +++ b/備份自定義資料夾.sh @@ -1,8 +1,8 @@ -if [ -f "${0%/*}/tools/bin/tools.sh" ]; then +if [ -f "${0%/*}/tools/tools.sh" ]; then MODDIR="${0%/*}" operate="backup_media" - . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" + . "${0%/*}/tools/tools.sh" | tee "$MODDIR/log.txt" else [[ $(echo "${0%/*}" | grep -o 'bin.mt.plus/temp') != "" ]] && echo "你媽沒告訴你腳本要解壓縮嗎?傻逼玩兒" && exit 2 - echo "${0%/*}/tools/bin/tools.sh遺失" + echo "${0%/*}/tools/tools.sh遺失" fi \ No newline at end of file diff --git a/生成應用列表.sh b/生成應用列表.sh index 44fd7f8..5d734df 100644 --- a/生成應用列表.sh +++ b/生成應用列表.sh @@ -1,9 +1,9 @@ -if [ -f "${0%/*}/tools/bin/tools.sh" ]; then +if [ -f "${0%/*}/tools/tools.sh" ]; then MODDIR="${0%/*}" operate="Getlist" #operate="Device_List" - . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" + . "${0%/*}/tools/tools.sh" | tee "$MODDIR/log.txt" else [[ $(echo "${0%/*}" | grep -o 'bin.mt.plus/temp') != "" ]] && echo "你媽沒告訴你腳本要解壓縮嗎?傻逼玩兒" && exit 2 - echo "${0%/*}/tools/bin/tools.sh遺失" + echo "${0%/*}/tools/tools.sh遺失" fi \ No newline at end of file diff --git a/終止腳本.sh b/終止腳本.sh index 0c2e897..8ef5851 100644 --- a/終止腳本.sh +++ b/終止腳本.sh @@ -1,11 +1,11 @@ -if [ -f "${0%/*}/tools/bin/tools.sh" ]; then +if [ -f "${0%/*}/tools/tools.sh" ]; then MODDIR="${0%/*}" [[ $(find "$MODDIR" -maxdepth 1 -name "*.zip" -type f 2>/dev/null) ]] && echo "警告!此腳本不能拿來更新腳本" && exit 2 - . "$MODDIR/tools/bin/tools.sh" + . "$MODDIR/tools/tools.sh" echoRgb "等待腳本停止中,請稍後....." kill_Serve && echoRgb "腳本終止" exit else [[ $(echo "${0%/*}" | grep -o 'bin.mt.plus/temp') != "" ]] && echo "你媽沒告訴你腳本要解壓縮嗎?傻逼玩兒" && exit 2 - echo "${0%/*}/tools/bin/tools.sh遺失" + echo "${0%/*}/tools/tools.sh遺失" fi \ No newline at end of file