PerduGames
PerduGames

Reputation: 1228

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.

Upvotes: 4

Views: 624

Answers (1)

PerduGames
PerduGames

Reputation: 1228

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.

Upvotes: 3

Related Questions