[JAVA] Ajoutez une bibliothèque jar pré-construite à Android et appelez-la dans le cadre

Que faire

  1. Créez une bibliothèque jar de test et ajoutez la bibliothèque jar à AOSP
  2. Appelez l'API de la librairie ajoutée en 1 depuis le framework (panneau de paramétrage rapide)
  3. Ajoutez une bibliothèque AWS et appelez-la depuis le framework

1. Créer une bibliothèque de jar de test

Créez une bibliothèque jar qui implémente une API simple qui renvoie la chaîne de test "test".

Test.java


package com.testlib;


public class Test {
    public String getTestString() {
        return "test";
    }
}

$ javac Test.java
$ jar -cvf test-lib.jar *.class

Copiez le pot créé ci-dessus dans la source AOSP ci-dessous

/prebuilts/misc/common/test-lib/test-lib.jar

Créez également Android.mk

/prebuilts/misc/common/test-lib/Android.mk


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_JAVA_LIBRARIES := test-lib$(COMMON_JAVA_PACKAGE_SUFFIX)

include $(BUILD_HOST_PREBUILT)

2. Appelez l'API de la bibliothèque ajoutée en 1 depuis le panneau de configuration rapide

2-1. Modification de la source

Lorsque vous appuyez sur la vignette du panneau de configuration rapide que vous avez ajouté de manière appropriée, modifiez la source AOSP afin que la chaîne de caractères «test» obtenue à partir de l'API ci-dessus s'affiche dans Toast.

diff

/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/LoggingTile.java


