Utvecklarguide för Microsoft Intune App SDK för Android
Med Microsoft Intune App SDK för Android kan du införliva Intune-appskyddsprinciper (även kallade APP- eller MAM-principer ) i din interna Java/Kotlin Android-app. Ett Intune-hanterat program är ett program som är integrerat med Intune App SDK. Intune-administratörer kan enkelt distribuera appskyddsprinciper till din Intune-hanterade app när Intune aktivt hanterar appen.
Viktigt
Intune släpper regelbundet uppdateringar av Intune App SDK. Vi rekommenderar att du prenumererar på Intune App SDK-lagringsplatserna för uppdateringar så att du kan införliva uppdateringen i programutvecklingscykeln och se till att dina appar stöder de senaste appskyddsprincipinställningarna.
Planera att ta obligatoriska Intune App SDK-uppdateringar före varje större operativsystemversion för att säkerställa att din app fortsätter att köras smidigt eftersom OS-uppdateringar kan orsaka icke-bakåtkompatibla ändringar. Om du inte uppdaterar till den senaste versionen före en större operativsystemversion kan du riskera att drabbas av en icke-bakåtkompatibel ändring och/eller att du inte kan tillämpa appskyddsprinciper på din app.
Processflöde
Följande diagram innehåller Processflöde för Intune App SDK för Android:
Etappmål
Guiden innehåller mer information om Intune App SDK:s arkitektur, information om ovanliga integreringssteg och annat användbart innehåll.
SDK:et i detalj
Klass- och metodbyten
Med hjälp av byggverktygen försöker Intune App SDK minimera integreringsbördan för Android-utvecklare. Före byggverktyget behövde utvecklarna utföra alla ersättningar manuellt.
Obs!
Appar måste nu integreras med SDK-kompileringsverktyget, som utför alla dessa ersättningar automatiskt.
Android-basklasser ersätts med sina respektive MAM-motsvarigheter för att aktivera Intune-hantering.
SDK-klasserna finns mellan Android-basklassen och appens egen härledda version av den klassen.
En appaktivitet kan till exempel få en arvshierarki som ser ut så här: AppSpecificActivity
utökar MAMActivity
Activity
.
MAM-lagret filtrerar anrop till systemåtgärder för att sömlöst ge din app en hanterad vy över världen.
Förutom basklasser kan vissa klasser som appen kan använda utan att härledas från (t.ex. MediaPlayer
) också ha nödvändiga MAM-motsvarigheter, och vissa metodanrop måste också ersättas.
I tabellen nedan visas många mam-ersättningar.
Android-basklass | Intune App SDK-ersättning |
---|---|
android.app.Activity | MAMActivity |
android.app.ActivityGroup | MAMActivityGroup |
android.app.AliasActivity | MAMAliasActivity |
android.app.Application | MAMApplication |
android.app.Dialog | MAMDialog |
android.app.AlertDialog.Builder | MAMAlertDialogBuilder |
android.app.DialogFragment | MAMDialogFragment |
android.app.ExpandableListActivity | MAMExpandableListActivity |
android.app.Fragment | MAMFragment |
android.app.IntentService | MAMIntentService |
android.app.LauncherActivity | MAMLauncherActivity |
android.app.ListActivity | MAMListActivity |
android.app.ListFragment | MAMListFragment |
android.app.NativeActivity | MAMNativeActivity |
android.app.PendingIntent | MAMPendingIntent |
android.app.Service | MAMService |
android.app.TabActivity | MAMTabActivity |
android.app.TaskStackBuilder | MAMTaskStackBuilder |
android.app.backup.BackupAgent | MAMBackupAgent |
android.app.backup.BackupAgentHelper | MAMBackupAgentHelper |
android.app.backup.FileBackupHelper | MAMFileBackupHelper |
android.app.backup.SharePreferencesBackupHelper | MAMSharedPreferencesBackupHelper |
android.app.job.JobService | MAMJobService |
android.content.BroadcastReceiver | MAMBroadcastReceiver |
android.content.ContentProvider | MAMContentProvider |
android.os.Binder | MAMBinder (krävs endast om Binder inte genereras från ett AIDL-gränssnitt (Android Interface Definition Language) |
android.media.MediaPlayer | MAMMediaPlayer |
android.media.MediaMetadataRetriever | MAMMediaMetadataRetriever |
android.media.MediaRecorder | MAMMediaRecorder |
android.provider.DocumentsProvider | MAMDocumentsProvider |
android.preference.PreferenceActivity | MAMPreferenceActivity |
android.widget.PopupWindow | MAMPopupMenu |
android.widget.PopupWindow | MAMPopupWindow |
android.widget.ListPopupWindow | MAMListPopupWindow |
android.widget.TextView | MAMTextView |
android.widget.AutoCompleteTextView | MAMAutoCompleteTextView |
android.widget.CheckedTextView | MAMCheckedTextView |
android.widget.EditText | MAMEditText |
android.inputmethodservice.ExtractEditText | MAMExtractEditText |
android.widget.MultiAutoCompleteTextView | MAMMultiAutoCompleteTextView |
android.view.LayoutInflater | MAMLayoutInflater |
android.view.ViewGroup | MAMViewGroup |
android.view.SurfaceView | MAMSurfaceView |
android.opengl.GLSurfaceView | MAMGLSurfaceView |
android.widget.VideoView | MAMVideoView |
Metoder som har bytt namn
I många fall har en metod som är tillgänglig i Android-klassen markerats som slutgiltig i MAM-ersättningsklassen.
I det här fallet tillhandahåller MAM-ersättningsklassen en metod med liknande namn (vanligtvis suffixet med MAM
) som du bör åsidosätta i stället.
När du till exempel härleder från MAMActivity, i stället för att onCreate()
åsidosätta och anropa super.onCreate()
, Activity
måste åsidosätta onMAMCreate()
och anropa super.onMAMCreate()
.
Java-kompilatorn bör tillämpa de slutliga begränsningarna för att förhindra oavsiktlig åsidosättning av den ursprungliga metoden i stället för MAM-motsvarigheten.
Omslutna systemtjänster
För vissa systemtjänstklasser är det nödvändigt att anropa en statisk metod i en MAM-omslutningsklass i stället för att direkt anropa önskad metod på tjänstinstansen.
Till exempel måste ett anrop till getSystemService(ClipboardManager.class).getPrimaryClip()
bli ett anrop till MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)
.
Återigen gör det nödvändiga build-plugin-programmet automatiskt dessa ersättningar.
Android-klass | Intune App SDK-ersättning |
---|---|
android.content.ClipboardManager | MAMClipboard |
android.content.ContentProviderClient | MAMContentProviderClientManagement |
android.content.ContentResolver | MAMContentResolverManagement |
android.content.pm.PackageManager | MAMPackageManagement |
android.app.DownloadManager | MAMDownloadManagement |
android.print.PrintManager | MAMPrintManagement |
android.view.View | MAMViewManagement |
android.view.DragEvent | MAMDragEventManagement |
android.view.LayoutInflater | MAMLayoutInflaterManagement |
android.app.NotificationManager | MAMNotificationManagement |
android.app.blob.BlobStoreManager | MAMBlobStoreManager |
android.app.blob.BlobStoreManager.Session | MAMBlobStoreManager.Session |
Vissa klasser har de flesta av sina metoder omslutna, ClipboardManager
till exempel , ContentProviderClient
, ContentResolver
och PackageManager
medan andra klasser bara har en eller två metoder omslutna, DownloadManager
till exempel , PrintManager
, PrintHelper
, View
, DragEvent
och NotificationManager
NotificationManagerCompat
.
MDM- och MAM-registrering
Som beskrivs i steg 4: s registrering kontra registrering kommer Intune App SDK att "registrera" konton som din app registrerar så att kontot skyddas med principen. Kontot hanteras när registreringen har slutförts och MAM-principer bör nu tillämpas på det här kontot.
Termen "registrering" kan också referera till den slutanvändarinitierade processen för att aktivera enhetshantering (MDM). MDM-registreringen är helt separat från registrering av appskyddsprinciper.
En SDK-integrerad app kan ha ett konto registrerat för appskyddsprincipen utan att kontot har registrerats för enhetshantering. På samma sätt kan en användare ha registrerat en enhet för enhetshantering utan att ha några SDK-integrerade appar med konton som registrerats för appskyddsprincipen.
När utvecklare och administratörer refererar till registrering refererar de vanligtvis till MDM-registrering, eftersom registrering av appskyddsprinciper i stort sett är osynlig för både utvecklare och slutanvändare. Mer information om MDM-registrering finns i Registrera Android-enheter .
Integreringstips
Förstå företagsportalloggar
Företagsportalloggar innehåller information som Microsoft-tekniker använder för problemundersökningar. Vissa av loggarna kan också vara användbara för utvecklare som integrerar SDK.
I synnerhet innehåller filen DiagnosticsInfo-scrubbed.log
information om vilka appar som hanteras av MAM och MAM-principinformationen PolicyDB Information
i avsnittet.
Varje hanterad app har en post i avsnittet PolicyDB Information
.
Du bör leta efter appens paketnamn här för att bekräfta att MAM-principen är korrekt riktad mot din app.
Om du inte ser appens paketnamn här anger det att det konto som loggas in inte har en MAM-princip tillämpad.
Beskrivning av varje MAM-principinställning finns i Inställningar för Android-appskyddsprinciper i Microsoft Intune. En beskrivning av hur de här inställningarna visas i företagsportalloggarna finns i Granska klientappskyddsloggar. När MAM-principen inte tillämpas som förväntat rekommenderar vi att du kontrollerar företagsportalloggarna eller diagnostikgränssnittet, kontrollerar att appen hanteras av MAM-principen och bekräftar att principinställningarna har förväntade värden.
Du kan samla in företagsportalloggar på något av följande sätt:
- Via företagsportalen
- Öppna företagsportalappen
- Välj menyn med tre punkter i det högra hörnet
- Välj inställningar
- Under Diagnostikloggar väljer du Spara loggar
- Följ anvisningarna för att välja utdatakatalogen för att spara företagsportalloggarna.
- Använd
adb shell pull
kommandot för att hämta loggarna från din Android-enhet till den lokala datorn.
- [Använd Microsoft Edge för Android för att komma åt loggar för hanterade appar]. Då visas användargränssnittet för att samla in företagsportalloggar och visa MAM-diagnostik.
- Anropa
MAMPolicyManager.showDiagnostics(context)
för att visa samma användargränssnitt för insamling av företagsportalloggar.
Testa snabbt med ändringsprincip
När du utvecklar och testar appens integrering av Intune App SDK kan du ofta ändra inställningarna för appskyddsprinciper för testanvändaren.
Som standard checkar integrerade appar in med Intune-tjänsten för en uppdaterad princip var 30:e minut när den är aktiv. Du kan undvika den här väntan och tvinga fram en incheckning via företagsportalen:
- Starta företagsportalen. Du behöver inte logga in.
- Välj ... menyikon.
- Välj Inställningar.
- Bläddra till inställningen "Hanteringsprincip".
- Tryck på knappen Synkronisera.
Detta schemalägger omedelbart en incheckning och hämtar en uppdaterad princip som är riktad till din app och ditt konto.
Felsöka AndroidX-migrering
Om du har integrerat Intune App SDK innan du använder AndroidX kan det uppstå ett fel som detta när du migrerar till AndroidX:
incompatible types: android.support.v7.app.ActionBar cannot be converted to androidx.appcompat.app.ActionBar
Dessa fel kan inträffa eftersom din app refererar till SDK:s äldre supportklasser. MAM-stödklasserna omsluter Android-supportklasser som har flyttats i AndroidX. Om du vill bekämpa sådana fel ersätter du alla MAM-stödklassreferenser med deras AndroidX-motsvarigheter. Detta kan uppnås genom att först ta bort MAM-stödbiblioteksberoenden från dina Gradle-byggfiler. Raderna i fråga ser ut ungefär så här:
implementation "com.microsoft.intune.mam:android-sdk-support-v4:$intune_mam_version"
implementation "com.microsoft.intune.mam:android-sdk-support-v7:$intune_mam_version"
Åtgärda sedan de resulterande kompileringsfelen genom att ersätta alla referenser till MAM-klasser i paketen com.microsoft.intune.mam.client.support.v7
och com.microsoft.intune.mam.client.support.v4
med deras AndroidX-motsvarigheter.
Referenser till bör till MAMAppCompatActivity
exempel ändras till AndroidX AppCompatActivity
.
Som vi nämnt ovan skriver MAM-kompilerings-plugin-programmet automatiskt om klasser i AndroidX-biblioteken med lämpliga MAM-motsvarigheter vid kompilering.
Begränsningar och specialfall
Standardregistrering
Ditt program kan alternativt registrera sig för appskyddsprinciper genom en förenklad process som kallas standardregistrering. Den här funktionen är främst till för att stödja privata verksamhetsspecifika appar som inte har integrerat MSAL.
Varning
Standardregistreringen medför betydande kompromisser och rekommenderas inte. Appar som använder standardregistrering stöder inte villkorsstyrd åtkomst, drar inte nytta av enkel inloggning med Microsoft-tjänster och kan inte användas av icke-Intune-konton. Om din app levereras till en offentlig appbutik stöds inte standardregistrering.
Standardregistrering tvingar slutanvändaren att installera företagsportalen och slutföra ett MAM-registreringsflöde innan användare tillåts i ditt program.
Obs!
Standardregistreringen är molnmedveten.
Aktivera standardregistrering med följande steg:
Om din app integrerar MSAL eller om du behöver aktivera enkel inloggning konfigurerar du MSAL. Annars kan du hoppa över det här steget.
Aktivera standardregistrering genom att lägga till följande värde i manifestet under taggen
<application>
:<meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
Aktivera MAM-principen som krävs genom att lägga till följande värde i manifestet under taggen
<application>
:<meta-data android:name="com.microsoft.intune.mam.MAMPolicyRequired" android:value="true" />
Isolerade processer
Intune App SDK kan inte tillämpa skydd på isolerade processer.
Stöd för isolerade processer (android:isolatedProcess
) kräver tillägg av metadatataggen nedan.
Varning
Genom att lägga till dessa metadata deklarerar programmet att den isolerade processen inte kan exponera organisationsdata. Ditt program ansvarar för att garantera detta.
<meta-data android:name="com.microsoft.intune.mam.AllowIsolatedProcesses" android:value="true" />
Begränsningar för anpassad skärmdump
Om din app innehåller en anpassad skärmdumpsfunktion som kringgår Androids Window
begränsning på -nivå FLAG_SECURE
måste du kontrollera skärmdumpsprincipen innan du ger fullständig åtkomst till funktionen.
Om din app till exempel använder en anpassad renderingsmotor för att återge den aktuella vyn till en PNG-fil måste du först kontrollera AppPolicy.getIsScreenCaptureAllowed()
.
Om din app inte innehåller några anpassade skärmdumpsfunktioner eller skärmdumpsfunktioner från tredje part behöver du inte vidta några åtgärder för att begränsa skärmdumpar.
Policyn för skärmdump tillämpas automatiskt på Window
nivån för alla MAM-integrerade appar.
Alla försök från operativsystemet eller en annan app att registrera en Window
i din app blockeras efter behov.
Om en användare till exempel försöker fånga appens skärm via Androids inbyggda skärmbilds- eller skärminspelningsfunktioner begränsas avbildningen automatiskt utan deltagande från din app.
Begränsningar för principframtvingande
Använda innehållsmatchare: Intune-principen "överföra eller ta emot" kan blockera eller delvis blockera användningen av en innehållsmatchare för att få åtkomst till innehållsleverantören i en annan app. Detta gör
ContentResolver
att metoder returnerar null eller utlöser ett felvärde (till exempelopenOutputStream
utlösesFileNotFoundException
om det blockeras). Appen kan avgöra om ett fel med att skriva data via en innehållsmatchare orsakades av en princip (eller skulle orsakas av en princip) genom att göra anropet:MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);
eller om det inte finns någon associerad aktivitet:
MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
I det andra fallet måste appar med flera identiteter vara noga med att ange trådidentiteten på rätt sätt (eller skicka en explicit identitet till ett
getPolicyForIdentity
anrop).
Exporterade tjänster
Den AndroidManifest.xml fil som ingår i Intune App SDK innehåller MAMNotificationReceiverService, som måste vara en exporterad tjänst för att företagsportalen ska kunna skicka meddelanden till en hanterad app. Tjänsten kontrollerar anroparen för att säkerställa att endast företagsportalen får skicka meddelanden.
Reflektionsbegränsningar
Några av MAM-basklasserna (till exempel MAMActivity
, MAMDocumentsProvider
) innehåller metoder (baserat på de ursprungliga Android-basklasserna) som använder parameter- eller returtyper som bara finns ovanför vissa API-nivåer.
Därför kanske det inte alltid är möjligt att använda reflektion för att räkna upp alla metoder för appkomponenter.
Den här begränsningen är inte begränsad till MAM. Det är samma begränsning som gäller om själva appen implementerade dessa metoder från Android-basklasserna.
Robolectric
Det går inte att testa Beteendet för Intune App SDK under Robolectric. Det finns kända problem med att köra SDK:n under Robolectric på grund av beteenden som finns under Robolectric och som inte exakt efterliknar dem på verkliga enheter eller emulatorer.
Om du behöver testa ditt program under Robolectric är den rekommenderade lösningen att flytta programklasslogiken till en hjälpkomponent och skapa apk:en för enhetstestning med en programklass som inte ärver från MAMApplication.