中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

新疆電子商務(wù)平臺(tái)網(wǎng)站開(kāi)發(fā)百度掃一掃識(shí)別圖片在線

新疆電子商務(wù)平臺(tái)網(wǎng)站開(kāi)發(fā),百度掃一掃識(shí)別圖片在線,app定制圖片,山東網(wǎng)絡(luò)科技有限公司1 原理說(shuō)明 這個(gè)方案有如下基本需求: 構(gòu)建自定義CPUSET,/dev/cpuset中包含一個(gè)全新的cpuset分組。且可以通過(guò)set_cpuset_policy和set_sched_policy接口可以設(shè)置自定義CPUSET。開(kāi)機(jī)啟動(dòng)后可以通過(guò)zygote判定來(lái)對(duì)特定的應(yīng)用進(jìn)程設(shè)置CPUSET,并…

1 原理說(shuō)明

這個(gè)方案有如下基本需求:

  • 構(gòu)建自定義CPUSET,/dev/cpuset中包含一個(gè)全新的cpuset分組。且可以通過(guò)set_cpuset_policy和set_sched_policy接口可以設(shè)置自定義CPUSET。
  • 開(kāi)機(jī)啟動(dòng)后可以通過(guò)zygote判定來(lái)對(duì)特定的應(yīng)用進(jìn)程設(shè)置CPUSET,并一直保持,且保證自定義CPUSET不受其他CPUSET影響,持續(xù)獨(dú)立。

原理上因?yàn)樾薷拇a涉及部分較多,因此共分3個(gè)部分:

  1. framework修改:添加SCHED GROUP和THREAD GROUP(THREAD_GROUP_對(duì)應(yīng)SP_)的支持,且支持開(kāi)機(jī)啟動(dòng)后直接設(shè)置。applyOomAdjLSP的判定保持不變。
  2. system修改:添加SP_CUSTOM的支持及set_cpuset_policy和set_sched_policy接口等支持,同時(shí)修改task_profiles.json,添加SP_CUSTOM CPUSET的支持。
  3. init.rc修改及編譯部分調(diào)整:對(duì)自定義cpuset節(jié)點(diǎn)進(jìn)行操作,vndk部分編譯需要重新調(diào)整方案以及不修改VNDK如何保證編譯通過(guò)。

由于修改中涉及代碼量過(guò)大,這里拆分成兩節(jié)進(jìn)行展示。本章節(jié)主要針對(duì)第2部分和第3部分修改進(jìn)行說(shuō)明。上一篇文章👇

Android Framework 常見(jiàn)解決方案(25-1)定制CPUSET解決方案-framework部分修改

主要對(duì)第1部分修改進(jìn)行說(shuō)明。

2 修改方案(Android S)

2.1 system部分修改

針對(duì)system分區(qū)修改。具體修改方案如下(這里以S版本修改為主,Q和R有一些差異但原理不變)

在$AOSP/system/core/libprocessgroup/include/processgroup/sched_policy.h文件中修改:

/* Keep in sync with THREAD_GROUP_* in frameworks/base/core/java/android/os/Process.java */
typedef enum {SP_DEFAULT = -1,SP_BACKGROUND = 0,SP_FOREGROUND = 1,SP_SYSTEM = 2,SP_AUDIO_APP = 3,SP_AUDIO_SYS = 4,SP_TOP_APP = 5,SP_RT_APP = 6,SP_RESTRICTED = 7,
+    SP_CUSTOM = 8,SP_CNT,SP_MAX = SP_CNT - 1,SP_SYSTEM_DEFAULT = SP_FOREGROUND,
} SchedPolicy;

這里注意,按照順序填寫(xiě)修改相對(duì)簡(jiǎn)單,因?yàn)楹罄m(xù)會(huì)用到SP_CNT和SP_MAX這兩個(gè)變量,代碼中還會(huì)有許多的遍歷操作,因此最好采用累加方案,不要設(shè)置其他值。

本方案的修改比較全面,即支持set_cpuset_policy,也兼容到set_sched_policy,在實(shí)際操作中,可根據(jù)需要只修改其中一個(gè)即可。