+import android.widget.Toast;
...
+import com.testlib.Test;
...
    @Override
    protected void handleClick() {
+        Test test = new Test();
+        Toast.makeText(mContext , test.getTestString(), Toast.LENGTH_SHORT).show();
        try {

/frameworks/base/packages/SystemUI/Android.mk


...
LOCAL_STATIC_JAVA_LIBRARIES := \
    SystemUI-tags \
    SystemUI-proto

LOCAL_STATIC_JAVA_LIBRARIES += test-lib
...
include $(BUILD_PACKAGE)

+include $(CLEAR_VARS)

+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := test-lib:../../../../prebuilts/misc/common/test-lib/test-+lib.jar#libs/test_lib/test-lib.jar

+include $(BUILD_MULTI_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))
...

2-2. Construire

--Construire

$ make -j4
$ adb remount
$ adb push out/target/product/bullhead/system/priv-app/SystemUI /system/priv-app/
$ adb reboot

2-3. Contrôle de fonctionnement

Essayez de toucher la vignette

Vous pouvez confirmer que l'API de la bibliothèque ajoutée est appelée normalement.

3. Ajoutez une bibliothèque AWS et appelez-la depuis le framework

3-1. Préparation de la bibliothèque

AWS SDK pour Android

Est copié sous / prebuilts / misc / common / aws.

J'ai eu une erreur si Gson n'a pas été trouvé, alors copiez également le jar Gson dans / prebuilts / misc / common / gson.

3-2. Essayez d'utiliser Lambda

De même, modifiez pour appeler Lambda lorsque vous appuyez sur une vignette.

Référence officielle https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-android-example.html https://docs.aws.amazon.com/ja_jp/aws-mobile/latest/developerguide/how-to-android-lambda.html

Différence de modification de la source

3-3. Envoyer un rapport de bogue à S3

Vous pouvez obtenir le rapport de bogue à partir des paramètres, mais comme ci-dessus, insérez un fil afin que vous puissiez obtenir le rapport de bogue lorsque vous appuyez sur la vignette.

packages/SystemUI/src/com/android/systemui/qs/tiles/LoggingTile.java


+    private Handler mHandler = new Handler();
...
    @Override
    protected void handleClick() {
+        mHandler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    ActivityManager.getService().requestBugReport(
+                        ActivityManager.BUGREPORT_OPTION_INTERACTIVE
+                    );
+                } catch (RemoteException e) {
+                    Log.e(TAG, "requestBugReport() failed");
+                }
+            }
+        }, 500);
        try {

De plus, puisque ce qui suit sera appelé lorsque l'acquisition du rapport de bogue sera terminée, ajoutez le processus pour enregistrer le rapport de bogue dans S3 ci-dessous.

frameworks/base/packages/Shell/src/com/android/shell/BugreportProgressService.java#onBugreportFinished

frameworks/base/packages/Shell/src/com/android/shell/BugreportProgressService.java


    private void onBugreportFinished(int id, Intent intent) {
        final File bugreportFile = getFileExtra(intent, EXTRA_BUGREPORT);
        if (bugreportFile == null) {
            // Should never happen, dumpstate always set the file.
            Log.wtf(TAG, "Missing " + EXTRA_BUGREPORT + " on intent " + intent);
            return;
        }
+
+        try {
+            final String S3_ACCESS_KEY = "YOUR_ACCESS_KEY";
+            final String S3_SECRET_KEY = "YOUR_SECRET_KEY";
+            AmazonS3Client S3Client = new AmazonS3Client(
+                new BasicAWSCredentials(S3_ACCESS_KEY, S3_SECRET_KEY)
+            );
+            final String BUCKET_NAME = "aosp_test";
+            PutObjectRequest por = new PutObjectRequest(
+                BUCKET_NAME,
+                bugreportFile.getName(),
+                bugreportFile
+            );
+            S3Client.putObject(por);
+        } catch (final Exception e) {
+            Log.e(TAG, "Failed to save bugreport to S3", e);
+        }

        mInfoDialog.onBugreportFinished();
        BugreportInfo info = getInfo(id);

Différence de modification de la source

Remplacer par build

$ make -j4
$ adb remount
$ adb push out/target/product/bullhead/system/priv-app/SystemUI /system/priv-app/
$ adb push out/target/product/bullhead/system/priv-app/Shell /system/priv-app/
$ adb reboot

Essayez de toucher la vignette.

image.png

Il peut être confirmé qu'il est enregistré dans S3.

3-4. Essayez de sauvegarder l'enregistrement dans DynamoDB

Différence de modification de la source

Après avoir appuyé sur la vignette, vous pouvez confirmer que l'enregistrement est enregistré dans DynamoDB ↓

image.png


Note

Erreur 1

SystemUI tombait parfois en panne en raison d'une exception fatale telle que l'autorisation android.permission.READ_CONTACTS après le démarrage, mais cela a été résolu simplement par FDR.

01-22 18:59:06.852: D/AndroidRuntime(4784): Shutting down VM
01-22 18:59:06.855: E/AndroidRuntime(4784): FATAL EXCEPTION: main
01-22 18:59:06.855: E/AndroidRuntime(4784): Process: com.android.systemui, PID: 4784
01-22 18:59:06.855: E/AndroidRuntime(4784): java.lang.RuntimeException: Unable to create service com.android.systemui.SystemUIService: android.view.InflateException: Binary XML file line #73: uid=10062 needs permission android.permission.READ_CONTACTS to read lock_screen_owner_info_enabled for user 0
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3349)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread.-wrap4(Unknown Source:0)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.os.Handler.dispatchMessage(Handler.java:106)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.os.Looper.loop(Looper.java:164)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread.main(ActivityThread.java:6494)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at java.lang.reflect.Method.invoke(Native Method)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
01-22 18:59:06.855: E/AndroidRuntime(4784): Caused by: android.view.InflateException: Binary XML file line #73: uid=10062 needs permission android.permission.READ_CONTACTS to read lock_screen_owner_info_enabled for user 0
01-22 18:59:06.855: E/AndroidRuntime(4784): Caused by: java.lang.SecurityException: uid=10062 needs permission android.permission.READ_CONTACTS to read lock_screen_owner_info_enabled for user 0
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.os.Parcel.readException(Parcel.java:2004)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.os.Parcel.readException(Parcel.java:1950)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.widget.ILockSettings$Stub$Proxy.getBoolean(ILockSettings.java:476)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.widget.LockPatternUtils.getBoolean(LockPatternUtils.java:1271)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.widget.LockPatternUtils.isOwnerInfoEnabled(LockPatternUtils.java:738)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.keyguard.KeyguardStatusView.getOwnerInfo(KeyguardStatusView.java:273)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.keyguard.KeyguardStatusView.updateOwnerInfo(KeyguardStatusView.java:244)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.keyguard.KeyguardStatusView.onFinishInflate(KeyguardStatusView.java:170)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:876)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.view.View.inflate(View.java:23239)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.statusbar.phone.StatusBar.inflateStatusBarWindow(StatusBar.java:1440)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.statusbar.phone.StatusBar.makeStatusBarView(StatusBar.java:1009)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.statusbar.phone.StatusBar.addStatusBarWindow(StatusBar.java:3664)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.statusbar.phone.StatusBar.createAndAddWindows(StatusBar.java:3660)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.statusbar.phone.StatusBar.start(StatusBar.java:889)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.SystemBars.createStatusBarFromConfig(SystemBars.java:71)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.SystemBars.start(SystemBars.java:42)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:215)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:164)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.systemui.SystemUIService.onCreate(SystemUIService.java:33)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3339)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread.-wrap4(Unknown Source:0)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.os.Handler.dispatchMessage(Handler.java:106)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.os.Looper.loop(Looper.java:164)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at android.app.ActivityThread.main(ActivityThread.java:6494)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at java.lang.reflect.Method.invoke(Native Method)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-22 18:59:06.855: E/AndroidRuntime(4784): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Erreur 2

