Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use androidx libs without gradle

With my script below:

echo "Setting environment variables..."
SDK="${HOME}/Programs/Android"
BUILD_TOOLS="${SDK}/build-tools/29.0.2"
PLATFORM="${SDK}/platforms/android-29"
ANDROID_API=29
APK_NAME="ECLAndroidSkeleton"
PACKAGE_NAME="ecl.android.skeleton"
ORG_DIRS="${PACKAGE_NAME//./\/}"
NDK="${SDK}/ndk-bundle"
ANDROID_TOOLCHAIN="${NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi23-clang"
ECL="${HOME}/Programs/ecl"
ECL_ANDROID_DIR="${ECL}/ecl-armv7a-linux-androideabi"
ECL_LIB_DIR="${ECL_ANDROID_DIR}/lib/ecl-16.1.3"
KEY_PASS="android123"

echo "Cleaning build directories..."
rm -rf build/gen build/obj build/apk

echo "Creating build directories..."
mkdir -p build/gen build/obj build/apk build/apk/lib/armeabi-v7a

if [ ! -f keystore.jks ] || [ "$1" == "key" ]; then
  if [ -f keystore.jks ]; then
    echo "Deleting ./keystore.jks..."
    rm -rf keystore.jks
  fi
  echo "Generating new ./keystore.jks..."  
  keytool -genkeypair -keystore keystore.jks -alias androidkey \
      -validity 10000 -keyalg RSA -keysize 2048
  if [ "$1" == "key" ]; then exit 0; fi
fi

