Galaxy S4(SC-04E)用のcrDroid 8.0、カスタムROMを作った時の忘備録メモ2

メモ) powerモジュールを自作したらPermission deniedのエラーが出る

ベースは、hardware/samsung/power から改変 makoのpower, sc03eのpower を参考に修正した。

出来たがlogcatで権限が足りないエラーが出ている

 E SamsungPowerHAL: Error opening /sys/devices/system/cpu/cpufreq/interactive/boost: Permission denied
 E SamsungPowerHAL: Error opening /sys/devices/system/cpu/cpufreq/interactive/boostpulse: Permission denied
 E SamsungPowerHAL: Error opening /sys/devices/system/cpu/cpufreq/interactive/io_is_busy: Permission denied

ルートではアクセスできる、値も入っている。 init.qcom.power.rcでオーナーの変更が適しているだろうけど、面倒なのでchmodで終わらせる。 以下を追加

rootdir/etc/init.qcom.power.rc

    # power.msm8960 access
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/boost
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/boostpulse
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/io_is_busy
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq

メモ)GPSを呼び出すアプリを動かすと落ちる

 E AndroidRuntime: Process: com.ppillai.gpsnmea, PID: 21118
 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {com.ppillai.gpsnmea/com.ppillai.gpsnmea.GpsNmeaActivity}: java.lang.IllegalArgumentException: provider doesn't exist: gps
 E AndroidRuntime:        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3666)
 E AndroidRuntime:        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3706)
 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2919)

device.mkにGPSの記述が抜けている。追加する。

# GPS
PRODUCT_PACKAGES += \
    android.hardware.gnss@1.0-impl \
    android.hardware.gnss@1.0-service \
    gps.msm8960 \
    libloc_eng \
    libloc_core \
    libgps.utils

メモ)GPSモジュールを含めてビルドすると以下のエラーになる。

hardware/libhardware/include/hardware/gnss-base.h:17:5: error: expected identifier
    GNSS_CONSTELLATION_UNKNOWN = 0,
hardware/libhardware/include/hardware/gnss-base.h:18:5: error: expected identifier
    GNSS_CONSTELLATION_GPS = 1,
hardware/libhardware/include/hardware/gnss-base.h:19:5: error: expected identifier
    GNSS_CONSTELLATION_SBAS = 2,
..

hardware/libhardware/include/hardware/gps.hをみるとgnss-base.hを含む記述があり、device/samsung/jf-common/include/hardware/gps.hをみるとその記述が入っていない

7.1まではgps.hだけだったが、8.xからgps.hとgnss-base.hになった。

#include <hardware/hardware.h>
#include "gnss-base.h"
__BEGIN_DECLS

gps.hにgnss-base.hのincludeの記述を追加して、gnss-base.hをローカルのincludeへコピーする

$ cp hardware/libhardware/include/hardware/gnss-base.h device/samsung/jf-common/include/hardware/

BoardConfig.mkに以下をセットしないとgps.msm8960.soが生成されない。 (hardware/qcom/gps/Android.mk,hardware/qcom/gps/msm8960配下のAndroid.mkを参照)

# GPS
BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE := $(TARGET_BOARD_PLATFORM)
BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET := true
TARGET_NO_RPC := true
#USE_DEVICE_SPECIFIC_GPS := true

メモ)アプリ「レコーダ」が動作しない。録音ボタンを押すと落ちる

 D AndroidRuntime: Shutting down VM
 E AndroidRuntime: FATAL EXCEPTION: main
 E AndroidRuntime: Process: org.lineageos.recorder, PID: 4397
 E AndroidRuntime: java.lang.IllegalArgumentException: The key must be an application-specific resource id.
 E AndroidRuntime:        at android.view.View.setTag(View.java:21742)
 E AndroidRuntime:        at android.support.transition.Scene.setCurrentScene(Scene.java:195)
 E AndroidRuntime:        at android.support.transition.TransitionManager.beginDelayedTransition(TransitionManager.java:407)
 E AndroidRuntime:        at android.support.transition.TransitionManager.beginDelayedTransition(TransitionManager.java:368)
 E AndroidRuntime:        at org.lineageos.recorder.RecorderActivity.refresh(RecorderActivity.java:330)