Dans DynamoDB, même si DynamoDBHashKey est attaché, j'ai eu une erreur disant qu'il ne peut pas être trouvé comme indiqué ci-dessous.

11-06 00:22:42.371: E/AndroidRuntime(832): FATAL EXCEPTION: Thread-3
11-06 00:22:42.371: E/AndroidRuntime(832): Process: com.android.systemui, PID: 832
11-06 00:22:42.371: E/AndroidRuntime(832): com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: No interface com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey annotation found in class class com.android.systemui.qs.tiles.AOSPTest
11-06 00:22:42.371: E/AndroidRuntime(832): 	at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.needAutoGenerateAssignableKey(DynamoDBMapper.java:944)
11-06 00:22:42.371: E/AndroidRuntime(832): 	at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:1008)
11-06 00:22:42.371: E/AndroidRuntime(832): 	at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:909)
11-06 00:22:42.371: E/AndroidRuntime(832): 	at com.android.systemui.qs.tiles.LoggingTile$1.run(LoggingTile.java:57)

Il semble que ce soit une erreur d'enregistrer une exception dans le fichier proguard comme indiqué ci-dessous

-keep class com.android.systemui.qs.tiles.AOSPTest { *; }

Recommended Posts

Ajoutez une bibliothèque jar pré-construite à Android et appelez-la dans le cadre
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
3 façons d'importer des bibliothèques dans Android Studio
Ajouter un horodatage au nom de fichier JAR dans Gradle
Comment ajouter un fichier jar dans ScalaIDE
De Java à C et de C à Java dans Android Studio
Ajoutez la date aux statistiques GC acquises par gcutil et affichez-la.
Obtenez des informations vidéo YouTube avec Retrofit et conservez-les dans l'application Android.
Ajouter classpath: au chemin spécifié dans spring.datasource.schema
[Développement Android] Obtenez des images du serveur avec Java et définissez-les dans ImageView! !!
Je souhaite analyser morphologiquement le journal stocké dans la base de données et le stocker dans la base de données pour classer les messages 1
Liez la demande à n'importe quelle classe et recevez-la
Ecrire une classe en Kotlin et l'appeler en Java
Classes et instances Java comprises dans la figure
Comment déboguer le fichier jar généré avec Eclipse
Ajouter un fichier au fichier jar
Comment ajouter un autre projet en tant que bibliothèque Maven avec CircleCI et l'utiliser pour la construction
Cliquez sur le bouton [rails] pour créer un mot de passe alphanumérique aléatoire et entrez-le dans le champ de mot de passe
Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
[Android, Java] Méthode pratique pour calculer la différence en jours
Application Android qui sélectionne et affiche des images de la galerie
Implémentez l'interface Java dans la classe JRuby et appelez-la depuis Java
Je veux appeler une méthode et compter le nombre
[Code Golf] Dégonflez le code et soumettez-le à AtCoder [Compressed Golf]
Comment appeler et utiliser l'API en Java (Spring Boot)
Comment ajouter les mêmes index dans un tableau imbriqué
Ajouter une ombre au bouton Swift (et aussi au cercle)
Contribué à Gradle et a été nommé dans la note de publication
Code pour spécifier le nom de l'image sous forme de chaîne de caractères et le coller dans ImageView (Android)
4 Ajoutez println à l'interpréteur
Il ne répond pas à la description en .js du fichier packs
J'ai ouvert la barre de menu (menu d'options) sur Android et l'ai vue.
Comment définir et utiliser un profil avec une configuration basée sur des annotations dans le framework Spring
[jOOQ] Comment utiliser CASE WHEN dans la clause WHERE / AND / OR
Méthode pour additionner le nombre d'années et obtenir la fin du mois
Comment installer le langage utilisé dans Ubuntu et comment créer l'environnement
"Attendez que le processus se termine" et arrêtez le processus car il reste
Comment obtenir et ajouter des données depuis Firebase Firestore dans Ruby
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Étapes pour installer Maven sur Mac et l'utiliser avec Eclipse
Points à retenir et concepts dans le didacticiel Ruby on Rails
Comment appeler plusieurs noms à la fois dans la même catégorie
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
Une erreur s'est produite dans le cours gratuit de RubyOnRails Udemy, l'a résolue et est allée jusqu'au bout