在$AOSP/system/core/libprocessgroup/sched_policy.cpp文件中修改:

//修改set_cpuset_policy,添加SP_CUSTOM的處理
int set_cpuset_policy(int tid, SchedPolicy policy) {if (tid == 0) {tid = GetThreadId();}policy = _policy(policy);switch (policy) {case SP_BACKGROUND:return SetTaskProfiles(tid, {"CPUSET_SP_BACKGROUND", "BlkIOBackground"}, true) ? 0 : -1;case SP_FOREGROUND:return SetTaskProfiles(tid, {"CPUSET_SP_FOREGROUND", "BlkIOForeground"}, true) ? 0 : -1;case SP_AUDIO_APP:case SP_AUDIO_SYS:return SetTaskProfiles(tid, {"CPUSET_SP_FOREGROUND", "AudioAppCapacity", "BlkIOForeground"}, true) ? 0 : -1;case SP_TOP_APP:return SetTaskProfiles(tid, {"CPUSET_SP_TOP_APP", "BlkIOBackground"}, true) ? 0 : -1;case SP_SYSTEM:return SetTaskProfiles(tid, {"CPUSET_SP_SYSTEM", "BlkIOForeground"}, true) ? 0 : -1;case SP_RESTRICTED:return SetTaskProfiles(tid, {"CPUSET_SP_RESTRICTED"}, true) ? 0 : -1;
+        case SP_CUSTOM:
+            return SetTaskProfiles(tid, {"CPUSET_SP_CUSTOM"}, true) ? 0 : -1;default:break;}return 0;
}//修改set_sched_policy,添加SP_CUSTOM的處理
int set_sched_policy(int tid, SchedPolicy policy) {
//...
#if POLICY_DEBUG //注意:這一段的修改主要是調(diào)試使用,功能實(shí)現(xiàn)上可以不添加該部分
//...switch (policy) {case SP_BACKGROUND:SLOGD("vvv tid %d (%s)", tid, thread_name);break;case SP_FOREGROUND:case SP_AUDIO_APP:case SP_AUDIO_SYS:case SP_TOP_APP:SLOGD("^^^ tid %d policy %d (%s)", tid, policy, thread_name);break;case SP_SYSTEM:SLOGD("/// tid %d (%s)", tid, thread_name);break;case SP_RT_APP:SLOGD("RT  tid %d (%s)", tid, thread_name);break;
+        case SP_CUSTOM:
+            SLOGD("CUSTOM|xxx tid %d (%s)", tid, thread_name);
+            break;default:SLOGD("??? tid %d (%s)", tid, thread_name);break;}
#endif
//...switch (policy) {case SP_BACKGROUND:return SetTaskProfiles(tid, {"SCHED_SP_BACKGROUND", "BlkIOBackground"}, true) ? 0 : -1;case SP_FOREGROUND:case SP_AUDIO_APP:case SP_AUDIO_SYS:return SetTaskProfiles(tid, {"SCHED_SP_FOREGROUND", "BlkIOForeground"}, true) ? 0 : -1;case SP_TOP_APP:return SetTaskProfiles(tid, {"SCHED_SP_TOP_APP", "BlkIOForeground"}, true) ? 0 : -1;case SP_SYSTEM:return SetTaskProfiles(tid, {"SCHED_SP_SYSTEM"}, true) ? 0 : -1;case SP_RT_APP:return SetTaskProfiles(tid, {"SCHED_SP_RT_APP", "BlkIOForeground"}, true) ? 0 : -1;
+        case SP_CUSTOM:
+            return SetTaskProfiles(tid, {"SCHED_SP_CUSTOM"}, true) ? 0 : -1;default:return SetTaskProfiles(tid, {"SCHED_SP_DEFAULT"}, true) ? 0 : -1;}return 0;}
//修改get_sched_policy_from_group,添加SP_CUSTOM的處理
static int get_sched_policy_from_group(const std::string& group, SchedPolicy* policy) {if (group.empty()) {*policy = SP_FOREGROUND;} else if (group == "foreground") {*policy = SP_FOREGROUND;} else if (group == "system-background") {*policy = SP_SYSTEM;} else if (group == "background") {*policy = SP_BACKGROUND;} else if (group == "top-app") {*policy = SP_TOP_APP;} else if (group == "restricted") {*policy = SP_RESTRICTED;} else if (group == "audio-app") {*policy = SP_AUDIO_APP;
+    } else if (group == "custom") {
+        *policy = SP_CUSTOM;} else {errno = ERANGE;return -1;}return 0;
}//修改get_sched_policy_name,添加SP_CUSTOM的處理
const char* get_sched_policy_name(SchedPolicy policy) {policy = _policy(policy);static const char* const kSchedPolicyNames[] = {[SP_BACKGROUND] = "bg", [SP_FOREGROUND] = "fg", [SP_SYSTEM] = "  ",[SP_AUDIO_APP] = "aa",  [SP_AUDIO_SYS] = "as",  [SP_TOP_APP] = "ta",
-            [SP_RT_APP] = "rt",     [SP_RESTRICTED] = "rs",
+            [SP_RT_APP] = "rt",     [SP_RESTRICTED] = "rs",[SP_CUSTOM] = "ct",};static_assert(arraysize(kSchedPolicyNames) == SP_CNT, "missing name");if (policy < SP_BACKGROUND || policy >= SP_CNT) {return nullptr;}return kSchedPolicyNames[policy];
}//修改get_cpuset_policy_profile_name,添加SP_CUSTOM的處理
const char* get_cpuset_policy_profile_name(SchedPolicy policy) {/**  cpuset profile array for:*  SP_DEFAULT(-1), SP_BACKGROUND(0), SP_FOREGROUND(1),*  SP_SYSTEM(2), SP_AUDIO_APP(3), SP_AUDIO_SYS(4),
-     *  SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7),
+     *  SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7), SP_CUSTOM(8)*  index is policy + 1*  this need keep in sync with SchedPolicy enum*/static constexpr const char* kCpusetProfiles[SP_CNT + 1] = {"CPUSET_SP_DEFAULT", "CPUSET_SP_BACKGROUND", "CPUSET_SP_FOREGROUND","CPUSET_SP_SYSTEM",  "CPUSET_SP_FOREGROUND", "CPUSET_SP_FOREGROUND",
-            "CPUSET_SP_TOP_APP", "CPUSET_SP_DEFAULT",    "CPUSET_SP_RESTRICTED"
+            "CPUSET_SP_TOP_APP", "CPUSET_SP_DEFAULT",    "CPUSET_SP_RESTRICTED","CPUSET_SP_CUSTOM"};if (policy < SP_DEFAULT || policy >= SP_CNT) {return nullptr;}return kCpusetProfiles[policy + 1];
}//修改get_sched_policy_profile_name,添加SP_CUSTOM的處理
const char* get_sched_policy_profile_name(SchedPolicy policy) {/**  sched profile array for:*  SP_DEFAULT(-1), SP_BACKGROUND(0), SP_FOREGROUND(1),*  SP_SYSTEM(2), SP_AUDIO_APP(3), SP_AUDIO_SYS(4),
-     *  SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7),
+     *  SP_TOP_APP(5), SP_RT_APP(6), SP_RESTRICTED(7),SP_CUSTOM(8)*  index is policy + 1*  this need keep in sync with SchedPolicy enum*/static constexpr const char* kSchedProfiles[SP_CNT + 1] = {"SCHED_SP_DEFAULT", "SCHED_SP_BACKGROUND", "SCHED_SP_FOREGROUND","SCHED_SP_SYSTEM",  "SCHED_SP_FOREGROUND", "SCHED_SP_FOREGROUND",
-            "SCHED_SP_TOP_APP", "SCHED_SP_RT_APP",     "SCHED_SP_DEFAULT"
+            "SCHED_SP_TOP_APP", "SCHED_SP_RT_APP",     "SCHED_SP_DEFAULT","SCHED_SP_CUSTOM"};if (policy < SP_DEFAULT || policy >= SP_CNT) {return nullptr;}return kSchedProfiles[policy + 1];
}