echo "Compiling C code..."
${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libhelloecl.so \
             -DANDROID -llog \
             -I"${ECL_ANDROID_DIR}"/include \
             jni/ecl_boot.c \
             jni/ecl_thread.c \
             jni/org_lisp_ecl_EmbeddedCommonLisp.c \
             "${ECL_ANDROID_DIR}"/lib/libecl.so

${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libandroidlog.so \
             -DANDROID -llog \
             jni/android_log.c

echo "Copying ${ECL_ANDROID_DIR}/lib/libecl.so to ./build/apk/lib/armeabi-v7a/..." 
cp "${ECL_ANDROID_DIR}"/lib/libecl.so ./build/apk/lib/armeabi-v7a/

echo "Copying assets to APK..."
MODULES_DIR=./assets/lisp/lib
rm -rf "${MODULES_DIR}"
mkdir -p "${MODULES_DIR}"
cp "${ECL_LIB_DIR}"/help.doc "${MODULES_DIR}"
cp "${ECL_LIB_DIR}"/asdf.fas "${MODULES_DIR}"
#cp "${ECL_LIB_DIR}"/encodings/* "${MODULES_DIR}"
unzip -qq -o ./libs/lisp.zip -d "${MODULES_DIR}"
"${NDK}"/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip "${MODULES_DIR}"/*.fas
cp -r ./assets/ ./build/apk/

echo "Generate ./build/gen/${ORG_DIRS}/R.java file..."
"${BUILD_TOOLS}/aapt" package -f -m -J build/gen/ -S res \
       -M AndroidManifest.xml -I "${PLATFORM}/android.jar"

echo "Compiling the java files in ./build/obj/*.class..."
javac -bootclasspath "${JAVA_HOME}/jre/lib/rt.jar" \
      -classpath "${PLATFORM}/android.jar" \
      -d build/obj \
      build/gen/"${ORG_DIRS}"/R.java \
      src/"${ORG_DIRS}"/EmbeddedCommonLisp.java \
      src/"${ORG_DIRS}"/HelloEclActivity.java

echo "Creating ./build/apk/classes.dex..."
"${BUILD_TOOLS}/dx" --dex --output=build/apk/classes.dex build/obj/

echo "Packaging ./build/${APK_NAME}.unsigned.apk..."
"${BUILD_TOOLS}/aapt" package -f -M AndroidManifest.xml -S res/ \
      -I "${PLATFORM}/android.jar" \
      -F build/"${APK_NAME}".unsigned.apk build/apk/

echo "Zipaligning unsigned APK to ./build/${APK_NAME}.aligned.apk..."
"${BUILD_TOOLS}/zipalign" -f -p 4 \
      build/"${APK_NAME}".unsigned.apk build/"${APK_NAME}".aligned.apk

echo "Signing aligned APK to ./build/${APK_NAME}.apk..."
if [[ -n "${KEY_PASS}" ]]; then
    "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
                   --ks-key-alias androidkey \
                   --ks-pass pass:"${KEY_PASS}" \
                   --key-pass pass:"${KEY_PASS}" \
                   --out build/"${APK_NAME}".apk \
                   build/"${APK_NAME}".aligned.apk
else
    "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
               --ks-key-alias androidkey \
               --out build/"${APK_NAME}".apk \
               build/"${APK_NAME}".aligned.apk
fi

echo "Clean lisp libs because ASDF..."
rm -r assets/lisp/lib/*
rm -r build/apk/assets/lisp/lib/*

echo "Testing APK..."
"${SDK}/platform-tools/adb" install -r build/"${APK_NAME}".apk
"${SDK}/platform-tools/adb" shell am start --activity-clear-top -n "${PACKAGE_NAME}"/.HelloEclActivity

And the Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:background="#1de9b6">

  <View
   android:id="@+id/rect001" 
   android:layout_width="100dp"
   android:layout_height="100dp"
   android:background="#E7040F" />

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/my_text"/>
</LinearLayout>

I can compile with success without gradle. But with the layout below:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#1de9b6">

  <View
      android:id="@+id/rect001"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:background="#E7040F"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"/>

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/my_text"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

I can't compile:

Generate ./build/gen/ecl/android/skeleton/R.java file...
    (skipping file '.#main.xml' due to ANDROID_AAPT_IGNORE pattern '.*')
res/layout/main.xml:10: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:10: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

res/layout/main.xml:18: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:18: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

So, I know that I need the constraintlayout library to aapt command, but I don't know which file or files I need add and where I put this.

Summing up:

  1. Where I download the files that I need add?
  2. what the files I need add in the appt command?
  1. Where I download the files that I need add?

I can download the lib file now:

https://dl.google.com/dl/android/maven2/androidx/constraintlayout/constraintlayout/2.0.0-beta4/constraintlayout-2.0.0-beta4.aar

But I don't know where in the script I must add the constraintlayout-2.0.0-beta4.aar file yet.

  1. Where I download the files that I need add?

I think need make many things:

  1. Unzip the .aar lib file.

First I inspect the lib file:

# unzip -Z1 constraintlayout-2.0.0-beta4.aar

AndroidManifest.xml
R.txt
classes.jar
res/
res/values/
res/values/values.xml
values/

So, unzip this:

# unzip -d constraintlayout-2.0.0-beta4 constraintlayout-2.0.0-beta4.aar
  1. Merge the lib AndroidManifest.xml with app AndroidManifest.xml.

I did manually by now.

  1. Add the lib res/ in the aapt command to generate the R.java file right.

I changed the build script to add the res/ of the constraintlayout library:

echo "Generate ./build/gen/${ORG_DIRS}/R.java file..."
"${BUILD_TOOLS}/aapt" package --auto-add-overlay -f -m -J build/gen/ \
              -S res \
              -S "${ANDROIDX_LIBS}"/constraintlayout-2.0.0-beta4/res \
              -M AndroidManifest.xml -I "${PLATFORM}/android.jar"

and it seems to work, I don't get an error anymore.

  1. Add the classes.jar of the lib in the javac command.

I can compile with:

echo "Compiling the java files in ./build/obj/*.class..."
javac -bootclasspath "${JAVA_HOME}/jre/lib/rt.jar" \
      -classpath "${PLATFORM}/android.jar":"${ANDROIDX_LIBS}"/constraintlayout-2.0.0-beta4/classes.jar \
      -d build/obj \
      build/gen/"${ORG_DIRS}"/R.java \
      src/"${ORG_DIRS}"/EmbeddedCommonLisp.java \
      src/"${ORG_DIRS}"/HelloEclActivity.java

But I can't package the app. The error message:

# ...
Copying assets to APK...
Generate ./build/gen/ecl/android/skeleton/R.java file...
Compiling the java files in ./build/obj/*.class...
Creating ./build/apk/classes.dex...
Packaging ./build/ECLAndroidSkeleton.unsigned.apk...
res/layout/main.xml:11: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:11: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

res/layout/main.xml:19: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:19: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

When I change the main.xml file in the 4th line to:

xmlns:app="http://schemas.android.com/apk/ecl.android.skeleton"

I can create the apk, however when I test in my phone, its broken. The adb error:

03-24 09:41:05.420 19978 19978 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class androidx.constraintlayout.widget.ConstraintLayout

03-24 09:41:05.420 19978 19978 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.ConstraintLayout" on path: DexPathList[[zip file "/data/app/ecl.android.skeleton-2/base.apk"],nativeLibraryDirectories=[/data/app/ecl.android.skeleton-2/lib/arm, /data/app/ecl.android.skeleton-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]

03-24 09:41:05.420 19978 19978 E AndroidRuntime:    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

03-24 09:41:05.426  1796  2936 W ActivityManager:   Force finishing activity ecl.android.skeleton/.HelloEclActivity

So I add the libs in the dex step:

echo "Creating ./build/apk/classes.dex..."
"${BUILD_TOOLS}/dx" --dex --output=build/apk/classes.dex \
            "${ANDROIDX_LIBS}"/constraintlayout-solver-2.0.0-beta4.jar \
            "${ANDROIDX_LIBS}"/constraintlayout-2.0.0-beta4/classes.jar \
            build/obj/

I needed add the "constraintlayout-solver-2.0.0-beta4.jar" because before this error I get one error complaining this.

And I get other now:

03-25 10:20:01.401 12274 12274 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.R$styleable" on path: DexPathList[[zip file "/data/app/ecl.android.skeleton-2/base.apk"],nativeLibraryDirectories=[/data/app/ecl.android.skeleton-2/lib/arm, /data/app/ecl.android.skeleton-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]

I saw that the constraintlayout-solver-2.0.0-beta4.jar haven't the class androidx.constraintlayout.widget.R$styleable:

# unzip -Z1 constraintlayout-2.0.0-beta4/classes.jar

androidx/constraintlayout/helper/widget/Flow.class
androidx/constraintlayout/helper/widget/Layer.class
androidx/constraintlayout/motion/utils/ArcCurveFit$Arc.class
androidx/constraintlayout/motion/utils/ArcCurveFit.class
androidx/constraintlayout/motion/utils/CurveFit$Constant.class
androidx/constraintlayout/motion/utils/CurveFit.class
androidx/constraintlayout/motion/utils/Easing$CubicEasing.class
androidx/constraintlayout/motion/utils/Easing.class
androidx/constraintlayout/motion/utils/HyperSpline$Cubic.class
androidx/constraintlayout/motion/utils/HyperSpline.class
androidx/constraintlayout/motion/utils/LinearCurveFit.class
androidx/constraintlayout/motion/utils/MonotonicCurveFit.class
androidx/constraintlayout/motion/utils/Oscillator.class
androidx/constraintlayout/motion/utils/StopLogic.class
androidx/constraintlayout/motion/utils/VelocityMatrix.class
androidx/constraintlayout/motion/widget/Animatable.class
androidx/constraintlayout/motion/widget/CustomFloatAttributes.class
androidx/constraintlayout/motion/widget/Debug.class
androidx/constraintlayout/motion/widget/DesignTool.class
androidx/constraintlayout/motion/widget/Key.class
androidx/constraintlayout/motion/widget/KeyAttributes$Loader.class
androidx/constraintlayout/motion/widget/KeyAttributes.class
androidx/constraintlayout/motion/widget/KeyCache.class
androidx/constraintlayout/motion/widget/KeyCycle$Loader.class
androidx/constraintlayout/motion/widget/KeyCycle.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$1.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$AlphaSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$CustomSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$CycleOscillator.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ElevationSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$IntDoubleSort.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$IntFloatFloatSort.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$PathRotateSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ProgressSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$RotationSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$RotationXset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$RotationYset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ScaleXset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ScaleYset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$TranslationXset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$TranslationYset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$TranslationZset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$WavePoint.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator.class
androidx/constraintlayout/motion/widget/KeyFrames.class
androidx/constraintlayout/motion/widget/KeyPosition$Loader.class
androidx/constraintlayout/motion/widget/KeyPosition.class
androidx/constraintlayout/motion/widget/KeyPositionBase.class
androidx/constraintlayout/motion/widget/KeyTimeCycle$Loader.class
androidx/constraintlayout/motion/widget/KeyTimeCycle.class
androidx/constraintlayout/motion/widget/KeyTrigger$Loader.class
androidx/constraintlayout/motion/widget/KeyTrigger.class
androidx/constraintlayout/motion/widget/MotionConstrainedPoint.class
androidx/constraintlayout/motion/widget/MotionController.class
androidx/constraintlayout/motion/widget/MotionHelper.class
androidx/constraintlayout/motion/widget/MotionInterpolator.class
androidx/constraintlayout/motion/widget/MotionLayout$DecelerateInterpolator.class
androidx/constraintlayout/motion/widget/MotionLayout$DevModeDraw.class
androidx/constraintlayout/motion/widget/MotionLayout$Model.class
androidx/constraintlayout/motion/widget/MotionLayout$MotionTracker.class
androidx/constraintlayout/motion/widget/MotionLayout$MyTracker.class
androidx/constraintlayout/motion/widget/MotionLayout$TransitionListener.class
androidx/constraintlayout/motion/widget/MotionLayout.class
androidx/constraintlayout/motion/widget/MotionPaths.class
androidx/constraintlayout/motion/widget/MotionScene$1.class
androidx/constraintlayout/motion/widget/MotionScene$Transition$TransitionOnClick.class
androidx/constraintlayout/motion/widget/MotionScene$Transition.class
androidx/constraintlayout/motion/widget/MotionScene.class
androidx/constraintlayout/motion/widget/ProxyInterface.class
androidx/constraintlayout/motion/widget/SplineSet$AlphaSet.class
androidx/constraintlayout/motion/widget/SplineSet$CustomSet.class
androidx/constraintlayout/motion/widget/SplineSet$ElevationSet.class
androidx/constraintlayout/motion/widget/SplineSet$PathRotate.class
androidx/constraintlayout/motion/widget/SplineSet$ProgressSet.class
androidx/constraintlayout/motion/widget/SplineSet$RotationSet.class
androidx/constraintlayout/motion/widget/SplineSet$RotationXset.class
androidx/constraintlayout/motion/widget/SplineSet$RotationYset.class
androidx/constraintlayout/motion/widget/SplineSet$ScaleXset.class
androidx/constraintlayout/motion/widget/SplineSet$ScaleYset.class
androidx/constraintlayout/motion/widget/SplineSet$Sort.class
androidx/constraintlayout/motion/widget/SplineSet$TranslationXset.class
androidx/constraintlayout/motion/widget/SplineSet$TranslationYset.class
androidx/constraintlayout/motion/widget/SplineSet$TranslationZset.class
androidx/constraintlayout/motion/widget/SplineSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$AlphaSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$CustomSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ElevationSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$PathRotate.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ProgressSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$RotationSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$RotationXset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$RotationYset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ScaleXset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ScaleYset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$Sort.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$TranslationXset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$TranslationYset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$TranslationZset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet.class
androidx/constraintlayout/motion/widget/TouchResponse$1.class
androidx/constraintlayout/motion/widget/TouchResponse$2.class
androidx/constraintlayout/motion/widget/TouchResponse.class
androidx/constraintlayout/motion/widget/TransitionAdapter.class
androidx/constraintlayout/motion/widget/TransitionBuilder.class
androidx/constraintlayout/utils/widget/ImageFilterButton$1.class
androidx/constraintlayout/utils/widget/ImageFilterButton$2.class
androidx/constraintlayout/utils/widget/ImageFilterButton.class
androidx/constraintlayout/utils/widget/ImageFilterView$1.class
androidx/constraintlayout/utils/widget/ImageFilterView$2.class
androidx/constraintlayout/utils/widget/ImageFilterView$ImageMatrix.class
androidx/constraintlayout/utils/widget/ImageFilterView.class
androidx/constraintlayout/utils/widget/MockView.class
androidx/constraintlayout/utils/widget/MotionTelltales.class
androidx/constraintlayout/widget/Barrier.class
androidx/constraintlayout/widget/ConstraintAttribute$1.class
androidx/constraintlayout/widget/ConstraintAttribute$AttributeType.class
androidx/constraintlayout/widget/ConstraintAttribute.class
androidx/constraintlayout/widget/ConstraintHelper.class
androidx/constraintlayout/widget/ConstraintLayout$1.class
androidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table.class
androidx/constraintlayout/widget/ConstraintLayout$LayoutParams.class
androidx/constraintlayout/widget/ConstraintLayout$Measurer.class
androidx/constraintlayout/widget/ConstraintLayout.class
androidx/constraintlayout/widget/ConstraintLayoutStates$State.class
androidx/constraintlayout/widget/ConstraintLayoutStates$Variant.class
androidx/constraintlayout/widget/ConstraintLayoutStates.class
androidx/constraintlayout/widget/ConstraintProperties.class
androidx/constraintlayout/widget/ConstraintSet$Constraint.class
androidx/constraintlayout/widget/ConstraintSet$Layout.class
androidx/constraintlayout/widget/ConstraintSet$Motion.class
androidx/constraintlayout/widget/ConstraintSet$PropertySet.class
androidx/constraintlayout/widget/ConstraintSet$Transform.class
androidx/constraintlayout/widget/ConstraintSet.class
androidx/constraintlayout/widget/Constraints$LayoutParams.class
androidx/constraintlayout/widget/Constraints.class
androidx/constraintlayout/widget/ConstraintsChangedListener.class
androidx/constraintlayout/widget/Group.class
androidx/constraintlayout/widget/Guideline.class
androidx/constraintlayout/widget/Placeholder.class
androidx/constraintlayout/widget/StateSet$State.class
androidx/constraintlayout/widget/StateSet$Variant.class
androidx/constraintlayout/widget/StateSet.class
androidx/constraintlayout/widget/VirtualLayout.class

So, I don't know now, I think need generate the androidx.constraintlayout.widget.R$styleable of someway.

like image 864
PerduGames Avatar asked Oct 26 '25 06:10

PerduGames


1 Answers

I got it. Gradle doens't bite me yet! My compilation continue in seconds without this. And I understand all process to add a library.

So, the full script:

echo "Setting environment variables..."
SDK="${HOME}/Programs/Android"
BUILD_TOOLS="${SDK}/build-tools/29.0.2"
PLATFORM="${SDK}/platforms/android-23"
ANDROID_API=23
APK_NAME="ECLAndroidSkeleton"
PACKAGE_NAME="ecl.android.skeleton"
ORG_DIRS="${PACKAGE_NAME//./\/}"
NDK="${SDK}/ndk-bundle"
ANDROID_TOOLCHAIN="${NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi23-clang"
ECL="${HOME}/Programs/ecl"
ECL_ANDROID_DIR="${ECL}/ecl-armv7a-linux-androideabi"
ECL_LIB_DIR="${ECL_ANDROID_DIR}/lib/ecl-16.1.3"
KEY_PASS="android123"
ANDROIDX_LIBS="${SDK}/androidx/"

echo "Cleaning build directories..."
rm -rf build/gen build/obj build/apk  

echo "Creating build directories..."
mkdir -p build/gen build/obj build/apk build/apk/lib/armeabi-v7a

if [ ! -f keystore.jks ] || [ "$1" == "key" ]; then
  if [ -f keystore.jks ]; then
    echo "Deleting ./keystore.jks..."
    rm -rf keystore.jks
  fi
  echo "Generating new ./keystore.jks..."  
  keytool -genkeypair -keystore keystore.jks -alias androidkey \
      -validity 10000 -keyalg RSA -keysize 2048
  if [ "$1" == "key" ]; then exit 0; fi
fi

echo "Compiling C code..."
${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libhelloecl.so \
             -DANDROID -llog \
             -I"${ECL_ANDROID_DIR}"/include \
             jni/ecl_boot.c \
             jni/ecl_thread.c \
             jni/org_lisp_ecl_EmbeddedCommonLisp.c \
             "${ECL_ANDROID_DIR}"/lib/libecl.so

${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libandroidlog.so \
             -DANDROID -llog \
             jni/android_log.c

echo "Copying ${ECL_ANDROID_DIR}/lib/libecl.so to ./build/apk/lib/armeabi-v7a/..." 
cp "${ECL_ANDROID_DIR}"/lib/libecl.so ./build/apk/lib/armeabi-v7a/

echo "Copying assets to APK..."
MODULES_DIR=./assets/lisp/lib
rm -rf "${MODULES_DIR}"
mkdir -p "${MODULES_DIR}"
cp "${ECL_LIB_DIR}"/help.doc "${MODULES_DIR}"
cp "${ECL_LIB_DIR}"/asdf.fas "${MODULES_DIR}"
#cp "${ECL_LIB_DIR}"/encodings/* "${MODULES_DIR}"
unzip -qq -o ./libs/lisp.zip -d "${MODULES_DIR}"
"${NDK}"/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip "${MODULES_DIR}"/*.fas
cp -r ./assets/ ./build/apk/

echo "Generate ./build/gen/${ORG_DIRS}/R.java file..."
"${BUILD_TOOLS}/aapt" package --auto-add-overlay -f -m -J build/gen/ \
              -S res/ \
              -M AndroidManifest.xml -I "${PLATFORM}/android.jar"

echo "Generate androidx lib R.java files..."
"${BUILD_TOOLS}/aapt" package -f -m -J build/gen/ \
              -S "${ANDROIDX_LIBS}"/constraintlayout-1.1.3/res/ \
              -M "${ANDROIDX_LIBS}"/constraintlayout-1.1.3/AndroidManifest.xml -I "${PLATFORM}/android.jar"

echo "Compiling the java files in ./build/obj/*.class..."
javac -bootclasspath "${JAVA_HOME}/jre/lib/rt.jar" \
      -classpath "${PLATFORM}/android.jar":"${ANDROIDX_LIBS}"/constraintlayout-1.1.3/classes.jar:"${ANDROIDX_LIBS}"/constraintlayout-solver-1.1.3.jar \
      -d build/obj \
      build/gen/"${ORG_DIRS}"/R.java \
      build/gen/androidx/constraintlayout/widget/R.java \
      src/"${ORG_DIRS}"/EmbeddedCommonLisp.java \
      src/"${ORG_DIRS}"/HelloEclActivity.java 

echo "Creating ./build/apk/classes.dex..."
"${BUILD_TOOLS}/dx" --dex --output=build/apk/classes.dex \
            "${ANDROIDX_LIBS}"/constraintlayout-solver-1.1.3.jar \
            "${ANDROIDX_LIBS}"/constraintlayout-1.1.3/classes.jar \
            build/obj/

echo "Packaging ./build/${APK_NAME}.unsigned.apk..."
"${BUILD_TOOLS}/aapt" package -f -M AndroidManifest.xml \
              -S res/ \
              -I "${PLATFORM}/android.jar" \
              -F build/"${APK_NAME}".unsigned.apk build/apk/

echo "Zipaligning unsigned APK to ./build/${APK_NAME}.aligned.apk..."
"${BUILD_TOOLS}/zipalign" -f -p 4 \
      build/"${APK_NAME}".unsigned.apk build/"${APK_NAME}".aligned.apk

echo "Signing aligned APK to ./build/${APK_NAME}.apk..."
if [[ -n "${KEY_PASS}" ]]; then
    "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
                   --ks-key-alias androidkey \
                   --ks-pass pass:"${KEY_PASS}" \
                   --key-pass pass:"${KEY_PASS}" \
                   --out build/"${APK_NAME}".apk \
                   build/"${APK_NAME}".aligned.apk
else
    "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
               --ks-key-alias androidkey \
               --out build/"${APK_NAME}".apk \
               build/"${APK_NAME}".aligned.apk
fi

echo "Clean lisp libs because ASDF..."
rm -r assets/lisp/lib/*
rm -r build/apk/assets/lisp/lib/*

echo "Testing APK..."
"${SDK}/platform-tools/adb" install -r build/"${APK_NAME}".apk
"${SDK}/platform-tools/adb" shell am start --activity-clear-top -n "${PACKAGE_NAME}"/.HelloEclActivity

What was wrong?

I was adding in the apk R.java file the res/ of the constraintlayout library, being that I need compile the lib R.java file separated. So, compile the all R.java files with javac add all .class files in the dex command. And works.

like image 143
PerduGames Avatar answered Oct 28 '25 20:10

PerduGames



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!