[JAVA] Fügen Sie Android eine vorgefertigte JAR-Bibliothek hinzu und rufen Sie sie im Framework auf

Was ist zu tun

  1. Erstellen Sie eine Test-JAR-Bibliothek und fügen Sie die JAR-Bibliothek zu AOSP hinzu
  2. Rufen Sie die API der in 1 hinzugefügten Bibliothek innerhalb des Frameworks auf (Schnelleinstellungsfeld).
  3. Fügen Sie eine AWS-Bibliothek hinzu und rufen Sie sie innerhalb des Frameworks auf

1. Erstellen Sie eine Testglasbibliothek

Erstellen Sie eine JAR-Bibliothek, die eine einfache API implementiert, die die Testzeichenfolge "test" zurückgibt.

Test.java


package com.testlib;


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

--Jar Schöpfung

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

Kopieren Sie das oben erstellte Glas in die unten stehende AOSP-Quelle

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

Erstellen Sie auch 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. Rufen Sie die API der in 1 hinzugefügten Bibliothek über das Schnelleinstellungsfeld auf

2-1. Änderung der Quelle

Wenn Sie auf die Kachel des Schnelleinstellungsfelds tippen, das Sie entsprechend hinzugefügt haben, ändern Sie die AOSP-Quelle so, dass die von der obigen API erhaltene Zeichenfolge "test" in Toast angezeigt wird.

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. Bauen

--Bauen

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

2-3. Funktionsprüfung

Versuchen Sie, auf die Kachel zu tippen

Sie können bestätigen, dass die API der hinzugefügten Bibliothek normal aufgerufen wird.

3. Fügen Sie eine AWS-Bibliothek hinzu und rufen Sie sie innerhalb des Frameworks auf

3-1. Bibliotheksvorbereitung

AWS SDK für Android

Wird unter / prebuilts / misc / common / aws kopiert.

Ich habe eine Fehlermeldung erhalten, wenn Gson nicht gefunden wurde. Kopieren Sie daher das Gson-Glas auch nach / prebuilts / misc / common / gson.

3-2. Versuchen Sie es mit Lambda

Ändern Sie in ähnlicher Weise, um Lambda aufzurufen, wenn Sie auf eine Kachel tippen.

Offizielle Referenz 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

Unterschied bei der Änderung der Quelle

3-3. Senden Sie einen Fehlerbericht an S3

Sie können den Fehlerbericht über die Einstellungen abrufen. Fügen Sie jedoch wie oben beschrieben eine Leitung ein, damit Sie den Fehlerbericht abrufen können, wenn Sie auf die Kachel tippen.

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 {

Da das Folgende aufgerufen wird, wenn die Erfassung des Fehlerberichts abgeschlossen ist, fügen Sie den Prozess zum Speichern des Fehlerberichts in S3 unten hinzu.

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);

Unterschied bei der Änderung der Quelle

Durch Build ersetzen

$ 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

Versuchen Sie, auf die Kachel zu tippen.

image.png

Es kann bestätigt werden, dass es in S3 gespeichert ist.

3-4. Versuchen Sie, den Datensatz in DynamoDB zu speichern

Unterschied bei der Änderung der Quelle

Nach dem Tippen auf die Kachel können Sie bestätigen, dass der Datensatz in DynamoDB ↓ gespeichert ist

image.png


Memo

Fehler 1

SystemUI stürzte manchmal aufgrund einer schwerwiegenden Ausnahme wie der Berechtigung android.permission.READ_CONTACTS nach dem Start ab, wurde jedoch einfach durch FDR behoben.

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)

Fehler 2

In DynamoDB wurde, obwohl ich DynamoDBHashKey angehängt habe, die Fehlermeldung angezeigt, dass es nicht wie unten gezeigt gefunden werden kann.

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)

Es scheint ein Fehler zu sein, eine Ausnahme in der Proguard-Datei zu registrieren, wie unten gezeigt

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

Recommended Posts

Fügen Sie Android eine vorgefertigte JAR-Bibliothek hinzu und rufen Sie sie im Framework auf
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
3 Möglichkeiten zum Importieren von Bibliotheken in Android Studio
Fügen Sie dem JAR-Dateinamen in Gradle einen Zeitstempel hinzu
So fügen Sie eine JAR-Datei in ScalaIDE hinzu
Von Java nach C und von C nach Java in Android Studio
Fügen Sie das Datum zu den von gcutil erfassten GC-Statistiken hinzu und geben Sie es aus.
Holen Sie sich Youtube-Videoinformationen mit Retrofit und behalten Sie sie in der Android-App.
Klassenpfad hinzufügen: zu dem in spring.datasource.schema angegebenen Pfad
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!
Ich möchte das in der Datenbank gespeicherte Protokoll morphologisch analysieren und in der Datenbank speichern, um Nachrichten 1 zu klassifizieren
Binden Sie die Anfrage an eine Klasse und erhalten Sie sie
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
In der Abbildung verstandene Java-Klassen und -Instanzen
So debuggen Sie die generierte JAR-Datei mit Eclipse
Datei zur JAR-Datei hinzufügen
So fügen Sie mit CircleCI ein weiteres Projekt als Maven-Bibliothek hinzu und verwenden es zum Erstellen
Klicken Sie auf die Schaltfläche [Schienen], um ein zufälliges alphanumerisches Kennwort zu erstellen und in das Kennwortfeld einzugeben
Siehe C ++ im Android Studio-Modul (Java / Kotlin)
[Android, Java] Praktische Methode zur Berechnung der Differenz in Tagen
Android App, die Bilder aus der Galerie auswählt und anzeigt
Implementieren Sie die Java-Schnittstelle in der JRuby-Klasse und rufen Sie sie von Java aus auf
Ich möchte eine Methode aufrufen und die Nummer zählen
[Code Golf] Entleeren Sie den Code und senden Sie ihn an AtCoder [Compressed Golf]
Aufrufen und Verwenden der API in Java (Spring Boot)
So fügen Sie dieselben Indizes in ein verschachteltes Array ein
Fügen Sie dem Swift-Button (und auch dem Kreis) einen Schatten hinzu.
Hat zu Gradle beigetragen und wurde im Release Note genannt
Code zum Angeben des Bildnamens als Zeichenfolge und Einfügen in ImageView (android)
4 Fügen Sie dem Interpreter println hinzu
Es reagiert nicht auf die Beschreibung in .js der Packs-Datei
Ich habe die Menüleiste (Optionsmenü) unter Android geöffnet und gesehen.
So legen Sie ein Profil mit annotationsbasierter Konfiguration im Spring-Framework fest und verwenden es
[jOOQ] Wie in der WHERE / AND / OR-Klausel WANN FALLEN
Methode, um die Anzahl der Jahre zu addieren und das Monatsende zu erhalten
Wie installiere ich die in Ubuntu verwendete Sprache und wie erstelle ich die Umgebung?
"Warten Sie, bis der Prozess abgeschlossen ist" und beenden Sie den Prozess, da er bestehen bleibt
Abrufen und Hinzufügen von Daten aus dem Firebase Firestore in Ruby
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java
Schritte zum Installieren von Maven auf einem Mac und zur Verwendung mit Eclipse
Dinge, an die Sie sich erinnern sollten, und Konzepte im Ruby on Rails-Tutorial
So rufen Sie mehrere Namen gleichzeitig in derselben Kategorie auf
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
Im kostenlosen Kurs von RubyOnRails Udemy ist ein Fehler aufgetreten, der behoben und bis zum Ende durchgearbeitet wurde