ARSCLib
V1.3.5
ห้องสมุดนี้ได้รับการพัฒนาตามโครงสร้าง AOSP ของ AndroIDFW/ResourceTypes.h เพื่อแทนที่ AAPT/AAPT2 โดยสิ้นเชิง
1- การถอดรหัสทรัพยากรไปยัง XML ต้องการชื่อแหล่งที่มาทั้งหมดควรไม่ถูกตรวจสอบและถูกต้อง
2- ผู้ใช้ LIB นี้ถือว่ามีความรู้ที่ดีเกี่ยวกับไวยากรณ์ XML แหล่งที่มาของ Android ดังนั้นในระหว่างการเข้ารหัส/การสร้างมันไม่ได้ตรวจสอบหรือโยนข้อผิดพลาดไวยากรณ์ XML บ่อยครั้งเช่น AAPT/AAPT2 ตัวอย่างเช่นคุณได้รับอนุญาตให้ตั้งค่าที่ผิดในบางสถานที่และไม่ป้องกันการสร้างที่ประสบความสำเร็จ บน AndroidManifest.xml คุณสามารถตั้งค่า package="Wrong ? (package) name!" จากนั้นคุณต้องรู้ว่าค่าดังกล่าวเป็นที่ยอมรับโดยอุปกรณ์ Android
ตรวจสอบเครื่องมือนี้ที่พัฒนาขึ้นโดยใช้ไลบรารีนี้ https://github.com/reandroid/apkeditor
repositories {
mavenCentral()
}
dependencies {
implementation( " io.github.reandroid:ARSCLib:+ " )
} dependencies {
implementation(files( " $r ootProject . projectDir /libs/ARSCLib.jar " ))
} git clone https://github.com/REAndroid/ARSCLib.git
cd ARSCLib
./gradlew jar
# Built jar will be placed ./build/libs/ARSCLib-x.x.x.jar Java example import com . reandroid . apk . AndroidFrameworks ;
import com . reandroid . apk . ApkModule ;
import com . reandroid . apk . FrameworkApk ;
import com . reandroid . archive . ByteInputSource ;
import com . reandroid . arsc . chunk . PackageBlock ;
import com . reandroid . arsc . chunk . TableBlock ;
import com . reandroid . arsc . chunk . xml . AndroidManifestBlock ;
import com . reandroid . arsc . chunk . xml . ResXmlAttribute ;
import com . reandroid . arsc . chunk . xml . ResXmlElement ;
import com . reandroid . arsc . coder . EncodeResult ;
import com . reandroid . arsc . coder . ValueCoder ;
import com . reandroid . arsc . value . Entry ;
import java . io . File ;
import java . io . IOException ;
public class ARSCLibExample {
public static void createNewApk () throws IOException {
ApkModule apkModule = new ApkModule ();
TableBlock tableBlock = new TableBlock ();
AndroidManifestBlock manifest = new AndroidManifestBlock ();
apkModule . setTableBlock ( tableBlock );
apkModule . setManifest ( manifest );
FrameworkApk framework = apkModule . initializeAndroidFramework (
AndroidFrameworks . getLatest (). getVersionCode ());
PackageBlock packageBlock = tableBlock . newPackage ( 0x7f , "com.example" );
Entry appIcon = packageBlock . getOrCreate ( "" , "drawable" , "ic_launcher" );
EncodeResult color = ValueCoder . encode ( "#006400" );
appIcon . setValueAsRaw ( color . valueType , color . value );
Entry appNameDefault = packageBlock . getOrCreate ( "" , "string" , "app_name" );
appNameDefault . setValueAsString ( "My Application" );
Entry appNameDe = packageBlock . getOrCreate ( "-de" , "string" , "app_name" );
appNameDe . setValueAsString ( "Meine Bewerbung" );
Entry appNameRu = packageBlock . getOrCreate ( "-ru-rRU" , "string" , "app_name" );
appNameRu . setValueAsString ( "Мое заявление" );
manifest . setPackageName ( "com.example" );
manifest . setVersionCode ( 100 );
manifest . setVersionName ( "1.0.0" );
manifest . setIconResourceId ( appIcon . getResourceId ());
manifest . setCompileSdkVersion ( framework . getVersionCode ());
manifest . setCompileSdkVersionCodename ( framework . getVersionName ());
manifest . setPlatformBuildVersionCode ( framework . getVersionCode ());
manifest . setPlatformBuildVersionName ( framework . getVersionName ());
manifest . addUsesPermission ( "android.permission.INTERNET" );
manifest . addUsesPermission ( "android.permission.READ_EXTERNAL_STORAGE" );
//all appName entries created above have the same resource ids
manifest . setApplicationLabel ( appNameDefault . getResourceId ());
ResXmlElement mainActivity = manifest . getOrCreateMainActivity ( "android.app.Activity" );
ResXmlAttribute labelAttribute = mainActivity
. getOrCreateAndroidAttribute ( AndroidManifestBlock . NAME_label , AndroidManifestBlock . ID_label );
labelAttribute . setValueAsString ( "Hello World" );
//Android os requires at least one dex file on base apk
ByteInputSource dummyDex = new ByteInputSource ( new byte [ 0 ], "classes.dex" );
apkModule . add ( dummyDex );
File outFile = new File ( "test_out.apk" );
apkModule . writeApk ( outFile );
//Sign and install
}
}