[問(wèn)題一]已經(jīng)加載完成動(dòng)態(tài)特性后如何啟動(dòng)?
1、加載成功后返回
為FeatureInstallManager實(shí)例注冊(cè)監(jiān)聽器后,可以監(jiān)聽動(dòng)態(tài)加載的過(guò)程。開發(fā)者可以通過(guò)監(jiān)聽器回調(diào)方法中的InstallState實(shí)例的status()返回的狀態(tài),判斷動(dòng)態(tài)特性是否已經(jīng)安裝完成。例如:
if(state.status()==FeatureInstallSessionStatus.INSTALLED){
Log.i(TAG,"installed success,can use new feature");
}
2、查看動(dòng)態(tài)特性是否已經(jīng)安裝
調(diào)用getAllInstalledModules()方法,查看對(duì)應(yīng)的特性是否已經(jīng)安裝。
private void getInstalledFeature(){
Set<String>moduleNames=mFeatureInstallManager.
getAllInstalledModules();
Log.i(TAG,"get all installed modules:"+moduleNames);
}
3、啟動(dòng)動(dòng)態(tài)特性
此處以啟動(dòng)動(dòng)態(tài)特性中的FeatureActivity為例:
startActivity(new Intent(this,
Class.forName("com.huawei.android.demofeature.FeatureActivity")));
[問(wèn)題二]如何查看當(dāng)前動(dòng)態(tài)加載過(guò)程中的有效狀態(tài)?
為FeatureInstallManager實(shí)例注冊(cè)監(jiān)聽器后,可以監(jiān)聽動(dòng)態(tài)加載的過(guò)程。Dynamic Ability SDK預(yù)定義的狀態(tài)碼保存在FeatureInstallSessionStatus類中。開發(fā)者可以通過(guò)監(jiān)聽器獲取當(dāng)前動(dòng)態(tài)加載的狀態(tài),并做出相應(yīng)調(diào)整。
[問(wèn)題三]動(dòng)態(tài)加載過(guò)程中出現(xiàn)錯(cuò)誤,該怎么辦?
為FeatureInstallManager實(shí)例注冊(cè)監(jiān)聽器后,可以監(jiān)聽動(dòng)態(tài)加載的過(guò)程。當(dāng)監(jiān)聽到失敗時(shí),可以通過(guò)調(diào)用state.errorCode()方法獲取具體的錯(cuò)誤碼。開發(fā)者可以根據(jù)錯(cuò)誤碼判斷出當(dāng)前具體的錯(cuò)誤和原因,然后再做出相應(yīng)調(diào)整即可。具體錯(cuò)誤碼可參考FeatureInstallErrorCode。
[問(wèn)題四]App中完成動(dòng)態(tài)加載,但啟動(dòng)特性時(shí)提示ClassNotFoundException。
啟動(dòng)feature的某個(gè)組件時(shí),可能寫錯(cuò)了包名或類名,所以請(qǐng)檢查特性對(duì)應(yīng)的Activity完整名稱是否書寫正確。
此處以啟動(dòng)動(dòng)態(tài)特性模塊中的FeatureActivity為例:
startActivity(new Intent(this,Class.forName(“com.huawei.android.demofeature.FeatureActivity”)));
[問(wèn)題五]App中完成動(dòng)態(tài)加載,但啟動(dòng)特性時(shí)提示java.lang.RuntimeException:Unable to start activity ComponentInfo{xxxx}android.content.res.Resources$NotFoundException:Resource ID xxxx。
假如安裝完成后,你需要馬上啟動(dòng)新增動(dòng)態(tài)特性的一些Activity,需要重載方法attachBaseContext()。
以FeatureActivity為例。
public class FeatureActivity extends Activity{
Override
protected void attachBaseContext(Context newBase){
super.attachBaseContext(newBase);
try{
FeatureCompat.install(newBase);
}catch(Exception e){
Log.e(TAG,"attachBaseContext error:"+e.getMessage());
}
}
}
[問(wèn)題六]加載成功后啟動(dòng)特性,報(bào)“UnsatisfiedLinkError:dlopen failed:library name xxxxxx too long”錯(cuò)誤。
因?yàn)檩^低版本的Android系統(tǒng)對(duì)部分文件的路徑長(zhǎng)度做了限制,所以建議開發(fā)者設(shè)置“包名+版本號(hào)+feature名稱+so文件名稱”的總長(zhǎng)度不超過(guò)50個(gè)字符。
[問(wèn)題七]集成Dynamic Ability SDK開發(fā)應(yīng)用并發(fā)布到華為應(yīng)用市場(chǎng)后,只能安裝該應(yīng)用的全量APK包。
由于動(dòng)態(tài)加載SDK使用的是App Bundle技術(shù),僅支持Android 5.0及以上版本。所以,對(duì)于低于Android 5.0以下的版本,不支持動(dòng)態(tài)加載,只能安裝全量APK。
[問(wèn)題八]針對(duì)不同平臺(tái)(如手機(jī),大屏,帶屏音箱)上華為應(yīng)用市場(chǎng)包名不同的問(wèn)題,Dynamic Ability SDK是如何適配解決的?
通過(guò)應(yīng)用市場(chǎng)固定的service action,遍歷設(shè)備上的所有匹配應(yīng)用,取出其meta-data,如果meta-data中包含指紋和證書鏈信息并用根證書校驗(yàn)通過(guò),則認(rèn)為該應(yīng)用為當(dāng)前設(shè)備上的應(yīng)用市場(chǎng),返回其包名即可。如果在設(shè)備上同時(shí)裝多個(gè)應(yīng)用市場(chǎng)版本,則當(dāng)前策略是返回第一個(gè)找到的應(yīng)用市場(chǎng)包名。