以上2部分主要是邏輯的修改,接下來(lái)是配置文件的修改,在$AOSP/system/core/libprocessgroup/profiles/task_profiles.json文件中修改:

{"Attributes": [{"Name": "LowCapacityCPUs","Controller": "cpuset","File": "background/cpus"},...
+    {
+      "Name": "CustomCPUs",
+      "Controller": "cpuset",
+      "File": "custom/cpus"
+    },...{"Name": "FreezerState","Controller": "freezer","File": "cgroup.freeze"}],"Profiles": [{"Name": "HighEnergySaving","Actions": [{"Name": "JoinCgroup","Params":{"Controller": "cpu","Path": "background"}}]},...
+    {
+      "Name": "CustomPerformance",
+      "Actions" : [
+        {
+          "Name" : "JoinCgroup",
+          "Params" :
+          {
+            "Controller": "cpuset",
+            "Path": "custom"
+          }
+        }
+      ]
+    },...{"Name": "SystemMemoryProcess","Actions": [{"Name": "JoinCgroup","Params":{"Controller": "memory","Path": "system"}}]}],"AggregateProfiles": [{"Name": "SCHED_SP_DEFAULT","Profiles": [ "TimerSlackNormal" ]},...{"Name": "SCHED_SP_RT_APP","Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]},
+    {
+      "Name": "SCHED_SP_CUSTOM",
+      "Profiles": [ "CUSTOMPerformance" ]
+    },...
+    {
+      "Name": "CPUSET_SP_CUSTOM",
+      "Profiles": [ "CUSTOMPerformance" ]
+    },...{"Name": "Dex2OatBootComplete","Profiles": [ "Dex2oatPerformance", "LowIoPriority", "TimerSlackHigh" ]}]
}

至此,system相關(guān)修改就結(jié)束了。主要是SP_CUSTOM相關(guān)邏輯的添加,配置文件task_profiles.json的修改,接口set_cpuset_policy和set_sched_policy的支持等。

2.2 init.rc及編譯部分調(diào)整

?為添加cpuset相關(guān)節(jié)點(diǎn),需要修改init.rc文件,這里根據(jù)android源碼的需要調(diào)整到對(duì)應(yīng)的rc中添加即可。具體init.rc修改內(nèi)容如下:

#第一部分:on init中添加:
...
+#custom add start
+    mkdir /dev/stune/custom
+    chown system system /dev/stune/custom
+    chown system system /dev/stune/custom/tasks
+    chmod 0664 /dev/stune/custom/tasks
+    mkdir /dev/cpuset/custom
+    copy /dev/cpuset/cpus /dev/cpuset/custom/cpus
+    copy /dev/cpuset/mems /dev/cpuset/custom/mems
+    chown system system /dev/cpuset/custom
+    chown system system /dev/cpuset/custom/tasks
+    chown system system /dev/cpuset/custom/cgroup.procs
+    chmod 0664 /dev/cpuset/custom/tasks
+    chmod 0664 /dev/cpuset/custom/cgroup.procs
+#custom add end
...
#第二部分:系統(tǒng)啟動(dòng)完成后添加, 這里綁定的是456,可根據(jù)需要調(diào)整:
+#custom add start
+on property:sys.boot_completed=1
+   write /dev/cpuset/custom/cpus 4-6
+   write /dev/cpuset/custom/mems 0
+#custom add end

這里主要是通過(guò)init.rc文件添加cpuset相關(guān)節(jié)點(diǎn),以及修改cpuset相關(guān)節(jié)點(diǎn)的權(quán)限和owner,以及寫(xiě)入值操作。這樣,在開(kāi)機(jī)啟動(dòng)后就可以在/dev/cpuset/目錄下看到自定義cpuset對(duì)應(yīng)的custom節(jié)點(diǎn)。

至此代碼和配置文件都已經(jīng)修改完了。

接下來(lái)就需要編譯了,但是編譯這里要避免vndk報(bào)錯(cuò)的問(wèn)題,需要有先執(zhí)行如下腳本內(nèi)容:

source build/envsetup.sh && lunch xxx
cd ./development/vndk/tools/header-checker/utils/
#這里的xxx一般是指out/target/product之后的路徑
./create_reference_dumps.py -l libprocessgroup -product xxx

重新編譯vndk,否則會(huì)出現(xiàn)如下類(lèi)似的編譯錯(cuò)誤,如下所示:

error: VNDK library: XXX
******************************************************
error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l libprocessgroup
ninja failed with: exit status 1
#### failed to build some targets ####

http://www.risenshineclean.com/news/50809.html

相關(guān)文章:

  • 做網(wǎng)站需要招什么職位建個(gè)網(wǎng)站需要多少錢(qián)
  • 肇慶網(wǎng)站seo河北百度代理公司
  • 永年網(wǎng)站建設(shè)競(jìng)價(jià)推廣開(kāi)戶
  • wordpress為什么在自定義結(jié)構(gòu)的時(shí)候總是出現(xiàn)斜杠呢sem 優(yōu)化價(jià)格
  • 成都網(wǎng)站制作成都網(wǎng)站制作項(xiàng)目外包平臺(tái)
  • 招標(biāo)網(wǎng)站的服務(wù)費(fèi)怎么做分錄免費(fèi)網(wǎng)站統(tǒng)計(jì)工具
  • 網(wǎng)站推廣的方法百度seo營(yíng)銷(xiāo)推廣
  • php網(wǎng)站開(kāi)發(fā)零基礎(chǔ)教程seo自學(xué)
  • wordpress管理員怎么進(jìn)入后臺(tái)開(kāi)源seo軟件
  • 廣州知名網(wǎng)站建設(shè)哪家好市場(chǎng)調(diào)研的方法
  • 養(yǎng)老網(wǎng)站建設(shè)方案上海企業(yè)seo
  • 浪網(wǎng)站制作電商網(wǎng)站建設(shè)定制
  • 四川城鄉(xiāng)和住房建設(shè)廳網(wǎng)站首頁(yè)競(jìng)價(jià)推廣論壇
  • 計(jì)算機(jī)程序設(shè)計(jì)網(wǎng)站開(kāi)發(fā)小程序怎么開(kāi)發(fā)
  • 溫嶺網(wǎng)站開(kāi)發(fā)友鏈交換有什么作用
  • 分析網(wǎng)站建設(shè)前期的seo準(zhǔn)備工作推廣app拿返傭的平臺(tái)
  • wordpress設(shè)置標(biāo)題大小嘉興新站seo外包
  • wordpress中文客服側(cè)邊欄qq上海優(yōu)化公司排行榜
  • 區(qū)塊鏈開(kāi)發(fā)與應(yīng)用seo網(wǎng)站排名查詢
  • 上傳文件的網(wǎng)站sem工具是什么
  • 網(wǎng)站樣板谷歌搜索引擎google
  • spring可以做多大的網(wǎng)站找個(gè)網(wǎng)站
  • 沈陽(yáng)網(wǎng)站開(kāi)發(fā)技術(shù)公司web前端培訓(xùn)費(fèi)用大概多少
  • 碑林網(wǎng)站制作什么是搜索引擎銷(xiāo)售
  • 東莞常平做網(wǎng)站百度指數(shù)如何分析數(shù)據(jù)
  • 廣西玉林建設(shè)廳官方網(wǎng)站代運(yùn)營(yíng)公司哪家好一些
  • 各大網(wǎng)站提交入口深圳網(wǎng)站建設(shè)開(kāi)發(fā)公司
  • 網(wǎng)站制作的評(píng)價(jià)指標(biāo)中手機(jī)網(wǎng)頁(yè)設(shè)計(jì)
  • 為公益組織做網(wǎng)站bing搜索引擎入口
  • 淘寶上做網(wǎng)站可靠嗎網(wǎng)站改版