diff --git a/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml b/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml
index 836c7f7f8be..7096a7d4e76 100644
--- a/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml
+++ b/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml
@@ -36,6 +36,30 @@
             android:name="libcdsprpc.so"
             android:required="false" />
 
+        
+
+        
+
+        
+
+        
+
+        
+
+        
+
          {
+          setupBackendSelectorDialog();
+        });
     modelImageButton.setOnClickListener(
         view -> {
           setupModelSelectorDialog();
@@ -104,6 +113,12 @@ private void setupSettings() {
     if (mModelType != null) {
       mModelTypeTextView.setText(mModelType.toString());
     }
+    mBackendType = mSettingsFields.getBackendType();
+    ETLogging.getInstance().log("mBackendType from settings " + mBackendType);
+    if (mBackendType != null) {
+      mBackendTextView.setText(mBackendType.toString());
+      setBackendSettingMode();
+    }
 
     setupParameterSettings();
     setupPromptSettings();
@@ -285,6 +300,29 @@ private void showInvalidPromptDialog() {
         .show();
   }
 
+  private void setupBackendSelectorDialog() {
+    // Convert enum to list
+    List backendTypesList = new ArrayList<>();
+    for (BackendType backendType : BackendType.values()) {
+      backendTypesList.add(backendType.toString());
+    }
+    // Alert dialog builder takes in arr of string instead of list
+    String[] backendTypes = backendTypesList.toArray(new String[0]);
+    AlertDialog.Builder backendTypeBuilder = new AlertDialog.Builder(this);
+    backendTypeBuilder.setTitle("Select backend type");
+    backendTypeBuilder.setSingleChoiceItems(
+        backendTypes,
+        -1,
+        (dialog, item) -> {
+          mBackendTextView.setText(backendTypes[item]);
+          mBackendType = BackendType.valueOf(backendTypes[item]);
+          setBackendSettingMode();
+          dialog.dismiss();
+        });
+
+    backendTypeBuilder.create().show();
+  }
+
   private void setupModelSelectorDialog() {
     String[] pteFiles = listLocalFile("/data/local/tmp/llama/", ".pte");
     AlertDialog.Builder modelPathBuilder = new AlertDialog.Builder(this);
@@ -370,6 +408,32 @@ private String getFilenameFromPath(String uriFilePath) {
     return "";
   }
 
+  private void setBackendSettingMode() {
+    if (mBackendType.equals(BackendType.XNNPACK) || mBackendType.equals(BackendType.QUALCOMM)) {
+      setXNNPACKSettingMode();
+    } else if (mBackendType.equals(BackendType.MEDIATEK)) {
+      setMediaTekSettingMode();
+    }
+  }
+
+  private void setXNNPACKSettingMode() {
+    requireViewById(R.id.modelLayout).setVisibility(View.VISIBLE);
+    requireViewById(R.id.tokenizerLayout).setVisibility(View.VISIBLE);
+    requireViewById(R.id.parametersView).setVisibility(View.VISIBLE);
+    requireViewById(R.id.temperatureLayout).setVisibility(View.VISIBLE);
+    mModelFilePath = "";
+    mTokenizerFilePath = "";
+  }
+
+  private void setMediaTekSettingMode() {
+    requireViewById(R.id.modelLayout).setVisibility(View.GONE);
+    requireViewById(R.id.tokenizerLayout).setVisibility(View.GONE);
+    requireViewById(R.id.parametersView).setVisibility(View.GONE);
+    requireViewById(R.id.temperatureLayout).setVisibility(View.GONE);
+    mModelFilePath = "/in/mtk/llama/runner";
+    mTokenizerFilePath = "/in/mtk/llama/runner";
+  }
+
   private void loadSettings() {
     Gson gson = new Gson();
     String settingsFieldsJSON = mDemoSharedPreferences.getSettings();
@@ -384,6 +448,7 @@ private void saveSettings() {
     mSettingsFields.saveParameters(mSetTemperature);
     mSettingsFields.savePrompts(mSystemPrompt, mUserPrompt);
     mSettingsFields.saveModelType(mModelType);
+    mSettingsFields.saveBackendType(mBackendType);
     mDemoSharedPreferences.addSettings(mSettingsFields);
   }
 
diff --git a/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java b/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java
index b71799981b2..3adadf574da 100644
--- a/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java
+++ b/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java
@@ -30,6 +30,10 @@ public ModelType getModelType() {
     return modelType;
   }
 
+  public BackendType getBackendType() {
+    return backendType;
+  }
+
   public String getUserPrompt() {
     return userPrompt;
   }
@@ -63,9 +67,11 @@ public boolean getIsLoadModel() {
   private boolean isClearChatHistory;
   private boolean isLoadModel;
   private ModelType modelType;
+  private BackendType backendType;
 
   public SettingsFields() {
     ModelType DEFAULT_MODEL = ModelType.LLAMA_3;
+    BackendType DEFAULT_BACKEND = BackendType.XNNPACK;
 
     modelFilePath = "";
     tokenizerFilePath = "";
@@ -75,6 +81,7 @@ public SettingsFields() {
     isClearChatHistory = false;
     isLoadModel = false;
     modelType = DEFAULT_MODEL;
+    backendType = DEFAULT_BACKEND;
   }
 
   public SettingsFields(SettingsFields settingsFields) {
@@ -86,6 +93,7 @@ public SettingsFields(SettingsFields settingsFields) {
     this.isClearChatHistory = settingsFields.getIsClearChatHistory();
     this.isLoadModel = settingsFields.getIsLoadModel();
     this.modelType = settingsFields.modelType;
+    this.backendType = settingsFields.backendType;
   }
 
   public void saveModelPath(String modelFilePath) {
@@ -100,6 +108,10 @@ public void saveModelType(ModelType modelType) {
     this.modelType = modelType;
   }
 
+  public void saveBackendType(BackendType backendType) {
+    this.backendType = backendType;
+  }
+
   public void saveParameters(Double temperature) {
     this.temperature = temperature;
   }
@@ -126,6 +138,7 @@ public boolean equals(SettingsFields anotherSettingsFields) {
         && userPrompt.equals(anotherSettingsFields.userPrompt)
         && isClearChatHistory == anotherSettingsFields.isClearChatHistory
         && isLoadModel == anotherSettingsFields.isLoadModel
-        && modelType == anotherSettingsFields.modelType;
+        && modelType == anotherSettingsFields.modelType
+        && backendType == anotherSettingsFields.backendType;
   }
 }
diff --git a/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml b/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml
index 7d5c3b1b6df..0ec551ae364 100644
--- a/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml
+++ b/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml
@@ -28,11 +28,51 @@
             android:translationY="5dp" />
 
         
 
+            
+
+            
+
+            
+
+        
+
+        
+