更新應(yīng)用程序的方法及裝置制造方法
【專利摘要】本公開實(shí)施例提供了更新應(yīng)用程序的方法及裝置,其中的方法包括:獲取終端設(shè)備處理器的核數(shù);根據(jù)所述核數(shù)在第一語言環(huán)境下開啟多個(gè)更新線程;在每個(gè)更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從第一列表移至第二列表;在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將更新完成的應(yīng)用程序從第二列表中移除。本公開中使用預(yù)設(shè)的接口例如JNI接口,使一種語言下的更新線程可以直接調(diào)用另一種語言下的更新函數(shù),不但避免了因建立socket連接而導(dǎo)致的時(shí)間及系統(tǒng)資源消耗,且可同時(shí)進(jìn)行多線程更新,大大提高了應(yīng)用程序同時(shí)需要更新時(shí)的更新效率。
【專利說明】更新應(yīng)用程序的方法及裝置
【技術(shù)領(lǐng)域】
[0001] 本公開涉及終端設(shè)備程序處理【技術(shù)領(lǐng)域】,尤其涉及更新應(yīng)用程序的方法及裝置。
【背景技術(shù)】
[0002] 隨著智能手機(jī)、平板電腦等終端設(shè)備的硬件配置不斷提升、功能日益豐富,用戶對(duì) 這些終端設(shè)備的需求也在增強(qiáng),往往會(huì)在終端設(shè)備中安裝各種各樣的應(yīng)用程序,這就使得 終端設(shè)備上的應(yīng)用程序越來越多。
[0003] 并且,為了提升用戶體驗(yàn),移動(dòng)終端的操作系統(tǒng)也會(huì)經(jīng)常進(jìn)行升級(jí)操作。在 Android系統(tǒng)中,每進(jìn)行一次系統(tǒng)升級(jí),會(huì)對(duì)操作系統(tǒng)中所有的應(yīng)用程序進(jìn)行更新(也可稱 為優(yōu)化),以使其在升級(jí)后的操作系統(tǒng)中可以快速運(yùn)行。其中,對(duì)應(yīng)用程序的更新操作以 0DEX操作為主。這樣每次在系統(tǒng)升級(jí)完畢后的第一次開機(jī)啟動(dòng)時(shí),因?yàn)橐来胃卤姸鄳?yīng) 用程序,會(huì)導(dǎo)致啟動(dòng)過程非常慢,耗費(fèi)很長的時(shí)間。
[0004] 以安裝了 Android安卓系統(tǒng)的手機(jī)為例,安卓系統(tǒng)通常使用Java語言作為開發(fā)工 具,但由于某些原因,應(yīng)用程序更新的底層代碼會(huì)使用Native語言(例如C/C++語言,C/ C++等語目相對(duì)于Java來講可稱為Native語目,或者原生語目、本地語目)來實(shí)現(xiàn),所以 應(yīng)用程序的更新就會(huì)涉及到Native語言層與Java層之間的通信。在相關(guān)技術(shù)中,安卓系 統(tǒng)采用的是socket通信機(jī)制,即在Java層與Native語言層之間建立socket連接,通過 socket連接實(shí)現(xiàn)應(yīng)用程序的更新。然而,建立socket連接本身就會(huì)消耗一定的時(shí)間及系統(tǒng) 資源,而且該通信機(jī)制也決定了更新過程只能是單線程執(zhí)行,即逐一更新各應(yīng)用程序,所以 效率很低,造成系統(tǒng)升級(jí)完畢后的第一次開機(jī)啟動(dòng)過程非常耗時(shí)。
【發(fā)明內(nèi)容】
[0005] 為克服相關(guān)技術(shù)中存在的問題,本公開提供更新應(yīng)用程序的方法及裝置,以解決 同時(shí)更新多個(gè)應(yīng)用程序時(shí)耗時(shí)較長的問題。
[0006] 根據(jù)本公開實(shí)施例的第一方面,提供一種更新應(yīng)用程序的方法,所述方法包括:
[0007] 獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;
[0008] 創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表;
[0009] 獲取終端設(shè)備處理器的核數(shù);
[0010] 根據(jù)所述核數(shù)在第一語言環(huán)境下同時(shí)開啟多個(gè)更新線程;
[0011] 在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)所 述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所述第一列表移至 所述第二列表;
[0012] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述更新完成的應(yīng)用 程序從所述第二列表中移除。
[0013] 可選的,所述第一語言為Java,所述第二語言為C/C++,所述預(yù)設(shè)的接口為Java本 地接口 JNI。
[0014] 可選的,所述通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù),包括:
[0015] 在負(fù)責(zé)應(yīng)用程序更新的Java類中加載指定C文件編譯后生成的類庫,其中所述 c文件中含有所述使用C/C++實(shí)現(xiàn)的更新函數(shù)且所述C文件中引入了 JNI. h頭文件,所述 Java類中聲明了所述更新函數(shù);
[0016] 在所述Java類的所述更新線程中,直接調(diào)用所述更新函數(shù)。
[0017] 可選的,所述多個(gè)更新線程的個(gè)數(shù)為:
[0018] 如果 M> = N,則 a = N ;如果 M〈N,則 a = Μ ;
[0019] 其中,a為所述多個(gè)更新線程的個(gè)數(shù),Μ為所述第一列表中應(yīng)用程序的個(gè)數(shù),Ν為所 述處理器的核數(shù)。
[0020] 可選的,所述方法還包括:
[0021] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,判斷所述第一列表中是 否還有應(yīng)用程序;
[0022] 如果所述第一列表中沒有應(yīng)用程序,則結(jié)束當(dāng)前的更新線程;
[0023] 如果所述第一列表中仍有應(yīng)用程序,則繼續(xù)在所述第一列表中選取一個(gè)應(yīng)用程序 通過當(dāng)前的更新線程進(jìn)行更新。
[0024] 根據(jù)本公開實(shí)施例的第二方面,提供一種更新應(yīng)用程序的裝置,所述裝置包括:
[0025] 列表操作模塊,用于獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;創(chuàng) 建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表;將正在被更新的應(yīng)用程序從所 述第一列表移至所述第二列表;以及,在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響 應(yīng)后,將所述更新完成的應(yīng)用程序從所述第二列表中移除;
[0026] 線程控制模塊,用于獲取終端設(shè)備處理器的核數(shù);根據(jù)所述核數(shù)在第一語言環(huán)境 下同時(shí)開啟多個(gè)更新線程;
[0027] 更新執(zhí)行模塊,用于在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí) 現(xiàn)的更新函數(shù)以對(duì)所述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新。
[0028] 可選的,所述第一語言為Java,所述第二語言為C/C++,所述預(yù)設(shè)的接口為Java本 地接口 JNI。
[0029] 可選的,所述更新執(zhí)行模塊包括:
[0030] 調(diào)用準(zhǔn)備子模塊,用于在負(fù)責(zé)應(yīng)用程序更新的Java類中加載指定C文件編譯后生 成的類庫,其中所述C文件中含有所述使用C/C++實(shí)現(xiàn)的更新函數(shù)且所述C文件中引入了 JNI. h頭文件,所述Java類中聲明了所述更新函數(shù);
[0031] 調(diào)用執(zhí)行子模塊,用于在所述Java類的所述更新線程中,直接調(diào)用所述更新函 數(shù)。
[0032] 可選的,所述線程控制模塊還用于:
[0033] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,判斷所述第一列表中是 否還有應(yīng)用程序;如果所述第一列表中沒有應(yīng)用程序,則結(jié)束當(dāng)前的更新線程;如果所述 第一列表中仍有應(yīng)用程序,則繼續(xù)在所述第一列表中選取一個(gè)應(yīng)用程序通過當(dāng)前的更新線 程進(jìn)行更新。
[0034] 根據(jù)本公開實(shí)施例的第三方面,提供一種更新應(yīng)用程序的裝置,包括:
[0035] 處理器;
[0036] 用于存儲(chǔ)處理器可執(zhí)行指令的存儲(chǔ)器;
[0037] 其中,所述處理器被配置為:
[0038] 獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;
[0039] 創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表;
[0040] 獲取終端設(shè)備處理器的核數(shù);
[0041] 根據(jù)所述核數(shù)在第一語言環(huán)境下同時(shí)開啟多個(gè)更新線程;
[0042] 在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)所 述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所述第一列表移至 所述第二列表;
[0043] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述更新完成的應(yīng)用 程序從所述第二列表中移除。
[0044] 本公開的實(shí)施例提供的技術(shù)方案可以包括以下有益效果:
[0045] 在本公開實(shí)施例中,不再使用socket通信技術(shù),也即并未在兩種語言之間建立 socket連接,而是使用預(yù)設(shè)的接口,例如JNI接口,使一種語言下的更新線程可以直接調(diào)用 另一種語言下的更新函數(shù),從而不但避免了因建立socket連接而導(dǎo)致的時(shí)間及系統(tǒng)資源 的消耗,而且將單線程的更新轉(zhuǎn)變?yōu)橥瑫r(shí)進(jìn)行的多線程更新,大大提高了眾多應(yīng)用程序同 時(shí)需要更新時(shí)的更新效率,縮短了開機(jī)啟動(dòng)時(shí)間。
[0046] 應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不 能限制本公開。
【專利附圖】
【附圖說明】
[0047] 此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實(shí)施 例,并與說明書一起用于解釋本發(fā)明的原理。
[0048] 圖1是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的方法的流程圖;
[0049] 圖2是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的方法的流程圖;
[0050] 圖3是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的方法的流程圖;
[0051] 圖4是相關(guān)技術(shù)中更新應(yīng)用程序的不意圖;
[0052] 圖5是根據(jù)一示例性實(shí)施例示出的更新應(yīng)用程序的原理圖;
[0053] 圖6是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的方法的流程圖;
[0054] 圖7是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的裝置的框圖;
[0055] 圖8是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的裝置的框圖;
[0056] 圖9是根據(jù)一示例性實(shí)施例示出的一種用于更新應(yīng)用程序的裝置的框圖。
【具體實(shí)施方式】
[0057] 這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及 附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例 中所描述的實(shí)施方式并不代表與本發(fā)明相一致的所有實(shí)施方式。相反,它們僅是與如所附 權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
[0058] 圖1是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的方法的流程圖。該方法可 以用于手機(jī)、平板電腦等終端設(shè)備。參見圖1所示,該方法可以包括:
[0059] 在步驟S101中,獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;創(chuàng)建 第二列表,所述第二列表為正在更新的應(yīng)用程序的列表。
[0060] 在本實(shí)施例中,因?yàn)榇碌膽?yīng)用程序眾多,所以使用這兩個(gè)列表進(jìn)行管理,第一 列表用于存儲(chǔ)待更新應(yīng)用程序的相關(guān)信息,第二列表用于存儲(chǔ)正在更新的應(yīng)用程序的相關(guān) 信息。在更新過程中,眾多待更新應(yīng)用程序的相關(guān)信息會(huì)從第一列表逐漸轉(zhuǎn)移至第二列表, 從而使系統(tǒng)可以掌控更新的過程。
[0061] 在步驟S102中,獲取終端設(shè)備處理器的核數(shù);根據(jù)所述核數(shù)在第一語言環(huán)境下同 時(shí)開啟多個(gè)更新線程。
[0062] 本實(shí)施例中使用多線程進(jìn)行并行更新,以提高更新效率。
[0063] 作為示例,所述多個(gè)更新線程的個(gè)數(shù)為:
[0064] 如果 M> = N,則 a = N ;如果 M〈N,則 a = Μ ;
[0065] 其中,a為所述多個(gè)更新線程的個(gè)數(shù),Μ為所述第一列表中應(yīng)用程序的個(gè)數(shù),Ν為所 述處理器的核數(shù)。
[0066] 在步驟S103中,在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的 更新函數(shù)以對(duì)所述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所 述第一列表移至所述第二列表。
[0067] 在本實(shí)施例中,使用預(yù)設(shè)的接口實(shí)現(xiàn)兩種語言環(huán)境的融合。對(duì)于預(yù)設(shè)的接口的具 體實(shí)現(xiàn)形式本實(shí)施例并不進(jìn)行限制。
[0068] 作為示例,在一種場(chǎng)景下,所述第一語言為Java,所述第二語言為C/C++,所述預(yù) 設(shè)的接口為Java本地接口 JNI。
[0069] JNI (Java Native Interface, Java 本地接口)是 Java 提供的一個(gè)重要的功能, 它使得用諸如C/C++等語言編寫的代碼可以與運(yùn)行于JVM(Java Virtual Machine, Java 虛擬機(jī))中的Java代碼集成。JNI能滿足開發(fā)者在Java代碼中訪問Native模塊的需求。 JNI的出現(xiàn)使得開發(fā)者既可以利用Java語言跨平臺(tái)、類庫豐富、開發(fā)便捷等特點(diǎn),又可以利 用Native語言的高效。
[0070] 實(shí)際上,JNI是JVM實(shí)現(xiàn)中的一部分,因此Native語言和Java代碼都運(yùn)行在JVM 的宿主環(huán)境(Host Environment)。此外,JNI是一個(gè)雙向的接口:開發(fā)者不僅可以通過JNI 在Java代碼中訪問Native模塊,還可以在Native代碼中嵌入一個(gè)JVM,并通過JNI訪問運(yùn) 行于其中的Java模塊。可見,JNI擔(dān)任了一個(gè)橋梁的角色,它將JVM與Native模塊聯(lián)系起 來,從而實(shí)現(xiàn)了 Java代碼與Native代碼的互訪。
[0071] 在步驟S104中,在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述 更新完成的應(yīng)用程序從所述第二列表中移除。
[0072] 參見圖2所示,在本實(shí)施例或本公開其他某些實(shí)施例中,所述通過預(yù)設(shè)的接口調(diào) 用由第二語言實(shí)現(xiàn)的更新函數(shù),包括:
[0073] 在步驟S201中,在負(fù)責(zé)應(yīng)用程序更新的Java類中加載指定C文件編譯后生成的 類庫,其中所述C文件中含有所述使用C/C++實(shí)現(xiàn)的更新函數(shù)且所述C文件中引入了 JNI. h頭文件,所述Java類中聲明了所述更新函數(shù)。
[0074] 在步驟S202中,在所述Java類的所述更新線程中,直接調(diào)用所述更新函數(shù)。
[0075] 參見圖3所示,在本實(shí)施例或本公開其他某些實(shí)施例中,所述方法還可以包括:
[0076] 在步驟S301中,在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,判斷所 述第一列表中是否還有應(yīng)用程序;
[0077] 在步驟S302中,如果所述第一列表中沒有應(yīng)用程序,則結(jié)束當(dāng)前的更新線程;
[0078] 在步驟S303中,如果所述第一列表中仍有應(yīng)用程序,則繼續(xù)在所述第一列表中選 取一個(gè)應(yīng)用程序通過當(dāng)前的更新線程進(jìn)行更新。
[0079] 在本實(shí)施例中,并未使用socket通信技術(shù),也即并未在兩種語言之間建立socket 連接,而是使用預(yù)設(shè)的接口,例如JNI接口,使一種語言下的更新線程可以直接調(diào)用另一種 語言下的更新函數(shù),從而不但避免了因建立socket連接而導(dǎo)致的時(shí)間及系統(tǒng)資源的消耗, 而且將單線程的更新轉(zhuǎn)變?yōu)橥瑫r(shí)進(jìn)行的多線程更新,大大提高了眾多應(yīng)用程序同時(shí)需要更 新時(shí)的更新效率,縮短了開機(jī)啟動(dòng)時(shí)間。
[0080] 下面結(jié)合一個(gè)具體場(chǎng)景對(duì)本公開的方案作進(jìn)一步說明。
[0081] 在安卓系統(tǒng)下,應(yīng)用程序的APK的classes, dex文件中含有應(yīng)用程序的運(yùn)行代碼。 為了提高應(yīng)用程序的啟動(dòng)、運(yùn)行的速度,可以使用0DEX技術(shù)。所謂0DEX技術(shù),簡言之即將 classes, dex中的代碼預(yù)先提取出來生成一個(gè)dex文件。
[0082] 當(dāng)系統(tǒng)升級(jí)后,原先提取生成的dex文件已失效,需要重新進(jìn)行提取,這一重新提 取的過程即上文所說的應(yīng)用程序的更新。該提取過程涉及到Java層與C層之間的通信。
[0083] 在相關(guān)技術(shù)中,Java層與C層之間的通信使用了 socket技術(shù)。作為示例可參見 圖4所示。在圖4中,Java層(相當(dāng)于socket通信中的客戶端)與C層(相當(dāng)于socket 通信中的服務(wù)器端)分別創(chuàng)建socket ;C層在執(zhí)行了 "bindO "等一系列操作之后等待 Java層的連接Java層通過"Connect ()"請(qǐng)求連接;雙方在經(jīng)過了請(qǐng)求(request)及應(yīng)答 (response)之后連接成功(connected),然后進(jìn)行讀寫操作,以對(duì)應(yīng)用程序進(jìn)行逐個(gè)更新; 最后關(guān)閉socket。
[0084] 建立socket連接本身就會(huì)消耗一定的時(shí)間及系統(tǒng)資源,而且該通信機(jī)制也決定 了更新過程只能是單線程執(zhí)行,即逐一更新各應(yīng)用程序,所以效率很低,造成系統(tǒng)升級(jí)完畢 后的第一次開機(jī)啟動(dòng)過程非常耗時(shí)。
[0085] 在本實(shí)施例中,不再使用socket,而是使用JNI??蓞⒁妶D5所示。
[0086] 圖5是根據(jù)一示例性實(shí)施例示出的更新應(yīng)用程序的原理圖:
[0087] 在圖5中,首先手機(jī)在啟動(dòng)時(shí)會(huì)開啟用于應(yīng)用程序更新的Android服務(wù) (PackageManagerService),獲取需要更新的應(yīng)用程序列表,然后根據(jù)CPU核數(shù)開啟多個(gè)線 程,在每個(gè)線程中均調(diào)用更新應(yīng)用程序的函數(shù),也即通過JNI調(diào)用C語言實(shí)現(xiàn)的native函 數(shù)(desopt函數(shù)),然后進(jìn)行應(yīng)用程序的更新。
[0088] 具體的,參見圖6所示,可以包括:
[0089] 在步驟S601中,在用于進(jìn)行應(yīng)用程序更新的Java類中聲明一個(gè)native函數(shù)。
[0090] 例如:
[0091] public native int doDexOpt(String apkPath, String uid, int isPublic)
[0092] 在步驟S602中,使用C/C++語言實(shí)現(xiàn)上述native函數(shù)。這個(gè)native函數(shù)用于完 成對(duì)應(yīng)用程序進(jìn)行更新的具體工作。
[0093] 在步驟S603中,創(chuàng)建JNI目錄(如果工程已有該項(xiàng)目,則可以直接使用),在JNI 目錄下創(chuàng)建一個(gè)C文件,并在該C文件中包含上述native函數(shù),并引入jni. h頭文件。
[0094] 作為示例,倉ll建的c文件可以為update_app. c文件,實(shí)現(xiàn)如下:
[0095] ttinciude <jni.h> static int doDexOpt: (JXfEnv 承 env5 jobject object, jstringapk path, jstringuid, j 1 nt is___pub 11c, char reply[ΚΚΡΙΛ.......MAXj) { //實(shí)現(xiàn)方法參考commands, c文件中的 // int dcxopt(const char *apk------path, uid------t uid, int is------public) }
[0096]
[0097] 在步驟S604中,修改Android, mk文件,從而使上述c文件也能被編譯。編譯后會(huì) 自動(dòng)生成一個(gè)· so文件。
[0098] 作為示例,可以在Android, mk文件中修改添加下面兩句
[0099] L0CAL_C_INCLUDES: = $(L0CAL_PATH)/include
[0100] L0CAL_SRC_FILES+ = jni/update_app. c
[0101] 編譯生成 libupdate_app. so 文件。
[0102] 在步驟S605中,在上述用于進(jìn)行應(yīng)用程序更新的Java類中,加載所述c文件。這 樣便可以直接調(diào)用上述native函數(shù)對(duì)應(yīng)用程序進(jìn)行更新。
[0103] 例如,在類開始處添加上述c文件,去掉文件后綴,即
[0104] static {
[0105] System. loadLibrary("update_app");
[0106] }
[0107] 在步驟S606中,系統(tǒng)啟動(dòng)過程中,得到待更新的應(yīng)用程序的列表x,并創(chuàng)建正在更 新中的應(yīng)用列表y。例如待的應(yīng)用程序有Μ個(gè)。
[0108] 在步驟S607中,得到CPU的核數(shù)。例如核數(shù)有Ν個(gè)。
[0109] 在步驟S608中,同時(shí)開啟a個(gè)線程,在每個(gè)線程中,將相應(yīng)應(yīng)用程序的apk路徑等 信息作為參數(shù),直接調(diào)用上述native函數(shù),從而實(shí)現(xiàn)同時(shí)對(duì)a個(gè)應(yīng)用程序進(jìn)行更新;在對(duì)某 一個(gè)應(yīng)用程序開始更新時(shí),將該應(yīng)用程序從X列表中移除,并且加入y列表。
[0110] 其中a的計(jì)算算法可以是:
[0111] if M> = N, then a = N, if M<N, then a = M
[0112] 在步驟S609中,收到某個(gè)應(yīng)用程序更新完成的響應(yīng)后,從正在更新的應(yīng)用列表y 中移除該應(yīng)用程序的相關(guān)信息。判斷是否仍有待更新的應(yīng)用程序,如果沒有,結(jié)束當(dāng)前線 程,如果有,則發(fā)起對(duì)另一個(gè)應(yīng)用程序的更新操作。
[0113] 圖7是根據(jù)一示例性實(shí)施例示出的一種更新應(yīng)用程序的裝置的框圖。該裝置可以 用于手機(jī)、平板電腦等終端設(shè)備。參見圖7所示,該裝置可以包括:
[0114] 列表操作模塊701,用于獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列 表;創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表;將正在被更新的應(yīng)用程 序從所述第一列表移至所述第二列表;以及,在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完 成的響應(yīng)后,將所述更新完成的應(yīng)用程序從所述第二列表中移除;
[0115] 線程控制模塊702,用于獲取終端設(shè)備處理器的核數(shù);根據(jù)所述核數(shù)在第一語言 環(huán)境下同時(shí)開啟多個(gè)更新線程;
[0116] 更新執(zhí)行模塊703,用于在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言 實(shí)現(xiàn)的更新函數(shù)以對(duì)所述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新。
[0117] 在本實(shí)施例或本公開其他某些實(shí)施例中,所述第一語言為Java,所述第二語言為 C/C++,所述預(yù)設(shè)的接口為Java本地接口 JNI。
[0118] 參見圖8所示,在本實(shí)施例或本公開其他某些實(shí)施例中,所述更新執(zhí)行模塊703可 以包括:
[0119] 調(diào)用準(zhǔn)備子模塊7031,用于在負(fù)責(zé)應(yīng)用程序更新的Java類中加載指定C文件編譯 后生成的類庫,其中所述C文件中含有所述使用C/C++實(shí)現(xiàn)的更新函數(shù)且所述C文件中引 入了 JNI. h頭文件,所述Java類中聲明了所述更新函數(shù);
[0120] 調(diào)用執(zhí)行子模塊7032,用于在所述Java類的所述更新線程中,直接調(diào)用所述更新 函數(shù)。
[0121] 在本實(shí)施例或本公開其他某些實(shí)施例中,所述線程控制模塊702還可以用于:
[0122] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,判斷所述第一列表中是 否還有應(yīng)用程序;如果所述第一列表中沒有應(yīng)用程序,則結(jié)束當(dāng)前的更新線程;如果所述 第一列表中仍有應(yīng)用程序,則繼續(xù)在所述第一列表中選取一個(gè)應(yīng)用程序通過當(dāng)前的更新線 程進(jìn)行更新。
[0123] 關(guān)于上述實(shí)施例中的裝置,其中各個(gè)模塊執(zhí)行操作的具體方式已經(jīng)在有關(guān)該方法 的實(shí)施例中進(jìn)行了詳細(xì)描述,此處將不做詳細(xì)闡述說明。
[0124] 本公開還提供了一種更新應(yīng)用程序的裝置,包括:
[0125] 處理器;
[0126] 用于存儲(chǔ)處理器可執(zhí)行指令的存儲(chǔ)器;
[0127] 其中,所述處理器被配置為:
[0128] 獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;
[0129] 創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表;
[0130] 獲取終端設(shè)備處理器的核數(shù);
[0131] 根據(jù)所述核數(shù)在第一語言環(huán)境下同時(shí)開啟多個(gè)更新線程;
[0132] 在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)所 述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所述第一列表移至 所述第二列表;
[0133] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述更新完成的應(yīng)用 程序從所述第二列表中移除。
[0134] 本公開還公開了一種非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),當(dāng)所述存儲(chǔ)介質(zhì)中的指令 由終端設(shè)備的處理器執(zhí)行時(shí),使得終端設(shè)備能夠執(zhí)行一種更新應(yīng)用程序方法,所述方法包 括:
[0135] 獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;
[0136] 創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表;
[0137] 獲取終端設(shè)備處理器的核數(shù);
[0138] 根據(jù)所述核數(shù)在第一語言環(huán)境下同時(shí)開啟多個(gè)更新線程;
[0139] 在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)所 述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所述第一列表移至 所述第二列表;
[0140] 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述更新完成的應(yīng)用 程序從所述第二列表中移除。
[0141] 圖9是根據(jù)一示例性實(shí)施例示出的一種用于更新應(yīng)用程序的裝置的框圖。例如, 該裝置2800可以是移動(dòng)電話,計(jì)算機(jī),數(shù)字廣播終端,消息收發(fā)設(shè)備,游戲控制臺(tái),平板設(shè) 備,醫(yī)療設(shè)備,健身設(shè)備,個(gè)人數(shù)字助理等。
[0142] 參照?qǐng)D9,裝置2800可以包括以下一個(gè)或多個(gè)組件:處理組件2802,存儲(chǔ)器2804, 電源組件2806,多媒體組件2808,音頻組件2810,輸入/輸出(I/O)的接口 2812,傳感器組 件2814,以及通信組件2816。
[0143] 處理組件2802通??刂蒲b置2800的整體操作,諸如與顯示,電話呼叫,數(shù)據(jù)通信, 相機(jī)操作和記錄操作相關(guān)聯(lián)的操作。處理組件2802可以包括一個(gè)或多個(gè)處理器2820來執(zhí) 行指令,以完成上述的方法的全部或部分步驟。此外,處理組件2802可以包括一個(gè)或多個(gè) 模塊,便于處理組件2802和其他組件之間的交互。例如,處理組件2802可以包括多媒體模 塊,以方便多媒體組件2808和處理組件2802之間的交互。
[0144] 存儲(chǔ)器2804被配置為存儲(chǔ)各種類型的數(shù)據(jù)以支持在設(shè)備2800的操作。這些數(shù)據(jù) 的示例包括用于在裝置2800上操作的任何應(yīng)用程序或方法的指令,聯(lián)系人數(shù)據(jù),電話簿數(shù) 據(jù),消息,圖片,視頻等。存儲(chǔ)器2804可以由任何類型的易失性或非易失性存儲(chǔ)設(shè)備或者它 們的組合實(shí)現(xiàn),如靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM),電可擦除可編程只讀存儲(chǔ)器(EEPR0M),可 擦除可編程只讀存儲(chǔ)器(EPROM),可編程只讀存儲(chǔ)器(PR0M),只讀存儲(chǔ)器(R0M),磁存儲(chǔ)器, 快閃存儲(chǔ)器,磁盤或光盤。
[0145] 電源組件2806為裝置2800的各種組件提供電力。電源組件2806可以包括電源 管理系統(tǒng),一個(gè)或多個(gè)電源,及其他與為裝置2800生成、管理和分配電力相關(guān)聯(lián)的組件。
[0146] 多媒體組件2808包括在所述裝置2800和用戶之間的提供一個(gè)輸出接口的屏幕。 在一些實(shí)施例中,屏幕可以包括液晶顯示器(LCD)和觸摸面板(TP)。如果屏幕包括觸摸面 板,屏幕可以被實(shí)現(xiàn)為觸摸屏,以接收來自用戶的輸入信號(hào)。觸摸面板包括一個(gè)或多個(gè)觸摸 傳感器以感測(cè)觸摸、滑動(dòng)和觸摸面板上的手勢(shì)。所述觸摸傳感器可以不僅感測(cè)觸摸或滑動(dòng) 動(dòng)作的邊界,而且還檢測(cè)與所述觸摸或滑動(dòng)操作相關(guān)的持續(xù)時(shí)間和壓力。在一些實(shí)施例中, 多媒體組件2808包括一個(gè)前置攝像頭和/或后置攝像頭。當(dāng)裝置2800處于操作模式,如 拍攝模式或視頻模式時(shí),前置攝像頭和/或后置攝像頭可以接收外部的多媒體數(shù)據(jù)。每個(gè) 前置攝像頭和后置攝像頭可以是一個(gè)固定的光學(xué)透鏡系統(tǒng)或具有焦距和光學(xué)變焦能力。
[0147] 音頻組件2810被配置為輸出和/或輸入音頻信號(hào)。例如,音頻組件2810包括一 個(gè)麥克風(fēng)(MIC),當(dāng)裝置2800處于操作模式,如呼叫模式、記錄模式和語音識(shí)別模式時(shí),麥 克風(fēng)被配置為接收外部音頻信號(hào)。所接收的音頻信號(hào)可以被進(jìn)一步存儲(chǔ)在存儲(chǔ)器2804或 經(jīng)由通信組件2816發(fā)送。在一些實(shí)施例中,音頻組件2810還包括一個(gè)揚(yáng)聲器,用于輸出音 頻信號(hào)。
[0148] I/O接口 2812為處理組件2802和外圍接口模塊之間提供接口,上述外圍接口模塊 可以是鍵盤,點(diǎn)擊輪,按鈕等。這些按鈕可包括但不限于:主頁按鈕、音量按鈕、啟動(dòng)按鈕和 鎖定按鈕。
[0149] 傳感器組件2814包括一個(gè)或多個(gè)傳感器,用于為裝置2800提供各個(gè)方面的狀態(tài) 評(píng)估。例如,傳感器組件2814可以檢測(cè)到設(shè)備2800的打開/關(guān)閉狀態(tài),組件的相對(duì)定位, 例如所述組件為裝置2800的顯示器和小鍵盤,傳感器組件2814還可以檢測(cè)裝置2800或裝 置2800 -個(gè)組件的位置改變,用戶與裝置2800接觸的存在或不存在,裝置2800方位或加 速/減速和裝置2800的溫度變化。傳感器組件2814可以包括接近傳感器,被配置用來在 沒有任何的物理接觸時(shí)檢測(cè)附近物體的存在。傳感器組件2814還可以包括光傳感器,如 CMOS或C⑶圖像傳感器,用于在成像應(yīng)用中使用。在一些實(shí)施例中,該傳感器組件2814還 可以包括加速度傳感器,陀螺儀傳感器,磁傳感器,壓力傳感器或溫度傳感器。
[0150] 通信組件2816被配置為便于裝置2800和其他設(shè)備之間有線或無線方式的通信。 裝置2800可以接入基于通信標(biāo)準(zhǔn)的無線網(wǎng)絡(luò),如WiFi,2G或3G,或它們的組合。在一個(gè)示 例性實(shí)施例中,通信組件2816經(jīng)由廣播信道接收來自外部廣播管理系統(tǒng)的廣播信號(hào)或廣 播相關(guān)信息。在一個(gè)示例性實(shí)施例中,所述通信組件2816還包括近場(chǎng)通信(NFC)模塊,以促 進(jìn)短程通信。例如,在NFC模塊可基于射頻識(shí)別(RFID)技術(shù),紅外數(shù)據(jù)協(xié)會(huì)(IrDA)技術(shù), 超寬帶(UWB)技術(shù),藍(lán)牙(BT)技術(shù)和其他技術(shù)來實(shí)現(xiàn)。
[0151] 在示例性實(shí)施例中,裝置2800可以被一個(gè)或多個(gè)應(yīng)用專用集成電路(ASIC)、數(shù)字 信號(hào)處理器(DSP)、數(shù)字信號(hào)處理設(shè)備(DSPD)、可編程邏輯器件(PLD)、現(xiàn)場(chǎng)可編程門陣列 (FPGA)、控制器、微控制器、微處理器或其他電子元件實(shí)現(xiàn),用于執(zhí)行上述方法。
[0152] 在示例性實(shí)施例中,還提供了一種包括指令的非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),例 如包括指令的存儲(chǔ)器2804,上述指令可由裝置2800的處理器2820執(zhí)行以完成上述方法。例 如,所述非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是ROM、隨機(jī)存取存儲(chǔ)器(RAM)、CD-ROM、磁帶、 軟盤和光數(shù)據(jù)存儲(chǔ)設(shè)備等。
[0153] 本領(lǐng)域技術(shù)人員在考慮說明書及實(shí)踐這里公開的發(fā)明后,將容易想到本發(fā)明的其 它實(shí)施方案。本申請(qǐng)旨在涵蓋本發(fā)明的任何變型、用途或者適應(yīng)性變化,這些變型、用途或 者適應(yīng)性變化遵循本發(fā)明的一般性原理并包括本公開未公開的本【技術(shù)領(lǐng)域】中的公知常識(shí) 或慣用技術(shù)手段。說明書和實(shí)施例僅被視為示例性的,本發(fā)明的真正范圍和精神由下面的 權(quán)利要求指出。
[0154] 應(yīng)當(dāng)理解的是,本發(fā)明并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并 且可以在不脫離其范圍進(jìn)行各種修改和改變。本發(fā)明的范圍僅由所附的權(quán)利要求來限制。
【權(quán)利要求】
1. 一種更新應(yīng)用程序的方法,其特征在于,所述方法包括: 獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表; 創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表; 獲取終端設(shè)備處理器的核數(shù); 根據(jù)所述核數(shù)在第一語言環(huán)境下同時(shí)開啟多個(gè)更新線程; 在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)所述第 一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所述第一列表移至所述 第二列表; 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述更新完成的應(yīng)用程序 從所述第二列表中移除。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第一語言為Java,所述第二語言為C/ C++,所述預(yù)設(shè)的接口為Java本地接口 JNI。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,所述通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí) 現(xiàn)的更新函數(shù),包括: 在負(fù)責(zé)應(yīng)用程序更新的Java類中加載指定C文件編譯后生成的類庫,其中所述C文件 中含有所述使用C/C++實(shí)現(xiàn)的更新函數(shù)且所述C文件中引入了 JNI. h頭文件,所述Java類 中聲明了所述更新函數(shù); 在所述Java類的所述更新線程中,直接調(diào)用所述更新函數(shù)。
4. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述多個(gè)更新線程的個(gè)數(shù)為: 如果M> = N,則a = N ;如果M〈N,則a = Μ ; 其中,a為所述多個(gè)更新線程的個(gè)數(shù),Μ為所述第一列表中應(yīng)用程序的個(gè)數(shù),Ν為所述處 理器的核數(shù)。
5. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,判斷所述第一列表中是否還 有應(yīng)用程序; 如果所述第一列表中沒有應(yīng)用程序,則結(jié)束當(dāng)前的更新線程; 如果所述第一列表中仍有應(yīng)用程序,則繼續(xù)在所述第一列表中選取一個(gè)應(yīng)用程序通過 當(dāng)前的更新線程進(jìn)行更新。
6. -種更新應(yīng)用程序的裝置,其特征在于,所述裝置包括: 列表操作模塊,用于獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表;倉il建第 二列表,所述第二列表為正在更新的應(yīng)用程序的列表;將正在被更新的應(yīng)用程序從所述第 一列表移至所述第二列表;以及,在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后, 將所述更新完成的應(yīng)用程序從所述第二列表中移除; 線程控制模塊,用于獲取終端設(shè)備處理器的核數(shù);根據(jù)所述核數(shù)在第一語言環(huán)境下同 時(shí)開啟多個(gè)更新線程; 更新執(zhí)行模塊,用于在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的 更新函數(shù)以對(duì)所述第一列表中的一個(gè)應(yīng)用程序進(jìn)行更新。
7. 根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述第一語言為Java,所述第二語言為C/ C++,所述預(yù)設(shè)的接口為Java本地接口 JNI。
8. 根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述更新執(zhí)行模塊包括: 調(diào)用準(zhǔn)備子模塊,用于在負(fù)責(zé)應(yīng)用程序更新的Java類中加載指定C文件編譯后生成的 類庫,其中所述C文件中含有所述使用C/C++實(shí)現(xiàn)的更新函數(shù)且所述C文件中引入了 JNI. h頭文件,所述Java類中聲明了所述更新函數(shù); 調(diào)用執(zhí)行子模塊,用于在所述Java類的所述更新線程中,直接調(diào)用所述更新函數(shù)。
9. 根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述線程控制模塊還用于: 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,判斷所述第一列表中是否還 有應(yīng)用程序;如果所述第一列表中沒有應(yīng)用程序,則結(jié)束當(dāng)前的更新線程;如果所述第一 列表中仍有應(yīng)用程序,則繼續(xù)在所述第一列表中選取一個(gè)應(yīng)用程序通過當(dāng)前的更新線程進(jìn) 行更新。
10. -種更新應(yīng)用程序的裝置,其特征在于,包括: 處理器; 用于存儲(chǔ)處理器可執(zhí)行指令的存儲(chǔ)器; 其中,所述處理器被配置為: 獲取第一列表,所述第一列表為待更新的應(yīng)用程序的列表; 創(chuàng)建第二列表,所述第二列表為正在更新的應(yīng)用程序的列表; 獲取終端設(shè)備處理器的核數(shù); 根據(jù)所述核數(shù)在第一語言環(huán)境下同時(shí)開啟多個(gè)更新線程; 在每個(gè)所述更新線程中,通過預(yù)設(shè)的接口調(diào)用由第二語言實(shí)現(xiàn)的更新函數(shù)以對(duì)所述第 一列表中的一個(gè)應(yīng)用程序進(jìn)行更新,并將所述被更新的應(yīng)用程序從所述第一列表移至所述 第二列表; 在收到一個(gè)更新線程對(duì)一個(gè)應(yīng)用程序更新完成的響應(yīng)后,將所述更新完成的應(yīng)用程序 從所述第二列表中移除。
【文檔編號(hào)】G06F9/445GK104281478SQ201410589917
【公開日】2015年1月14日 申請(qǐng)日期:2014年10月28日 優(yōu)先權(quán)日:2014年10月28日
【發(fā)明者】續(xù)麗娜, 李明浩, 劉洪杰 申請(qǐng)人:小米科技有限責(zé)任公司