落ちている箇所

packages/app/src/main/java/org/lineageos/recorder/RecorderActivity.java(300)

    updateSystemUIColors();
    TransitionManager.beginDelayedTransition(mConstraintRoot);
    set.applyTo(mConstraintRoot);

frameworks/support/transition/src/android/support/transition/TransitionManager.java

    public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot,
            @Nullable Transition transition) {
        if (!sPendingTransitions.contains(sceneRoot) && ViewCompat.isLaidOut(sceneRoot)) {
            if (Transition.DBG) {
                Log.d(LOG_TAG, "beginDelayedTransition: root, transition = "
                        + sceneRoot + ", " + transition);
            }
            sPendingTransitions.add(sceneRoot);
            if (transition == null) {
                transition = sDefaultTransition;
            }
            final Transition transitionClone = transition.clone();
            sceneChangeSetup(sceneRoot, transitionClone);
            Scene.setCurrentScene(sceneRoot, null);
            sceneChangeRunTransition(sceneRoot, transitionClone);
        }
    }

frameworks/support/transition/src/android/support/transition/Scene.java

    static void setCurrentScene(View view, Scene scene) {
        view.setTag(R.id.transition_current_scene, scene);
    }

R.id.transition_current_sceneが無いのかと思ったがあった。

$ cat frameworks/support/transition/res/values/ids.xml

<resources>
    <item name="transition_scene_layoutid_cache" type="id"/>
    <item name="transition_current_scene" type="id"/>

アプリのソースが他とちがうのか確認。同じだった。

$ git clone -b lineage-15.1 --single-branch https://github.com/LineageOS/android_packages_apps_Recorder.git
$ diff -u -r  ~/crdroid-8.0/packages/apps/Recorder ~/temp/android_packages_apps_Recorder

frameworksのsupportを比較するが、差がほとんどない。原因がわからないので、Recorderはビルドから外そう

$ git clone -b lineage-15.1 --single-branch https://github.com/LineageOS/android_frameworks_support.git

$ diff -u -r  ~/crdroid-8.0/frameworks/support/transition ~/temp/android_frameworks_support/transition

メモ)frameworks/supportのdiffで気づいた点を直す

testコードでは差があるが、testコードなので無視し、メインで関係するところを修正

--- /home/labo/crdroid-8.0/frameworks/support/transition/api14/android/support/transition/GhostViewApi14.java   2022-10-21 17:26:12.699904900 +0900
+++ /home/labo/temp/android_frameworks_support/transition/api14/android/support/transition/GhostViewApi14.java  2022-10-31 12:00:31.397353400 +0900
@@ -150,8 +150,8 @@
         final int[] viewLocation = new int[2];
         getLocationOnScreen(location);
         mView.getLocationOnScreen(viewLocation);
-        viewLocation[0] -= mView.getTranslationX();
-        viewLocation[1] -= mView.getTranslationY();
+        viewLocation[0] = (int) (viewLocation[0] - mView.getTranslationX());
+        viewLocation[1] = (int) (viewLocation[1] - mView.getTranslationY());
         mDeltaX = viewLocation[0] - location[0];
         mDeltaY = viewLocation[1] - location[1];
         // Monitor invalidation of the target view.

メモ)Recorderアプリをビルド対象から外す

vendor/lineage/config/common_full.mk

# Inherit common Lineage stuff
$(call inherit-product, vendor/lineage/config/common.mk)

PRODUCT_SIZE := full

-# Recorder
-PRODUCT_PACKAGES += \
-    Recorder

メモ)カーネルを8.0に変更する

$ git clone -b lineage-15.0 --single-branch https://github.com/LineageOS/android_kernel_samsung_jf.git

binderを32ビットに変更する

BoardConfig.mkを修正する

#TARGET_USES_64_BIT_BINDER := true

起動に失敗するので8.1のカーネルを使って、defconfigは8.0用にして使う

主な違いは

CONFIG_NET_NS=y

CONFIG_DEFAULT_TCP_CONG="cubic"

CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDER_IPC_32BIT=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"

かな。出来たけど、イマイチ遅いので公開はしない。