diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 34af9b324..dc426afd2 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -18,8 +18,8 @@ jobs: - name: Setup Java uses: actions/setup-java@v3.11.0 with: - java-version: 11 - distribution: 'adopt' + java-version: 17 + distribution: 'temurin' - name: Build & Test run: ./gradlew build test @@ -42,8 +42,8 @@ jobs: - name: Set up JDK uses: actions/setup-java@v3.11.0 with: - java-version: 11 - distribution: 'adopt' + java-version: 17 + distribution: 'temurin' - name: Instrumentation Tests uses: reactivecircus/android-emulator-runner@v2 @@ -79,8 +79,8 @@ jobs: - name: Configure JDK uses: actions/setup-java@v3.11.0 with: - java-version: 11 - distribution: 'adopt' + java-version: 17 + distribution: 'temurin' - name: Upload Snapshot run: ./gradlew publish diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 13c48b3db..8b3f634d3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,8 +15,8 @@ jobs: - name: Configure JDK uses: actions/setup-java@v3.11.0 with: - java-version: 11 - distribution: 'adopt' + java-version: 17 + distribution: 'temurin' - name: Set Release Version Name run: sed -e s/-SNAPSHOT//g -i gradle.properties; diff --git a/README.md b/README.md index 88f70b67b..190a7afe2 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,19 @@ Reading JPX Images Android does not come with native support for handling JPX images. These images can be read using the [JP2Android library](https://github.com/ThalesGroup/JP2ForAndroid). As JPX is not a common image format, this library is not included with PdfBox-Android by default. If the JP2Android library is not on the classpath of your application, JPX images will be ignored and a warning will be logged. -To include the JP2Android library in your own application, either build it from its [source repository](https://github.com/ThalesGroup/JP2ForAndroid) or copy the prebuilt AAR vendored in this repository (`sample/libs/jp2-android-1.0.3.aar`) and reference it as a file dependency: -```gradle +To include the JP2Android library with 16 KB page-size alignment in your own application, add the Maven Central dependency: +```kotlin +dependencies { + implementation("dev.keiji.jp2:jp2-android:1.0.5") +} +``` +Or in Groovy DSL: +```groovy dependencies { - implementation files('libs/jp2-android-1.0.3.aar') + implementation 'dev.keiji.jp2:jp2-android:1.0.5' } ``` -Note: the library was originally distributed through JCenter, which no longer hosts the artifact. The vendored copy is unmodified and is licensed under the BSD 2-Clause license (Copyright (c) 2018 Gemalto s.r.o., see the [upstream repository](https://github.com/ThalesGroup/JP2ForAndroid) for the full license text). +Note: `dev.keiji.jp2:jp2-android` is distributed through Maven Central and includes 16 KB page-size aligned ELF LOAD segments for modern Android (Android 15+) compatibility. Important notes ============== diff --git a/build.gradle b/build.gradle deleted file mode 100644 index bed855e79..000000000 --- a/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -defaultTasks 'clean','build','connectedCheck' - -buildscript { - repositories { - mavenCentral() - google() - jcenter() // jp2-android - } - dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' - } -} - -allprojects { - version = VERSION_NAME - - repositories { -// Enable downloading snapshot versions -// maven { url "https://s01.oss.sonatype.org/content/repositories/snapshots/" } - mavenCentral() - google() - jcenter() - } - -// Show more warnings if desired -// gradle.projectsEvaluated { -// tasks.withType(JavaCompile) { -// options.encoding = 'UTF-8' -// options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" -// } -// } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..31abd800d --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false +} + +allprojects { + version = project.findProperty("VERSION_NAME") as String? ?: "2.0.37.0-SNAPSHOT" +} diff --git a/gradle.properties b/gradle.properties index 7290e4ddf..0734d19cc 100755 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,10 @@ org.gradle.parallel=true VERSION_NAME=2.0.37.0-SNAPSHOT VERSION_CODE=1 -ANDROID_BUILD_MIN_SDK_VERSION=14 -ANDROID_BUILD_TARGET_SDK_VERSION=33 -ANDROID_BUILD_SDK_VERSION=33 +ANDROID_BUILD_MIN_SDK_VERSION=21 +ANDROID_BUILD_TARGET_SDK_VERSION=36 +ANDROID_BUILD_SDK_VERSION=36 android.useAndroidX=true +android.nonTransitiveRClass=true +android.suppressUnsupportedCompileSdk=36 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..468e40488 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,24 @@ +[versions] +agp = "8.7.3" +bouncycastle = "1.85" +appcompat = "1.7.0" +junit = "4.13.2" +mockito = "5.12.0" +diffutils = "1.3.0" +testRunner = "1.6.2" +jp2Android = "1.0.5" + +[libraries] +bouncycastle-bcprov = { module = "org.bouncycastle:bcprov-jdk15to18", version.ref = "bouncycastle" } +bouncycastle-bcpkix = { module = "org.bouncycastle:bcpkix-jdk15to18", version.ref = "bouncycastle" } +bouncycastle-bcutil = { module = "org.bouncycastle:bcutil-jdk15to18", version.ref = "bouncycastle" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +jp2-android = { module = "dev.keiji.jp2:jp2-android", version.ref = "jp2Android" } +junit = { module = "junit:junit", version.ref = "junit" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } +java-diffutils = { module = "com.googlecode.java-diff-utils:diffutils", version.ref = "diffutils" } +androidx-test-runner = { module = "androidx.test:runner", version.ref = "testRunner" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7e62b17ac..709dee457 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/library/build.gradle b/library/build.gradle deleted file mode 100644 index 07604f197..000000000 --- a/library/build.gradle +++ /dev/null @@ -1,109 +0,0 @@ -plugins { - id 'com.android.library' -} - -ext { - PUBLISH_GROUP_ID = 'com.tom-roush' - PUBLISH_ARTIFACT_ID = 'pdfbox-android' - PUBLISH_VERSION = VERSION_NAME -} - -android { - compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) - compileOptions.encoding = 'UTF-8' - - defaultConfig { - testInstrumentationRunnerArguments notAnnotation: 'androidx.test.filters.FlakyTest' - minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION) - targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles 'consumer-proguard-rules.txt' - } - - buildTypes { - release { - minifyEnabled false - } - } - - - testOptions { - unitTests.returnDefaultValues = true - } - - sourceSets { - test { - resources.srcDirs = ['src/main/assets', 'src/test/resources'] - } - androidTest { - assets.srcDirs = ['src/test/resources'] - } - } - lint { - abortOnError false - } - namespace 'com.tom_roush.pdfbox' - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - // Rename the output aars - android.libraryVariants.all { variant -> - variant.outputs.all { output -> - if (outputFileName.endsWith('.aar')) { - outputFileName = "pdfbox-android-${variant.name}-${defaultConfig.versionName}.aar" - } - } - } -} - -// Test output from https://stackoverflow.com/questions/3963708/gradle-how-to-display-test-results-in-the-console-in-real-time -import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.gradle.api.tasks.testing.logging.TestLogEvent - -tasks.withType(Test) { - // Performance improvements for tests - maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 - reports.html.enabled = false - reports.junitXml.enabled = false - - testLogging { - // set options for log level LIFECYCLE - events TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED, TestLogEvent.STANDARD_OUT, TestLogEvent.STANDARD_ERROR - showExceptions true - exceptionFormat TestExceptionFormat.FULL - showCauses true - showStackTraces true - - info.events = debug.events - info.exceptionFormat = debug.exceptionFormat - - afterSuite { desc, result -> - if (!desc.parent) { // will match the outermost suite - def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)" - def startItem = '| ', endItem = ' |' - def repeatLength = startItem.length() + output.length() + endItem.length() - println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength)) - } - } - } -} - -dependencies { - api "org.bouncycastle:bcprov-jdk15to18:1.85" - api "org.bouncycastle:bcpkix-jdk15to18:1.85" - api "org.bouncycastle:bcutil-jdk15to18:1.85" - // for jpeg2000 decode/encode - compileOnly files('libs/jp2-android-1.0.3.aar') - - // Test dependencies - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-core:5.8.0' - testImplementation 'com.googlecode.java-diff-utils:diffutils:1.3.0' - - androidTestImplementation 'androidx.test:runner:1.5.1' -} - -apply from: 'maven-publish.gradle' diff --git a/library/build.gradle.kts b/library/build.gradle.kts new file mode 100644 index 000000000..eca85e6e5 --- /dev/null +++ b/library/build.gradle.kts @@ -0,0 +1,165 @@ +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.gradle.api.tasks.testing.logging.TestLogEvent + +plugins { + alias(libs.plugins.android.library) + `maven-publish` + signing +} + +val minSdkProp: String by project +val compileSdkProp: String by project +val versionNameProp = project.findProperty("VERSION_NAME") as String? ?: "2.0.37.0-SNAPSHOT" + +android { + namespace = "com.tom_roush.pdfbox" + compileSdk = (project.findProperty("ANDROID_BUILD_SDK_VERSION") as String?)?.toInt() ?: 37 + + defaultConfig { + minSdk = (project.findProperty("ANDROID_BUILD_MIN_SDK_VERSION") as String?)?.toInt() ?: 21 + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["notAnnotation"] = "androidx.test.filters.FlakyTest" + consumerProguardFiles("consumer-proguard-rules.txt") + } + + buildTypes { + release { + isMinifyEnabled = false + } + } + + testOptions { + unitTests.isReturnDefaultValues = true + } + + sourceSets { + getByName("test") { + resources.srcDirs("src/main/assets", "src/test/resources") + } + getByName("androidTest") { + assets.srcDirs("src/test/resources") + } + } + + lint { + abortOnError = false + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + encoding = "UTF-8" + } + + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } +} + +tasks.withType { + maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1) + + testLogging { + events( + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.FAILED, + TestLogEvent.STANDARD_OUT, + TestLogEvent.STANDARD_ERROR + ) + showExceptions = true + exceptionFormat = TestExceptionFormat.FULL + showCauses = true + showStackTraces = true + + afterSuite(KotlinClosure2({ desc, result -> + if (desc.parent == null) { + val output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)" + val startItem = "| " + val endItem = " |" + val repeatLength = startItem.length + output.length + endItem.length + println("\n" + ("-".repeat(repeatLength)) + "\n" + startItem + output + endItem + "\n" + ("-".repeat(repeatLength))) + } + })) + } +} + +dependencies { + api(libs.bouncycastle.bcprov) + api(libs.bouncycastle.bcpkix) + api(libs.bouncycastle.bcutil) + + // for jpeg2000 decode/encode + compileOnly(libs.jp2.android) + + // Test dependencies + testImplementation(libs.junit) + testImplementation(libs.mockito.core) + testImplementation(libs.java.diffutils) + + androidTestImplementation(libs.androidx.test.runner) +} + +afterEvaluate { + publishing { + publications { + create("release") { + from(components["release"]) + groupId = "com.tom-roush" + artifactId = "pdfbox-android" + version = versionNameProp + + pom { + name.set("PdfBox-Android") + description.set("The Apache PdfBox project ported to work on Android") + url.set("https://github.com/TomRoush/PdfBox-Android") + licenses { + license { + name.set("The Apache Software License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + developers { + developer { + name.set("Tom Roush") + email.set("tom@tom-roush.com") + organization.set("PdfBox-Android Developers") + organizationUrl.set("https://github.com/TomRoush/PdfBox-Android") + } + } + scm { + connection.set("scm:git:git@github.com:TomRoush/PdfBox-Android.git") + developerConnection.set("scm:git:ssh@github.com:TomRoush/PdfBox-Android.git") + url.set("https://github.com/TomRoush/PdfBox-Android") + } + } + } + } + repositories { + maven { + val isReleaseVersion = !versionNameProp.endsWith("SNAPSHOT") + val releaseRepo = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" + val snapshotRepo = "https://s01.oss.sonatype.org/content/repositories/snapshots/" + url = uri(if (isReleaseVersion) releaseRepo else snapshotRepo) + credentials { + username = project.findProperty("ossrhUsername") as String? ?: System.getenv("OSSRH_USERNAME") + password = project.findProperty("ossrhPassword") as String? ?: System.getenv("OSSRH_PASSWORD") + } + } + } + } + + signing { + val signingKeyId = project.findProperty("signingKeyId") as String? + val signingKey = project.findProperty("signingKey") as String? + val signingPassword = project.findProperty("signingPassword") as String? + if (!signingKey.isNullOrEmpty()) { + useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) + sign(publishing.publications["release"]) + } + } +} diff --git a/library/libs/jp2-android-1.0.3.aar b/library/libs/jp2-android-1.0.3.aar deleted file mode 100644 index 6c0bebbc4..000000000 Binary files a/library/libs/jp2-android-1.0.3.aar and /dev/null differ diff --git a/library/maven-publish.gradle b/library/maven-publish.gradle deleted file mode 100644 index c34745ba3..000000000 --- a/library/maven-publish.gradle +++ /dev/null @@ -1,117 +0,0 @@ -apply plugin: 'maven-publish' -apply plugin: 'signing' - -ext.isReleaseVersion = !version.endsWith("SNAPSHOT") - -task androidJavadocs(type: Javadoc) { - failOnError false - source = android.sourceSets.main.java.sourceFiles - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - - // disable the crazy super-strict doclint tool in Java 8 - if (JavaVersion.current().isJava8Compatible()) { - options.addStringOption('Xdoclint:none', '-quiet') - } - if (JavaVersion.current().isJava9Compatible()) { - options.addBooleanOption('html5', true) - } - - options.encoding = "UTF-8" - options.docTitle("PdfBox-Android") - options.links("https://docs.oracle.com/en/java/javase/11/docs/api") - options.links("https://developer.android.com/reference/") - - exclude '**/BuildConfig.java' - exclude '**/R.java' -} - -afterEvaluate { - androidJavadocs.classpath += files(android.libraryVariants.collect { variant -> - variant.javaCompileProvider.get().classpath.files - }) -} - -task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { - archiveClassifier.set('javadoc') - from androidJavadocs.destinationDir -} - -task androidSourcesJar(type: Jar) { - archiveClassifier.set('sources') - from android.sourceSets.main.java.srcDirs -} - -def pomConfig = { - url "https://github.com/TomRoush/PdfBox-Android" - licenses { - license { - name "The Apache Software License, Version 2.0" - url "http://www.apache.org/licenses/LICENSE-2.0.txt" - distribution "repo" - } - } - developers { - developer { - name "Tom Roush" - email "tom@tom-roush.com" - organization "PdfBox-Android Developers" - organizationUrl "https://github.com/TomRoush/PdfBox-Android" - } - } - scm { - connection "scm:git:git@github.com:TomRoush/PdfBox-Android.git" - developerConnection "scm:git:ssh@github.com:TomRoush/PdfBox-Android.git" - url "https://github.com/TomRoush/PdfBox-Android" - } -} - -project.afterEvaluate { - publishing { - repositories { - maven { - def releaseRepo = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" - def snapshotRepo = "https://s01.oss.sonatype.org/content/repositories/snapshots/" - url = isReleaseVersion ? releaseRepo : snapshotRepo - credentials { - username = project.hasProperty('ossrhUsername') ? ossrhUsername : System.getenv('OSSRH_USERNAME') - password = project.hasProperty('ossrhPassword') ? ossrhPassword : System.getenv('OSSRH_PASSWORD') - } - } - } - publications { - maven(MavenPublication) { - artifact bundleReleaseAar - artifact androidJavadocsJar - artifact androidSourcesJar - - groupId project.PUBLISH_GROUP_ID - artifactId project.PUBLISH_ARTIFACT_ID - version project.PUBLISH_VERSION - - pom.withXml { - def root = asNode() - root.appendNode('name', 'PdfBox-Android') - root.appendNode('description', 'The Apache PdfBox project ported to work on Android') - root.children().last() + pomConfig - - // Manually add all the pom nodes for dependencies - def dependenciesNode = asNode().appendNode('dependencies') - configurations.api.allDependencies.each { - def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.group) - dependencyNode.appendNode('artifactId', it.name) - dependencyNode.appendNode('version', it.version) - } - } - } - } - } - - signing { - def signingKeyId = findProperty("signingKeyId") - def signingKey = findProperty("signingKey") - def signingPassword = findProperty("signingPassword") - useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) - sign publishing.publications.maven - } -} diff --git a/sample/build.gradle b/sample/build.gradle deleted file mode 100644 index 76b160bf6..000000000 --- a/sample/build.gradle +++ /dev/null @@ -1,51 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) - - defaultConfig { - applicationId 'com.tom_roush.pdfbox.sample' - minSdkVersion 14 - targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) - versionName project.VERSION_NAME - versionCode Integer.parseInt(project.VERSION_CODE) - multiDexEnabled true - } - - buildTypes { - release { - minifyEnabled false - } - } - - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - lint { - abortOnError false - } - namespace 'com.tom_roush.pdfbox.sample' -} - -// BouncyCastle 1.85 packaging bug: bcprov and bcutil both ship the same -// org.bouncycastle.asn1.iana.* classes, causing checkDuplicateClasses to fail. -// bcprov already contains all those classes, so we exclude bcutil from all -// configurations. bcpkix (which needs bcutil APIs) still works because bcprov -// provides the overlapping class definitions at runtime. -configurations.all { - exclude group: 'org.bouncycastle', module: 'bcutil-jdk15to18' -} - -dependencies { - implementation project(':library') -// implementation "com.tom-roush:pdfbox-android:${project.VERSION_NAME}" - implementation "androidx.multidex:multidex:2.0.1" - implementation 'androidx.appcompat:appcompat:1.6.1' - - // Optional dependencies - - // Read JPX images - implementation files('libs/jp2-android-1.0.3.aar') -} diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts new file mode 100644 index 000000000..96565084f --- /dev/null +++ b/sample/build.gradle.kts @@ -0,0 +1,57 @@ +plugins { + alias(libs.plugins.android.application) +} + +val versionNameProp = project.findProperty("VERSION_NAME") as String? ?: "2.0.37.0-SNAPSHOT" +val versionCodeProp = (project.findProperty("VERSION_CODE") as String?)?.toInt() ?: 1 + +android { + namespace = "com.tom_roush.pdfbox.sample" + compileSdk = (project.findProperty("ANDROID_BUILD_SDK_VERSION") as String?)?.toInt() ?: 37 + + defaultConfig { + applicationId = "com.tom_roush.pdfbox.sample" + minSdk = (project.findProperty("ANDROID_BUILD_MIN_SDK_VERSION") as String?)?.toInt() ?: 21 + targetSdk = (project.findProperty("ANDROID_BUILD_TARGET_SDK_VERSION") as String?)?.toInt() ?: 37 + versionName = versionNameProp + versionCode = versionCodeProp + } + + buildTypes { + release { + isMinifyEnabled = false + signingConfig = signingConfigs.getByName("debug") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + packaging { + jniLibs { + useLegacyPackaging = false + } + } + + lint { + abortOnError = false + } +} + +// BouncyCastle 1.85 packaging bug: bcprov and bcutil both ship the same +// org.bouncycastle.asn1.iana.* classes, causing checkDuplicateClasses to fail. +configurations.all { + exclude(group = "org.bouncycastle", module = "bcutil-jdk15to18") + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7") + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8") +} + +dependencies { + implementation(project(":library")) + implementation(libs.androidx.appcompat) + + // Read JPX images + implementation(libs.jp2.android) +} diff --git a/sample/libs/jp2-android-1.0.3.aar b/sample/libs/jp2-android-1.0.3.aar deleted file mode 100644 index 6c0bebbc4..000000000 Binary files a/sample/libs/jp2-android-1.0.3.aar and /dev/null differ diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 0200eceb4..64cab2a1e 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -2,7 +2,6 @@