2016-12-21 4 views
0

Я хотел бы знать, как запустить ProGuard из командной строки.Использование ProGuard WITHOUT Android Studio

Я построил гибридное приложение, использующее Кордову с ионной структурой. Одна из рекомендаций, сделанных мне, заключалась в использовании ProGuard для обфускации кода Java и удаления вызовов журнала.

В настоящее время я не использую Android Studio или Eclipse, у меня просто есть проект, созданный в Ionic Framework и Angular 1.X с плагинами Cordova, которые мне нужны для работы на устройствах. У меня есть Jenkins для создания моих выпусков через командную строку.

Я пытался следовать инструкциям, изложенным здесь: https://developer.android.com/studio/build/shrink-code.html#keep-code и здесь: Disable LogCat Output COMPLETELY in release Android app?

Как расчесывать через различные вопросы/ответы, чтобы найти применимые биты.

My build.gradle хранится в каталоге ./vendor и скопирован для перезаписывания автогенерированного/default build.gradle из Ionic. имеет это для благоприятной ProGuard:

buildTypes { 
     debug { 
      debuggable true 
      minifyEnabled false 
     } 

     release { 
      signingConfig signingConfigs.release 
      debuggable false 
      minifyEnabled true 
      runProguard true 
      proguardFile 'customProGuard.txt' 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
       'proguard-android.txt' 
     } 
    } 

Я также пробовал различные версии этой строки в моем файле project.properties: proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt или proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

Это, кажется, не делать ничего. Я думал, что размер файла apk изменился в какой-то момент, но когда я смотрю на классы в JD-GUI, я все еще могу четко различать вещи. Поэтому я не думаю, что он работает. Любая помощь будет оценена по достоинству.

Дженкинс выполняет следующие команды:

cp -R vendor/build.gradle platforms/android/build.gradle 
ionic resources 
ionic prepare android 
ionic build android --release 
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $KEYSTORE platforms/android/build/outputs/apk/android-release-unsigned.apk 
-keypass $KEY_PASSWORD -storepass $KEYSTORE_PASSWORD $ALIAS && \ ./zipalign -v 4 platforms/android/build/outputs/apk/android-release-unsigned.apk "build/appNameHere.apk" 

В то время как «ионная сборка андроида --release» в конечном счете вызывает ./platforms/android/cordova/lib/builders/GradleBuilder.js, который имеет несколько линий, ссылающихся строить. Gradle, но я думаю, что главное наиболее важным из которых является var buildGradle = fs.readFileSync(path.join(this.root, 'build.gradle'), 'utf8');, в котором он читает в файле для использования с GradleBuilder.build:

GradleBuilder.prototype.build = function(opts) { 
    var wrapper = path.join(this.root, 'gradlew'); 
    var args = this.getArgs(opts.buildType == 'debug' ? 'debug' : 'release', opts); 
    return Q().then(function() { 
     return spawn(wrapper, args, {stdio: 'inherit'}); 
    }); 
}; 
+0

Можете ли вы предоставить команду градиента, которую выполняет Дженкинс, и некоторые из результатов? –

+0

@StefanCrain: Я добавил команды, которые использует Дженкинс, а также то, как я считаю, что он связан с Gradle. Что касается выхода, я не был уверен, что уместно? 'JAVA_HOME =/Library/Java/JavaVirtualMachines/jdk1.7.0_79.JDK/Содержание/Главная : preBuild : preReleaseBuild : checkReleaseManifest : CordovaLib: compileLint : CordovaLib: copyReleaseLint UP-TO-DATE : CordovaLib: mergeReleaseProguardFiles UP-TO-date' и т.д ... 'BUILD УСПЕШНЫЙ Общее время: 12.435 secs Построено следующее apk (s): 'finally' jar подписан. Проверка выравнивания build/appNameHere.apk (4) ... 50 META-INF/MANIFEST.MF (OK - сжатый) ' –

ответ

0

После долгих проб и ошибок, ответ оказался, что мне нужен этот блок кода, который будет расположен в другом сегменте nt моего файла build.gradle.

release { 
     signingConfig signingConfigs.release 
     debuggable false 
     minifyEnabled true 
     proguardFile 'customProGuard.txt' 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 
      'proguard-android.txt' 
    } 

Как бы то ни было, его никогда не достигали. Помещая его в блок android { }, но не в каких-либо других функциях или операциях if, он последовательно работает и ведет себя так, как ожидалось.

К сожалению, из-за того, как Ionic использует отражение, я не могу извлечь из него много обфускации (Apache Jira Bug). ProGuard все еще можно использовать для удаления журналов консоли в соответствии с связанной статьей выше.

Смежные вопросы